分享

Hadoop 2.x(YARN)安装配置LZO

pig2 2014-3-20 20:34:34 发表于 安装配置 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 24463
1.什么是LZO?
2.配置LZO需要修改那些配置文件及环境变量?
3.mapred-site中设置mapred.child.env的​LD_LIBRARY_PATH很重要为什么?


没找到任何评论,期待你打破沉寂

pig2 发表于 2014-3-20 20:39:30
本帖最后由 pig2 于 2014-3-20 22:20 编辑
首先我们需要什么是LZO?

LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。

1. 安装LZO

下载lzo 2.06版本,编译64位版本,同步到集群中
  1. wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz  
  2. export CFLAGS=-m64  
  3. ./configure -enable-shared -prefix=/usr/local/hadoop/lzo/  
  4. make && make test && make install  
复制代码
同步/usr/local/hadoop/lzo/到整个集群上

2. 安装Hadoop-LZO

注意,Hadoop 1.x的时候我们是直接按照cloudera的文档clone https://github.com/kevinweil/hadoop-lzo.git上编译的,它是fork自https://github.com/twitter/hadoop-lzo
但是kevinweil这个版本已经很久没有更新了,而且它是基于Hadoop 1.x去编译的,不能用于Hadoop 2.x。而twitter/hadoop-lzo三个月将Ant的编译方式切换为Maven,默认的dependency中Hadoop jar包就是2.x的,所以要clone twitter的hadoop-lzo,用Maven编译jar包和native library。
编译前先想pom中的hadoop-common和hadoop-mapreduce-client-core版本号改成2.1.0-beta
  1. git clone https://github.com/twitter/hadoop-lzo.git​  
  2. export CFLAGS=-m64  
  3. export CXXFLAGS=-m64  
  4. export C_INCLUDE_PATH=/usr/local/hadoop/lzo/include  
  5. export LIBRARY_PATH=/usr/local/hadoop/lzo/lib  
  6. mvn clean package -Dmaven.test.skip=true  
  7. tar -cBf - -C target/native/Linux-amd64-64/lib . | tar -xBvf - -C /usr/local/hadoop/hadoop-2.1.0-beta/lib/native/   
  8. cp target/hadoop-lzo-0.4.18-SNAPSHOT.jar /usr/local/hadoop/hadoop-2.1.0-beta/share/hadoop/common/  
复制代码
lib/native下的文件,包含native libraries和native compression
  1. -rw-r--r-- 1 hadoop hadoop  104206 Sep  2 10:44 libgplcompression.a  
  2. -rw-rw-r-- 1 hadoop hadoop    1121 Sep  2 10:44 libgplcompression.la  
  3. lrwxrwxrwx 1 hadoop hadoop      26 Sep  2 10:47 libgplcompression.so -> libgplcompression.so.0.0.0  
  4. lrwxrwxrwx 1 hadoop hadoop      26 Sep  2 10:47 libgplcompression.so.0 -> libgplcompression.so.0.0.0  
  5. -rwxrwxr-x 1 hadoop hadoop   67833 Sep  2 10:44 libgplcompression.so.0.0.0  
  6. -rw-rw-r-- 1 hadoop hadoop  835968 Aug 29 17:12 libhadoop.a  
  7. -rw-rw-r-- 1 hadoop hadoop 1482132 Aug 29 17:12 libhadooppipes.a  
  8. lrwxrwxrwx 1 hadoop hadoop      18 Aug 29 17:12 libhadoop.so -> libhadoop.so.1.0.0  
  9. -rwxrwxr-x 1 hadoop hadoop  465801 Aug 29 17:12 libhadoop.so.1.0.0  
  10. -rw-rw-r-- 1 hadoop hadoop  580384 Aug 29 17:12 libhadooputils.a  
  11. -rw-rw-r-- 1 hadoop hadoop  273642 Aug 29 17:12 libhdfs.a  
  12. lrwxrwxrwx 1 hadoop hadoop      16 Aug 29 17:12 libhdfs.so -> libhdfs.so.0.0.0  
  13. -rwxrwxr-x 1 hadoop hadoop  181171 Aug 29 17:12 libhdfs.so.0.0.0  
复制代码
将hadoop-lzo-0.4.18-SNAPSHOT.jar和/usr/local/hadoop/hadoop-2.1.0-beta/lib/native/
同步到整个集群中


3. 设置环境变量
在hadoop-env.sh中加入
  1. export LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib  
复制代码
core-site加入
  1. <property>  
  2.     <name>io.compression.codecs</name>  <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.BZip2Codec</value>  
  3. </property>  
  4. <property>  
  5.     <name>io.compression.codec.lzo.class</name>  
  6.     <value>com.hadoop.compression.lzo.LzoCodec</value>  
  7. </property>  
复制代码
mapred-site.xml加入
  1. <property>  
  2.     <name>mapred.compress.map.output</name>  
  3.     <value>true</value>  
  4. </property>  
  5. <property>  
  6.     <name>mapred.map.output.compression.codec</name>  
  7.     <value>com.hadoop.compression.lzo.LzoCodec</value>  
  8. </property>  
  9. <property>  
  10.     <name>mapred.child.env</name>  
  11.     <value>LD_LIBRARY_PATH=/usr/local/hadoop/lzo/lib</value>  
  12. </property>  
复制代码
其中mapred-site中设置mapred.child.env的&#8203;LD_LIBRARY_PATH很重要,因为hadoop-lzo通过JNI调用(java.library.path)&#8203;libgplcompression.so,然后libgplcompression.so&#8203;再通过dlopen这个系统调用(其实是查找系统环境变量LD_LIBRARY_PATH&#8203;)来加载liblzo2.so&#8203;。container在启动的时候,需要设置LD_LIBRARY_PATH&#8203;环境变量,来让LzoCodec加载&#8203;native-lzo library,如果不设置的话,会在container的syslog中报下面的错误&#8203;&#8203;
  1. 2013-09-02 11:20:12,004 INFO [main] com.hadoop.compression.lzo.GPLNativeCodeLoader: Loaded native gpl library  
  2. 2013-09-02 11:20:12,006 WARN [main] com.hadoop.compression.lzo.LzoCompressor: java.lang.UnsatisfiedLinkError: Cannot load liblzo2.so.2 (liblzo2.so.2: cannot open shared object file: No such file or directory)!  
  3. 2013-09-02 11:20:12,006 ERROR [main] com.hadoop.compression.lzo.LzoCodec: Failed to load/initialize native-lzo library  
复制代码
同步hadoop-env.sh, core-site.xml, mapred-site.xml到集群&#8203;

LzoCodec加载gplcompression和lzo native library
  1. static {  
  2.   if (GPLNativeCodeLoader.isNativeCodeLoaded()) {  
  3.     nativeLzoLoaded = LzoCompressor.isNativeLzoLoaded() &&  
  4.     LzoDecompressor.isNativeLzoLoaded();  
  5.   
  6.     if (nativeLzoLoaded) {  
  7.       LOG.info("Successfully loaded & initialized native-lzo library [hadoop-lzo rev " + getRevisionHash() + "]");  
  8.     } else {  
  9.       LOG.error("Failed to load/initialize native-lzo library");  
  10.     }  
  11.   } else {  
  12.     LOG.error("Cannot load native-lzo without native-hadoop");  
  13.   }  
  14. }  
复制代码
LzoCompressor和LzoDecompressor会调用本地方法initIDs
在impl/lzo/LzoCompressor.c中加载liblzo2.so
  1. Java_com_hadoop_compression_lzo_LzoCompressor_initIDs(  
  2.   JNIEnv *env, jclass class  
  3.   ) {  
  4.   // Load liblzo2.so  
  5.   liblzo2 = dlopen(HADOOP_LZO_LIBRARY, RTLD_LAZY | RTLD_GLOBAL);  
  6.   if (!liblzo2) {  
  7.     char* msg = (char*)malloc(1000);  
  8.     snprintf(msg, 1000, "%s (%s)!", "Cannot load " HADOOP_LZO_LIBRARY, dlerror());  
  9.     THROW(env, "java/lang/UnsatisfiedLinkError", msg);  
  10.     return;  
  11.   }  
  12.   
  13.   LzoCompressor_clazz = (*env)->GetStaticFieldID(env, class, "clazz",  
  14.                                                  "Ljava/lang/Class;");  
  15.   LzoCompressor_finish = (*env)->GetFieldID(env, class, "finish", "Z");  
  16.   LzoCompressor_finished = (*env)->GetFieldID(env, class, "finished", "Z");  
  17.   LzoCompressor_uncompressedDirectBuf = (*env)->GetFieldID(env, class,  
  18.                                                     "uncompressedDirectBuf",  
  19.                                                     "Ljava/nio/ByteBuffer;");  
  20.   LzoCompressor_uncompressedDirectBufLen = (*env)->GetFieldID(env, class,  
  21.                                             "uncompressedDirectBufLen", "I");  
  22.   LzoCompressor_compressedDirectBuf = (*env)->GetFieldID(env, class,  
  23.                                                         "compressedDirectBuf",  
  24.                                                         "Ljava/nio/ByteBuffer;");  
  25.   LzoCompressor_directBufferSize = (*env)->GetFieldID(env, class,  
  26.                                             "directBufferSize", "I");  
  27.   LzoCompressor_lzoCompressor = (*env)->GetFieldID(env, class,  
  28.                                           "lzoCompressor", "J");  
  29.   LzoCompressor_lzoCompressionLevel = (*env)->GetFieldID(env, class,  
  30.                                                 "lzoCompressionLevel", "I");  
  31.   LzoCompressor_workingMemoryBufLen = (*env)->GetFieldID(env, class,  
  32.                                                 "workingMemoryBufLen", "I");  
  33.   LzoCompressor_workingMemoryBuf = (*env)->GetFieldID(env, class,  
  34.                                               "workingMemoryBuf",  
  35.                                               "Ljava/nio/ByteBuffer;");  
  36.   
  37.   // record lzo library version  
  38.   void* lzo_version_ptr = NULL;  
  39.   LOAD_DYNAMIC_SYMBOL(lzo_version_ptr, env, liblzo2, "lzo_version");  
  40.   liblzo2_version = (NULL == lzo_version_ptr) ? 0  
  41.     : (jint) ((unsigned (__LZO_CDECL *)())lzo_version_ptr)();  
  42. }  
复制代码
创建container上下文信息的时候,会读取mapred.child.env作为子进程环境变量的一部分
1.jpg

2.jpg


4. 测试mapreduce读lzo

hive新建一张表lzo_test
  1. CREATE TABLE lzo_test(  
  2. col String  
  3. )  
  4. STORED AS INPUTFORMAT "com.hadoop.mapred.DeprecatedLzoTextInputFormat"  
  5. OUTPUTFORMAT "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat";  
复制代码
下载lzop工具,load一个lzo文件进lzo_test表中,执行“select * from lzo_test"和"select count(1) from lzo_test"正确&#8203;

同时用户可以通过单机作业或者分布式程序生成lzo.index文件
  1. hadoop jar /usr/local/hadoop/hadoop-2.1.0-beta/share/hadoop/common/hadoop-lzo-0.4.18-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer /user/hive/warehouse/lzo_test/  
  2. hadoop jar /usr/local/hadoop/hadoop-2.1.0-beta/share/hadoop/common/hadoop-lzo-0.4.18-SNAPSHOT.jar com.hadoop.compression.lzo.LzoIndexer /user/hive/warehouse/lzo_test/  
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条