windows做网站的工具,网站升级对外解决方案,保定软件开发公司,alinks wordpress1.说明
为了解决#xff0c;数据日益增长并且目前使用Snappy压缩导致的Spark读取时会出现OOM#xff0c;并且处理起来速度过慢的问题#xff0c;决定使用LZOIndex来解决问题。
线上Hadoop版本3.2.1#xff0c;Spark2.3.1#xff0c;Lzo使用最新版0.4.21
2.未解决的问题…1.说明
为了解决数据日益增长并且目前使用Snappy压缩导致的Spark读取时会出现OOM并且处理起来速度过慢的问题决定使用LZOIndex来解决问题。
线上Hadoop版本3.2.1Spark2.3.1Lzo使用最新版0.4.21
2.未解决的问题
但是还有个疑问我们使用spark写入到hdfs上的lzo文件该如何更好的生成索引文件 目前能想到的就是在提交spark任务的脚本中spark任务后面加上生成索引文件的命令想知道还有没有什么更好的方法解决最好是能有在spark程序里直接生成索引文件。
2.安装lzop
sudo yum -y install lzop3.下载编译安装LZO
下载地址
http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz下载好后在linux下进行编译
tar -zxvf lzo-2.10.tar.gzcd lzo-2.10export CFLAGS-m64./configure -enable-sharedmakesudo 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.104. 安装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 mavenmvn clean package -Dmaven.test.skiptrue在当前目录下生成了 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相关配置
propertynameio.compression.codecs/namevalueorg.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/value
/property
propertynameio.compression.codec.lzo.class/namevaluecom.hadoop.compression.lzo.LzoCodec/value
/property4.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: ibiblio nametwttr.com m2compatibletrue roothttps://maven.twttr.com//And include hadoop-lzo as a dependency: dependency orgcom.hadoop.gplcompression namehadoop-lzo rev0.4.17/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 -DgroupIdcom.hadoop.gplcompression -DartifactIdhadoop-lzo -Dversion0.4.21 -Dpackagingjar -Dfilehadoop-lzo-0.4.21.jar显示build success就是成功然后就可以愉快的使用了
1.pom.xml中加入
dependencygroupIdcom.hadoop.gplcompression/groupIdartifactIdhadoop-lzo/artifactIdversion0.4.21/version
/dependency2.生成索引文件 读取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.lzo3.使用读取/写入
// 要使用的是com.hadoop包下的类
import com.hadoop.compression.lzo.LzopCodec;
import com.hadoop.mapreduce.LzoTextInputFormat;
// 读取LZO文件
org.apache.hadoop.conf.Configuration configuration new Configuration();
JavaPairRDDLongWritable, Text pairRDD sc.newAPIHadoopFile(readLzoFileName,LzoTextInputFormat.class,LongWritable.class,Text.class,configuration);//存储LZO格式,我们使用的是Lzoplzo和lzop区别可以自行了解下
rdd.saveAsTextFile(fullName,LzopCodec.class);读取lzo文件后的JavaPairRDD的key是每个块开头的 offsetvalue 为原始文件的每一行我们直接使用value就可以。
6 后续要将CDH集群也做一个LZO压缩的配置