10,hadoop优化与LZO压缩

hadoop多目录与LZO压缩

1.HDFS存储多目录

存储多目录: namenode, datanode

namenode: 可以在当前节点中创建几个 namenode的多目录, 就是 虽说可以是多个目录,但是这个namenode多目录中,内容都是一样, 就相当把namenode, 多份保证他高可靠, 但是这个没有必要,因为namenode,由于是单节点,为防止单节点的风险,往往会与zookeeper配置建立,namenode集群, 只有一个namenode(leader)工作,其他namenode默默将(leader)同步过来。以防止 namenode挂了,及时顶替。

datanode: 会使用多目录, 因为这个多目录中存储的内容不一样。 并且dataNode中的数据量往往都很大。 并且存储在不同的磁盘上。所以就需要将这些磁盘和datanode的存储目录关联起来。 这种关联,我们称之为挂载。就是创建目录, 把某块磁盘挂载到这个目录上。(就相当于windows中,我们创建快捷方式)

1.namenode的本地目录可以配置多个,每个目录相同,增加可靠性在hdfs-site.xml文件中增加

<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,
    file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>

2配置之前,一定要先停止集群,在删除原来的数据,再格式化

!!!格式化生成目录与之前的目录不冲突即可!!

# stop-yarn.sh 
# stop-dfs.sh

# rm -rf data/ logs/
# rm -rf data/ logs/
#  rm -rf data/ logs/

# hdfs namenode -format
启动NN出现data/
# rm -rf data/

删除原先的存储路径设置
增加hdfs-site.xm

<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>

分发一下
hdfs-site.xml


注意:每台服务器挂载的磁盘不一样,所以每个节点的多目录配置可以不一致。单独配置即可。

2集群数据均衡

1)节点间数据均衡

start-balancer.sh -threshold 10

​ 对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。停止数据均衡命令:

stop-balancer.sh

2)磁盘间数据均衡

(1)生成均衡计划(我们只有一块磁盘,不会生成计划

(2)执行均衡计划

(3)查看当前均衡任务的执行情况

(4)取消均衡任务

hdfs diskbalancer -plan node3

hdfs diskbalancer -execute node3.plan.json

hdfs diskbalancer -query node3

hdfs diskbalancer -cancel node3.plan.json

3 LZO 压缩配置

1)hadoop 本身并不支持 lzo 压缩,故需要使用 twitter 提供的 hadoop-lzo 开源组件。hadoop-lzo需依赖 hadoop 和 lzo 进行编译,编译步骤如下。

2)将编译好后的 hadoop-lzo-0.4.20.jar 放入

[itwise@node2 ~]$ cd /opt/module/hadoop3.1.3/share/hadoop/common/

3)同步 hadoop-lzo-0.4.20.jar 到 node3、node4

[itwise@node2 common]$ xsync hadoop-lzo-0.4.20.jar

4)core-site.xml 增加配置支持 LZO 压缩

cd /opt/module/hadoop-3.1.3/etc/hadoop/
[itwise@node2 hadoop]$vim core-site.xml

配置如下:

<configuration>
<property>
<name>io.compression.codecs</name>
<value>
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
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
</configuration>

5)同步 core-site.xml 到 node3、node4

[itwise@node2 hadoop]$ my_rsync.sh core-site.xml

6)启动及查看集群

[itwise@node2 hadoop-3.1.3]$ sbin/start-dfs.sh
[itwise@node3 hadoop-3.1.3]$ sbin/start-yarn.sh

LZO 创建索引

创建 LZO 文件的索引,LZO 压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO 压缩文件创建索引。若无索引,则 LZO 文件的切片只有一个。

测试

(1)将 bigtable.lzo(200M)上传到集群的根目录

[itwise@node2 module]$ hadoop fs -mkdir /input
[itwise@node2 module]$ hadoop fs -put bigtable.lzo /input
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce example-3.1.3.jar wordcount /input /output-lzo

并没有进行压缩,而仅仅是普通的MR程序,将统计结果输出到output-lzo

(2)执行 wordcount 程序并压缩,我们找一个大文件:bigtable.lzo,直接上传到 input目录中我们找一个大文件:bigtable.lzo,直接上传到 input目录中

mapreduce.output.fileoutputformat.compress 文件输出格式
mapreduce.output.fileoutputformat.compress.codec 文件输出的压缩方式
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduceexamples-3.1.3.jar wordcount -Dmapreduce.output.fileoutputformat.compress=true -
Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.Lzo
pCodec /input /lzo-output

在这里插入图片描述

可以看到文件压缩是成功了,没有问题, 但是这个文件比较大 超过214.16M>128M, 应该进行分块,但是其实,是否对数据进行分块,这个需要索引配置:

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -Dmapreduce.output.fileoutputfotmat.compress = true -Dmapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.1zo.Lzopcodec/input /1zo-output

在这里插入图片描述

(3)对上传的 LZO 文件建索引

[itwise@node2 ]$ hadoop jar/opt/module/hadoop3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer/input/bigtable.lzo

(4)创建LZO文件的索引,LZO压缩文件的可切片特性依赖于其索引,故我们需要手动为LZO压缩文件创建索引。若无索引,则LZO文件的切片只有一个。创建一个目录 lzo-input,把测试的数据上传到这个目录中。再次执行 WordCount 程序

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar
com.hadoop.compression.lzo.DistributedLzoIndexer /lzo-input/bigtable.lzo
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduceexamples-3.1.3.jar wordcount -
Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoTextInputFormat /lzo-input /lzo-output
[itwise@node2 module]$ hadoop jar/opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 
wordcount -Dmapreduce.job.inputformat.class=com.hadoop.mapreduce.LzoText InputFormat /input /output2

注意:如果以上任务,在运行过程中报如下异常

Container [pid=8468,containerID=container_1594198338753_0001_01_000002] is running 318740992B beyond the 'VIRTUAL' memory limit. Current usage: 111.5 MB of 1 GB physical memory used; 2.4 GB of 2.1 GB virtual memory used. Killing container.

Dump of the process-tree for container_1594198338753_0001_01_000002 :

解决办法:在node2的/opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml文件中增加如下配置,然后分发到node3、node4服务器上,并重新启动集群

<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是
true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是
true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>:

4.基准测试

1) 测试HDFS写性能:注意写入6个文件,只能读取6个

测试内容:向HDFS集群写6个128M的文件

[itwise@node2 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -write -nrFiles 6 -fileSize 128MB

在这里插入图片描述

2)测试HDFS读性能

测试内容:读取HDFS集群6个128M的文件

[itwise@node2 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -read -nrFiles 6 -fileSize 128MB

在这里插入图片描述

错误读取:例题是10个文件,但是自己写入的是6个
在这里插入图片描述

3)删除测试生成数据

[itwise@node2 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO -clean

在这里插入图片描述

4)使用Sort程序评测MapReduce(自己电脑未测试)

(1)使用RandomWriter来产生随机数,每个节点运行10个Map任务,每个Map产生大约1G大小的二

进制随机数

[itwise@node2 mapreduce]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar randomwriter random-data

(2)执行Sort程序

[itwise@node2 mapreduce]$ hadoop jar /opt/module/hadoop-
3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar sort random data sorted-data

(3)验证数据是否真正排好序了

[itwise@node2 mapreduce]$ hadoop jar /opt/module/hadoop-
3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar testmapredsort -sortInput random-data -sortOutput sorted-data

Hadoop参数调优

1)HDFS参数调优hdfs-site.xml

The number of Namenode RPC server threads that listen to requests from clients.If dfs.namenode.servicerpc-address is not configured then Namenode RPC server threads listen to requests from all nodes.

NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。
对于大集群或者有大量客户端的集群来说,通常需要增大参数dfs.namenode.handler.count的默认值10。
<property>
<name>dfs.namenode.handler.count</name>
<value>10</value>
</property>

在这里插入图片描述

[itwise@node2 ~]$ python
#Python 2.7.5 (default, Apr 11 2018, 07:36:10)
#[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on 
#linux2 Type "help", "copyright", "credits" or "license" for more information.
#导入包
>>> import math
#输出到控制台
>>> print int(20*math.log(8))
41
>>> print int(20*math.log(10))
46

退出
>>>quit()

2)YARN参数调优yarn-site.xml

(1)情景描述:总共7台机器,每天几亿条数据,数据源->Flume->Kafka->HDFS->Hive

面临问题:数据统计主要用HiveSQL,没有数据倾斜,小文件已经做了合并处理,开启的JVM重用,而且IO没有阻塞,内存用了不到50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。

(2)解决办法:

内存利用率不够。这个一般是Yarn的2个配置造成的,单个任务可以申请的最大内存大小,和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。

(a)yarn.nodemanager.resource.memory-mb

表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。

(b)yarn.scheduler.maximum-allocation-mb

单个任务可申请的最多物理内存量,默认是8192(MB)。
用了不到50%。但是还是跑的非常慢,而且数据量洪峰过来时,整个集群都会宕掉。基于这种情况有没有优化方案。

(2)解决办法:

内存利用率不够。这个一般是Yarn的2个配置造成的,单个任务可以申请的最大内存大小,和Hadoop单个节点可用内存大小。调节这两个参数能提高系统内存的利用率。

(a)yarn.nodemanager.resource.memory-mb

表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。

(b)yarn.scheduler.maximum-allocation-mb

单个任务可申请的最多物理内存量,默认是8192(MB)。

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安装LZS库和HadoopLZO压缩算法库可以按照以下步骤进行: 1. 下载LZS库和HadoopLZO压缩算法库。 可以从以下网址下载对应版本的LZS库和HadoopLZO压缩算法库: - LZS库:http://www.lzsupdates.com/download/lzs-1.6.tar.gz - HadoopLZO压缩算法库:https://github.com/ning/jvm-compressor-snappy/releases/download/v0.1.0-native-hadoop1.0.4.1/libhadoop-gpl-compression-0.1.0-native-1.0.4.1.jar 2. 安装LZS库。 解压下载的LZS库文件,并按照以下步骤进行安装: ```bash tar -zxvf lzs-1.6.tar.gz cd lzs-1.6 ./configure make make install ``` 安装完成后,可以使用以下命令检查是否安装成功: ```bash lzs --version ``` 3. 安装HadoopLZO压缩算法库。 将下载的`libhadoop-gpl-compression-0.1.0-native-1.0.4.1.jar`文件复制到Hadoop的`lib`目录下: ```bash cp libhadoop-gpl-compression-0.1.0-native-1.0.4.1.jar $HADOOP_HOME/lib/ ``` 然后,需要在Hadoop的配置文件中添加以下配置: ``` io.compression.codecs org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec,com.hadoop.compression.lzo.LzoCodec io.compression.codec.lzo com.hadoop.compression.lzo.LzoCodec ``` 配置完成后,重启Hadoop集群,以确保配置生效。 注意:如果您使用的是CDH、HDP等Hadoop发行版,则可以跳过以上步骤,因为这些发行版已经默认包含了LZO压缩算法库。 安装完成后,您就可以在Java的Spark程序中使用LZS压缩算法了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值