栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 前沿技术 > 大数据 > 大数据系统

HDFS和Spark配置LZO压缩,使Spark可以读取LZO并可以切片

大数据系统 更新时间:发布时间: 百科书网 趣学号
1.说明

为了解决,下数据日益增长并且目前使用Snappy压缩导致的Spark读取时会出现OOM,并且处理起来速度过慢的问题,决定使用LZO+Index来解决问题。

线上Hadoop版本3.2.1,Spark2.3.1,Lzo使用最新版0.4.21

2.安装lzop
sudo yum -y install lzop
3.下载编译安装LZO

下载地址

http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz

下载好后在linux下进行编译

tar -zxvf lzo-2.10.tar.gz

cd lzo-2.10

export CFLAGS=-m64

./configure -enable-shared

make

sudo make install

编译完成后,编辑lzo.conf文件

sudo vim /etc/ld.so.conf.d/lzo.conf

在里面写入:

/usr/local/lib

然后要让 lzo.conf 生效

sudo /sbin/ldconfig -v 

lzo-2.10文件以及没有用了,可以进行删除

rm -rf lzo-2.10
4. 安装hadoop-lzo 4.1下载安装 hadoop-lzo-master
https://github.com/twitter/hadoop-lzo


在linux下解压后进入hadoop-lzo-master 目录,然后使用 maven 获取 jar 文件以及 lib 目录中的的.so文件。

l执行命令如下:

export CFLAGS=-m64
export CXXFLAGS=-m64
export C_INCLUDE_PATH=/usr/local/include/lzo
export LIBRARY_PATH=/usr/local/lib
#有maven就不用下载了
sudo yum install maven

mvn clean package -Dmaven.test.skip=true

在当前目录下生成了 target,下面有个 native/Linux-amd64-64/lib 目录,将 lib 目录下的文件拷贝到 hadoop 的 lib/native 目录下(hadoop 目录根据自己情况修改):

cp target/native/Linux-amd64-64/lib/* $HADOOP_HOME/lib/native/

将target下的hadoop-lzo三个文件拷贝到 share/hadoop/common/lib 下

cp hadoop-lzo-0.4.21-SNAPSHOT*.jar $HADOOP_HOME/share/hadoop/common/lib/
4.2.修改Hadoop配置

在hadoop的core-site.xml文件中增加如下lzo相关配置:


	io.compression.codecs
	org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec


	io.compression.codec.lzo.class
	com.hadoop.compression.lzo.LzoCodec

4.3.分发、重启hadoop

将hadoop下新加入的so文件、jar包,还有修改的core-site.xml分发给集群其他节点

然后重启集群即可。

5.Spark下启用LZO

完成上面linux下的lzo和hadoop的lzo后就可以配置spark下的lzo了。

5.1 修改配置文件

修改spark配置文件spark-defaults.conf

vim spark-defaults.conf

#增加如下配置,$HADOOP_HOME可以改为自己的hadoop路径
#配置的文件就是上面我们mvn打的jar包,路径是hadoop下因为我们放在了hadoop目前下
spark.driver.extraClassPath $HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar
spark.executor.extraClassPath $HADOOP_HOME/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar

修改spark-env.sh

vim spark-env.sh

#增加如下配置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native
export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:$HADOOP_HOME/lib/native
export SPARK_CLASSPATH=$SPARK_CLASSPATH:$HADOOP_HOME/share/hadoop/yarn/*:$HADOOP_HOME/share/hadoop/yarn/lib/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/hdfs/lib/*:$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*:$HADOOP_HOME/share/hadoop/tools/lib/*:$SPARK_HOME/jars/*
5.2 分发重启Spark 5.3 Spark程序LZO配置

我们在读取和存储LZO压缩的时候是需要使用到上面所打完的包hadoop-lzo-0.4.21-SNAPSHOT.jar的,因为我们是内网所以将他打成了Maven依赖再使用

5.4 导入Maven依赖

1.官网给出的方式:

Maven repository:
The hadoop-lzo package is available at https://maven.twttr.com/.
For example, if you are using ivy, add the repository in ivysettings.xml:

 

And include hadoop-lzo as a dependency:

 

2.我们使用的方式:
将hadoop-lzo-0.4.21-SNAPSHOT.jar拿到本地将文件名修改为hadoop-lzo-0.4.21.jar,
在当前目录的cmd中执行如下命令,将他加入到maven本地库

# 在hadoop-lzo-0.4.21-SNAPSHOT.jar所在目录打开cmd,执行
mvn install:install-file -DgroupId=com.hadoop.gplcompression -DartifactId=hadoop-lzo -Dversion=0.4.21 -Dpackaging=jar -Dfile=hadoop-lzo-0.4.21.jar

显示build success就是成功,然后就可以愉快的使用了

1.pom.xml中加入


	com.hadoop.gplcompression
	hadoop-lzo
	0.4.21

2.生成索引文件
读取lzo文件的前提是,我们生成在lzo文件的基础上生成了index索引文件,要不然会导致无法切片:

# 生成索引文件,如果指定的是文件夹,则会将未生成索引的lzo文件全部生成索引
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.21-SNAPSHOT.jar com.hadoop.compression.lzo.DistributedLzoIndexer  hdfs://cluster1:8020/test/test.txt.lzo

3.使用,读取/写入

// 要使用的是com.hadoop包下的类
import com.hadoop.compression.lzo.LzopCodec;
import com.hadoop.mapreduce.LzoTextInputFormat;
// 读取LZO文件
org.apache.hadoop.conf.Configuration configuration = new Configuration();
JavaPairRDD pairRDD =
                sc.newAPIHadoopFile(readLzoFileName,
                        LzoTextInputFormat.class,
                        LongWritable.class,
                        Text.class,
                        configuration);

//存储LZO格式,我们使用的是Lzop,lzo和lzop区别可以自行了解下
rdd.saveAsTextFile("fullName",LzopCodec.class);

读取lzo文件后的JavaPairRDD的key是每个块开头的 offset,value 为原始文件的每一行,我们直接使用value就可以。

6 后续要将CDH集群也做一个LZO压缩的配置 7 参考博客

https://github.com/twitter/hadoop-lzo
https://zhuanlan.zhihu.com/p/371333492
https://blog.csdn.net/xiaoxiongaa0/article/details/90232990
https://blog.csdn.net/qq_39101581/article/details/79224515
https://blog.51cto.com/bigdata/2836953

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/743379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号