HDFS
—集群迁移
Apache
和
Apache
集群间数据拷贝
1
)
scp
实现两个远程主机之间的文件复制
scp -r hello.txt
root@hadoop103:/user/atguigu/hello.txt
//
推
push
scp -r
root@hadoop103:/user/atguigu/hello.txt hello.txt
//
拉
pull
scp -r
root@hadoop103:/user/atguigu/hello.txt
root@hadoop104:/user/atguigu //
是通过本
地主机中转实现两个远程主机的文件复制;如果在两个远程主机之间
ssh
没有配置的情况下
可以使用该方式。
2
)采用
distcp
命令实现两个
Hadoop
集群之间的递归数据复制
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hadoop
distcp
hdfs://hadoop102:8020/user/atguigu/hello.txt
hdfs://hadoop105:8020/user/atguigu/hello.txt
7.2 Apache
和
CDH
集群间数据拷贝
MapReduce
生产经验
MapReduce
跑的慢的原因
MapReduce
程序效率的瓶颈在于两点:
1
)计算机性能
CPU
、内存、磁盘、网络
2
)
I/O
操作优化
(
1
)数据倾斜
(2)
Map
运行时间太长,导致
Reduce
等待过久
(3)小文件过多
2 MapReduce
常用调优参数
map端优化
reduce端优化
MapReduce 数据倾斜问题
1
)数据倾斜现象
数据频率倾斜
——
某一个区域的数据量要远远大于其他区域。
数据大小倾斜
——
部分记录的大小远远大于平均值。
2
)减少数据倾斜的方法
(
1
)首先检查是否空值过多造成的数据倾斜
生产环境,可以直接过滤掉空值;如果想保留空值,就自定义分区,将空值加随机数打
散。最后再二次聚合。
(
2
)能在
map
阶段提前处理,最好先在
Map
阶段处理。如:
Combiner
、
MapJoin
(
3
)设置多个
reduce
个数
Hadoop-Yarn
生产经验
常用的调优参数
1
)调优参数列表
(
1
)
Resourcemanager
相关
(
1
)
Resourcemanager
相关
yarn.resourcemanager.scheduler.client.thread-count ResourceManager
处理调度
器请求的线程数量
yarn.resourcemanager.scheduler.class
配置调度器
(2)
Nodemanager
相关
yarn.nodemanager.resource.memory-mb
NodeManager
使用内存数
yarn.nodemanager.resource.system-reserved-memory-mb NodeManager
为系统保留
多少内存,和上一个参数二者取一即可
yarn.nodemanager.resource.cpu-vcores
NodeManager
使用
CPU
核数
yarn.nodemanager.resource.count-logical-processors-as-cores
是否将虚拟核
数当作
CPU
核数
yarn.nodemanager.resource.pcores-vcores-multiplier
虚拟核数和物理核数乘数,例
如:
4
核
8
线程,该参数就应设为
2
yarn.nodemanager.resource.detect-hardware-capabilities
是否让
yarn
自己检测硬
件进行配置
yarn.nodemanager.pmem-check-enabled
是否开启物理内存检查限制
container
yarn.nodemanager.vmem-check-enabled
是否开启虚拟内存检查限制
container
yarn.nodemanager.vmem-pmem-ratio
虚拟内存物理内存比例
(3)
Container
容器相关
yarn.scheduler.minimum-allocation-mb
容器最小内存
yarn.scheduler.maximum-allocation-mb
容器最大内存
yarn.scheduler.minimum-allocation-vcores
容器最小核数
yarn.scheduler.maximum-allocation-vcores
容器最大核数
Hadoop
综合调优
Hadoop
小文件优化方法
Hadoop
小文件弊端
HDFS
上每个文件都要在
NameNode
上创建对应的元数据,这个元数据的大小约为
150byte
,这样当小文件比较多的时候,就会产生很多的元数据文件,
一方面会大量占用
NameNode
的内存空间
,
另一方面就是元数据文件过多,使得寻址索引速度变慢。
小文件过多,在进行
MR
计算时,会生成过多切片,需要启动过多的
MapTask
。每个
MapTask
处理的数据量小,
导致
MapTask
的处理时间比启动时间还小,白白消耗资源。
1
)在数据采集的时候,就将小文件或小批数据合成大文件再上传
HDFS
(数据源头)
2
)
Hadoop Archive
(存储方向)
是一个高效的将小文件放入
HDFS
块中的文件存档工具,能够将多个小文件打包成一
个
HAR
文件,从而达到减少
NameNode
的内存使用
3
)
CombineTextInputFormat
(计算方向)
CombineTextInputFormat
用于将多个小文件在切片过程中生成一个单独的切片或者少
量的切片
4
)开启
uber
模式,实现
JVM
重用(计算方向)
默认情况下,每个
Task
任务都需要启动一个
JVM
来运行,如果
Task
任务计算的数据
量很小,我们可以让同一个
Job
的多个
Task
运行在一个
JVM
中,不必为每个
Task
都开启
一个
JVM
。
(
1
)未开启
uber
模式,在
/input
路径上上传多个小文件并执行
wordcount
程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar
wordcount /input /output2
(2)观察控制台
2021-02-14 16:13:50,607 INFO mapreduce.Job: Job job_1613281510851_0002
running in uber mode : false
(3)观察
(4)开启
uber
模式,在
mapred-site.xml
中添加如下配置
(5)分发配置
[atguigu@hadoop102 hadoop]$ xsync mapred-site.xml
(6)再次执行
wordcount
程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar
wordcount /input /output2
(7)观察控制台
2021-02-14 16:28:36,198 INFO mapreduce.Job: Job
job_1613281510851_0003
running in uber mode : true
(8)观察
测试
MapReduce
计算性能
使用
Sort
程序评测
MapReduce
(
1
)使用
RandomWriter
来产生随机数,每个节点运行
10
个
Map
任务,每个
Map
产
生大约
1G
大小的二进制随机数
[atguigu@hadoop102 mapreduce]$ hadoop jar /opt/module/hadoop-
3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-
3.1.3.jar randomwriter random-data
(2)执行
Sort
程序
[atguigu@hadoop102 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)验证数据是否真正排好序了
[atguigu@hadoop102 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
企业开发场景案例
需求
(
1
)需求:从
1G
数据中,统计每个单词出现次数。服务器
3
台,每台配置
4G
内存,
4
核
CPU
,
4
线程。
(2)需求分析:
1G / 128m = 8
个
MapTask
;
1
个
ReduceTask
;
1
个
mrAppMaster
平均每个节点运行
10
个
/ 3
台 ≈
3
个任务(4 3 3)
HDFS
参数调优
(
1
)修改:
hadoop-env.sh
(2)修改
hdfs-site.xml
<!--
NameNode
有一个工作线程池,默认值是
10
-->
<property>
<name>dfs.namenode.handler.count</name>
<value>
21
</value>
</property>
(3)修改
core-site.xml
<!--
配置垃圾回收时间为
60
分钟
-->
<property>
<name>fs.trash.interval</name>
<value>60</value>
</property>
(4)分发配置
[atguigu@hadoop102 hadoop]$ xsync hadoop-env.sh hdfs-site.xml
core-site.xml
MapReduce
参数调优
(
1
)修改
mapred-site.xml
(2)分发配置
[atguigu@hadoop102 hadoop]$ xsync mapred-site.xml
Yarn
参数调优
(
1
)修改
yarn-site.xml
配置参数如下:
(2)分发配置
[atguigu@hadoop102 hadoop]$ xsync yarn-site.xml
执行程序
(
1
)重启集群
[atguigu@hadoop102 hadoop-3.1.3]$ sbin/stop-yarn.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
(2)执行
WordCount
程序
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar
wordcount /input /output
(3)观察
Yarn
任务执行页面
http://hadoop103:8088/cluster/apps