Hadoop 三大组件调优


版本:
CentOS Linux release 7.3.1611 (Core)
Java 1.8.0
Hadoop-2.7.7

需求

 						企业开发场景案例
 需求
(1)需求:从 1G 数据中,统计每个单词出现次数。服务器3台,每台配置
    4G 内存,4 核 CPU,4 线程。
(2)需求分析:
   1G/128m = 8MapTask1ReduceTask1个mrAppMaster,平均
   每个节点运行10/3台≈3个任务(433
考核模块            考核知识点与技能点      系统说明
大数据平台管       题目一、平台运维与管理   建议使用 Xshell 连
理与运维(40%)         HDFS 调优;        接竞赛环境,本环
                     Yarn 调优;        境与题目二三无关
				     MapReduce 调优;	
                     集群权限管理;
                     开启集群;               

hadoop集群访问端口

50070 Hadoop集群访问端口

三大组件

HDFS (数据存储)

NameNode 存储文件的元数据,以及每个文件的块列表和,块所在的DataNode
DataNode 在本地文件系统存储文件块数据,以及块数据的校验和
Secondary NameNode 每隔-段时间对NameNode元数据备份

Yarn (资源调度)

ResourceManager   整个集群资源的老大
NodeManager       单个节点服务器资源大哥
ApplicationMaster 单个任务运行的大哥
Container         容器,相当一台独立的服务器,
                  里面封装了任务运行所需要的资源

MapReduce (计算)

Map    阶段并行处理输入数据
Reduce 阶段对Map结果进行汇总

Common (辅助工具)

NameNode 内存配置

NameNode 内存计算

8bit()=1Byte(字节)
1YB = 1024 ZB
YB > ZB > EB > PB > TB > GB > MB > KB > Byte 

Hadoop2.x 系列,配置 NameNode 内存

NameNode内存默认2000m,如果服务器内存4G,NameNode内存可以配置3G。在 hadoop-env.sh 文件中配置如下。
HADOOP_NAMENODE_OPTS=-Xmx3072m

NameNode 心跳并发配置

在这里插入图片描述

①hdfs-site.xml

hdfs-site.xml

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

在这里插入图片描述

[atguigu@hadoop102 ~]$ sudo yum install -y python
[atguigu@hadoop102 ~]$ 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(3))
21
>>> quit()

开启回收站配置

①作用

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。

②回收站工作机制

在这里插入图片描述

③开启回收站功能参数说明
  1. 默认值fs.trash.interval = 0 ,0表示禁用回收站; 其他值表示设置文件 的存活时间。
  2. 默认值fs.trash.checkpoint.interval = 0 ,检查回收站的间隔时间。如果该值为0 ,则该值设置和fs.trash.interval的参数值相等。
  3. 要求fs.trash.checkpoint.interval <= fs.trash.interval
④启用回收站

修改core-site.xml ,配置垃圾回收时间为1分钟。

<property>
    <name>fs.trash.interval</name>
    <value>1</value>
</property>
⑤查看回收站

回收站目录在HDFS集群中的路径:/user/atguigu/.Trash/....

⑥网页上删除文件

注意:通过网页上直接删除的文件也不会走回收站。

⑦通过程序删除文件

通过程序删除的文件也不会经过回收站 ,需要调用moveToTrash()才进入回收站

Trash trash = New Trash(conf);
trash.moveToTrash(path);
⑧hadoop fs -rm

只有在命令行利用hadoop fs -rm命令删除的文件才会走回收站。
hadoop fs -rm

⑨恢复回收站数据
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop fs -mv
/user/atguigu/.Trash/Current/user/atguigu/input
/user/atguigu/input

HDFS—集群压测

在企业中非常关心每天从Java后台拉取过来的数据,需要多久能上传到集群?消费者关心多久能从HDFS上拉取需要的数据?
为了搞清楚 HDFS 的读写性能,生产环境上非常需要对集群进行压测。
在这里插入图片描述

测速
HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试,
将 hadoop102、hadoop103、hadoop104 虚拟机网络都设置为100mbps。

100 Mbps 单位是bit;10MB/s 单位是byte; 
       1byte=8bit,100Mbps/8=12.5M/s。

在这里插入图片描述

测试网速:(注) 此命令是将当前目录文件暴露出去 虚拟机ip:8000可访问
[atguigu@hadoop102 software]$ python -m SimpleHTTPServer

测试HDFS写性能

写测试底层原理
在这里插入图片描述
-----------------------------------------------------------------------------------------


线
-----------------------------------------------------------------------------------------

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

注意:nrFiles n为生成mapTask的数量,生产环境一般可通过
     hadoop103:8088查看CPU核数,设置为(CPU核数-1

命令 hadoop jar /usr/hadoop/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.3-tests.jar TestDFSIO -write -nrFiles 2 -fileSize 128Mb

注:如果测试过程中,出现异常。

因CentOS7Java8的兼容性不好,导致yarn分配出的虚拟内存被大量闲置
so,解决方案为:关闭虚拟内存。
步骤:
①在yarn-site.xml中设置虚拟内存检测为false
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
     <name>yarn.nodemanager.vmem-check-enabled</name>
     <value>false</value>
</property>

②分发配置并重启Yarn集群
xsync yarn-site.xml
③重启Yarn
sbin/stop-yarn.sh
sbin/start-yarn.sh

参数详情

Number of files: 生成mapTask数量,一般是集群中(CPU核数-1),
                 我们测试虚拟机就按照实际的物理内存-1分配即可
Total MBytes processed: 单个map处理的文件大小
Throughput mb/sec: 单个mapTak的吞吐量
          计算方式: 处理的总文件大小/每一个mapTask写数据的时间累加
          集群整体吞吐量:生成mapTask数量*单个mapTak的吞吐量
Average IO rate mb/sec: 平均mapTak的吞吐量
          计算方式:每个mapTask处理文件大小/每一个mapTask写数据的时间
                  全部相加除以task数量
IO rate std deviation: 方差、反映各个mapTask处理的差值,越小越均衡
测试HDFS读性能

测试内容:读取HDFS集群2个128M的文件
hadoop jar /usr/hadoop/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.3-tests.jar TestDFSIO -read -nrFiles 2 -fileSize 128MB

删除测试生成数据
hadoop jar /usr/hadoop/hadoop-2.7.3/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.3-tests.jar TestDFSIO -clean

测试结果分析:为什么读取文件速度大于网络带宽?
由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。

HDFS – 多目录

NameNode多目录配置

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>

② 停止集群,删除三台节点的data和logs中所有数据。 (每个节点都得删)

[atguigu@hadoop102 hadoop-3.1.3]$ rm -rf data/ logs/
[atguigu@hadoop103 hadoop-3.1.3]$ rm -rf data/ logs/
[atguigu@hadoop104 hadoop-3.1.3]$ rm -rf data/ logs/

③ 格式化集群并启动。(master)

bin/hdfs namenode -format
sbin/start-dfs.sh
DataNode多目录配置

DataNode可以配置成多个目录,每个目录存储的数据不一样(数据不是副本)。

①在hdfs-site.xml文件中添加如下内容

<property>
     <name>dfs.datanode.data.dir</name>
     <value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>

②重启
sbin/stop-dfs.sh
sbin/start-dfs.sh

③查看结果
cd /usr/hadoop/hadoop-2.7.3/dfs
ll

④向集群上传一个文件,再次观察两个文件夹里面的内容
(应为一个有一个没有) 。
[root@master hadoop-2.7.3]# hadoop fs -put ./love.txt /

HDFS – 集群扩容及缩容

添加白名单

白名单:表示在白名单的主机IP地址可以,用来存储数据。
------------企业中,配置白名单,可以尽量防止黑客恶意访问攻击。

配置白名单步骤 :
① 在NameNode节点的 hadoop-3.1.3/etc/hadoop 目录下分别创建whitelistblacklist 文件

创建白名单

vim whitelist
添加内容:
slave1
slave2

创建黑名单
touch blacklist 保持空的就可以

② 在 hdfs-site.xml 配置文件中增加 dfs.hosts 配置参数

<!-- 白名单 -->
<property>
     <name>dfs.hosts</name>
     <value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>

<!-- 黑名单 -->
<property>
     <name>dfs.hosts.exclude</name>
     <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>

③ 分发配置文件 whitelist ,hdfs-site.xml
xsync hdfs-site.xml whitelist

④第一次添加白名单必须重启集群,不是第一次,只需要刷新 NameNode 节点即可 。
重启集群
myhadoop.sh stop
myhadoop.sh start

刷新节点 hdfs dfsadmin -refreshNodes

⑤在web浏览器上查看DN

http://hadoop102:9870/dfshealth.html#tab-datanode
服役新服务器

需求
随着公司业务的增长 ,数据量越来越大 ,原有的数据节点的容量已经不能满足存储数据的需求 ,需要在原有集群基础上动态添加新的数据节点。

环境准备

再克隆一台slave3主机

修改IP地址和主机名称
vim /etc/sysconfig/network-scripts/ifcfg-ens33
hostnamectl set-hostname slave3

拷贝slave1的/opt/module目录和/etc/profile.d/my_env.sh到 slave3

scp -r module/* root@slave3:/opt/module/

scp /etc/profile.d/my_env.sh root@slave3:/etc/profile.d/my_env.sh

source /etc/profile

删除slave3上Hadoop的历史数据 ,data和log数据
[root@slave3 hadoop-3.1.3]# rm -rf data/ logs/

配置master和slave1到slave3的ssh无密登录
[root@master .ssh]$ ssh-copy-id slave3
[root@slave1 .ssh]$ ssh-copy-id slave3

服役新节点具体步骤

直接启动DataNode,即可关联到集群
[root@slave3 hadoop-3.1.3]$ hdfs --daemon start datanode
[root@slave3 hadoop-3.1.3]$ yarn --daemon start nodemanager

在白名单中增加新服役的服务器
在白名单whitelist中增加slave2、slave3,并重启集群

cd /usr/hadoop/hadoop-2.7.3/etc/hadoop/
vim whitelist

slave1
slave2
slave3

分发(所有)

scp -r hadoop-3.1.3/etc/hadoop/whitelist root@slave3:/hadoop-3.1.3/etc/hadoop/

刷新NameNode
[root@master hadoop-3.1.3]# hdfs dfsadmin -refreshNodes Refresh nodes successful

在slave3上上传文件
[root@slave3 hadoop-3.1.3]# hadoop fs -put /opt/module/hadoop-3.1.3/LICENSE.txt /

如果数据不均衡(hadoop105数据少,其他节点数据多),怎么处理?

服务器间数据均衡

企业经验:
在企业开发中,如果经常在master和slave2上提交任务 ,且副本数为2 ,由于数据本地性原则,就会导致master和slave2数据过多,slave1存储的数据量小。
另一种情况,就是新服役的服务器数据量比较少,需要执行集群均衡命令。

开启数据均衡命令:[root@slave3 hadoop-3.1.3]# sbin/start-balancer.sh -threshold 10

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

停止数据均衡命令:[root@slave2 hadoop-3.1.3]# sbin/stop-balancer.sh

注意:由于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,
     所以尽量不要在NameNode上执行start-balancer.sh,而是找一台
     比较空闲的机器。
黑名单退役服务器

黑名单配置步骤如下:
编辑/opt/module/hadoop-3.1.3/etc/hadoop目录下的blacklist文件
[root@master hadoop] vim blacklist

# 添加如下主机名称(要退役的节点,以slave3为例)
slave3
注意:如果白名单中没有配置,需要在hdfs-site.xml配置文件中
	 增加dfs.hosts配置参数
	 
<!-- 黑名单 -->
<property>
     <name>dfs.hosts.exclude</name>
     <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>

分发配置文件blacklist ,hdfs-site.xml
[root@slave2 hadoop]$ xsync hdfs-site.xml blacklist

第一次添加黑名单必须重启集群 ,不是第一次 ,只需要刷新NameNode节点即可
root@master hadoop-3.1.3]# hdfs dfsadmin -refreshNodes Refresh nodes successful

等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。

注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
[root@slave3 hadoop-3.1.3]# hdfs --daemon stop datanode
[root@slave3 hadoop-3.1.3]# yarn --daemon stop nodemanager

如果数据不均衡,可以用命令实现集群的再平衡
[root@master hadoop-3.1.3]# sbin/start-balancer.sh -threshold 10

HDFS – 存储优化

MapReduce参数调优

修改mapred-site.xml

<!-- 环形缓冲区大小,默认100m -->
<property>
  <name>mapreduce.task.io.sort.mb</name>
  <value>100</value>
</property>

<!-- 环形缓冲区溢写阈值,默认0.8 -->
<property>
  <name>mapreduce.map.sort.spill.percent</name>
  <value>0.80</value>
</property>

<!-- merge合并次数,默认10-->
<property>
  <name>mapreduce.task.io.sort.factor</name>
  <value>10</value>
</property>

<!-- maptask内存,默认1g; maptask堆内存大小默认和该值大小一致mapreduce.map.java.opts -->
<property>
  <name>mapreduce.map.memory.mb</name>
  <value>-1</value>
  <description>The amount of memory to request from the scheduler for each    map task. If this is not specified or is non-positive, it is inferred from mapreduce.map.java.opts and mapreduce.job.heap.memory-mb.ratio. If java-opts are also not specified, we set it to 1024.
  </description>
</property>

<!-- matask的CPU核数,默认1-->
<property>
  <name>mapreduce.map.cpu.vcores</name>
  <value>1</value>
</property>

<!-- matask异常重试次数,默认4-->
<property>
  <name>mapreduce.map.maxattempts</name>
  <value>4</value>
</property>

<!-- 每个ReduceMap中拉取数据的并行数。默认值是5 -->
<property>
  <name>mapreduce.reduce.shuffle.parallelcopies</name>
  <value>5</value>
</property>

<!-- Buffer大小占Reduce可用内存的比例,默认值0.7 -->
<property>
  <name>mapreduce.reduce.shuffle.input.buffer.percent</name>
  <value>0.70</value>
</property>

<!-- Buffer中的数据达到多少比例开始写入磁盘,默认值0.66-->
<property>
  <name>mapreduce.reduce.shuffle.merge.percent</name>
  <value>0.66</value>
</property>

<!-- reducetask内存,默认1g;reducetask堆内存大小默认和该值大小一致mapreduce.reduce.java.opts -->
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>-1</value>
  <description>The amount of memory to request from the scheduler for each    reduce task. If this is not specified or is non-positive, it is inferred
    from mapreduce.reduce.java.opts and mapreduce.job.heap.memory-mb.ratio.
    If java-opts are also not specified, we set it to 1024.
  </description>
</property>

<!-- reducetask的CPU核数,默认1-->
<property>
  <name>mapreduce.reduce.cpu.vcores</name>
  <value>2</value>
</property>

<!-- reducetask失败重试次数,默认4-->
<property>
  <name>mapreduce.reduce.maxattempts</name>
  <value>4</value>
</property>

<!--MapTask完成的比例达到该值后才会为ReduceTask申请资源。默认是0.05 -->
<property>
  <name>mapreduce.job.reduce.slowstart.completedmaps</name>
  <value>0.05</value>
</property>

<!-- 如果程序在规定的默认10分钟内没有读到数据,将强制超时退出 -->
<property>
  <name>mapreduce.task.timeout</name>
  <value>600000</value>
</property>

分发配置
[root@master hadoop]# scp -r /usr/hadoop/hadoop-2.7.3/etc/hadoop root@slave1:/usr/hadoop/hadoop-2.7.3/etc/

Yarn参数调优

修改yarn-site.xml配置参数

<!-- 选择调度器,默认容量 -->
<property>
	<description>The class to use as the resource scheduler.</description>
	<name>yarn.resourcemanager.scheduler.class</name>
	<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

<!-- ResourceManager处理调度器请求的线程数量,默认50;如果提交的任务数大于50,可以增加该值,但是不能超过3* 4线程 = 12线程(去除其他应用程序实际不能超过8-->
<property>
	<description>Number of threads to handle scheduler interface.</description>
	<name>yarn.resourcemanager.scheduler.client.thread-count</name>
	<value>8</value>
</property>

<!-- 是否让yarn自动检测硬件进行配置,默认是false,如果该节点有很多其他应用程序,建议手动配置。如果该节点没有其他应用程序,可以采用自动 -->
<property>
	<description>Enable auto-detection of node capabilities such as
	memory and CPU.
	</description>
	<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
	<value>false</value>
</property>

<!-- 是否将虚拟核数当作CPU核数,默认是false,采用物理CPU核数 -->
<property>
	<description>Flag to determine if logical processors(such as
	hyperthreads) should be counted as cores. Only applicable on Linux
	when yarn.nodemanager.resource.cpu-vcores is set to -1 and
	yarn.nodemanager.resource.detect-hardware-capabilities is true.
	</description>
	<name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
	<value>false</value>
</property>

<!-- 虚拟核数和物理核数乘数,默认是1.0 -->
<property>
	<description>Multiplier to determine how to convert phyiscal cores to
	vcores. This value is used if yarn.nodemanager.resource.cpu-vcores
	is set to -1(which implies auto-calculate vcores) and
	yarn.nodemanager.resource.detect-hardware-capabilities is set to true. The	number of vcores will be calculated as	number of CPUs * multiplier.
	</description>
	<name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
	<value>1.0</value>
</property>

<!-- NodeManager使用内存数,默认8G,修改为4G内存 -->
<property>
	<description>Amount of physical memory, in MB, that can be allocated 
	for containers. If set to -1 and
	yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
	automatically calculated(in case of Windows and Linux).
	In other cases, the default is 8192MB.
	</description>
	<name>yarn.nodemanager.resource.memory-mb</name>
	<value>4096</value>
</property>

<!-- nodemanager的CPU核数,不按照硬件环境自动设定时默认是8个,修改为4-->
<property>
	<description>Number of vcores that can be allocated
	for containers. This is used by the RM scheduler when allocating
	resources for containers. This is not used to limit the number of
	CPUs used by YARN containers. If it is set to -1 and
	yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
	automatically determined from the hardware in case of Windows and Linux.
	In other cases, number of vcores is 8 by default.</description>
	<name>yarn.nodemanager.resource.cpu-vcores</name>
	<value>4</value>
</property>

<!-- 容器最小内存,默认1G -->
<property>
	<description>The minimum allocation for every container request at the RM	in MBs. Memory requests lower than this will be set to the value of this	property. Additionally, a node manager that is configured to have less memory	than this value will be shut down by the resource manager.
	</description>
	<name>yarn.scheduler.minimum-allocation-mb</name>
	<value>1024</value>
</property>

<!-- 容器最大内存,默认8G,修改为2G -->
<property>
	<description>The maximum allocation for every container request at the RM	in MBs. Memory requests higher than this will throw an	InvalidResourceRequestException.
	</description>
	<name>yarn.scheduler.maximum-allocation-mb</name>
	<value>2048</value>
</property>

<!-- 容器最小CPU核数,默认1-->
<property>
	<description>The minimum allocation for every container request at the RM	in terms of virtual CPU cores. Requests lower than this will be set to the	value of this property. Additionally, a node manager that is configured to	have fewer virtual cores than this value will be shut down by the resource	manager.
	</description>
	<name>yarn.scheduler.minimum-allocation-vcores</name>
	<value>1</value>
</property>

<!-- 容器最大CPU核数,默认4个,修改为2-->
<property>
	<description>The maximum allocation for every container request at the RM	in terms of virtual CPU cores. Requests higher than this will throw an
	InvalidResourceRequestException.</description>
	<name>yarn.scheduler.maximum-allocation-vcores</name>
	<value>2</value>
</property>

<!-- 虚拟内存检查,默认打开,修改为关闭 -->
<property>
	<description>Whether virtual memory limits will be enforced for
	containers.</description>
	<name>yarn.nodemanager.vmem-check-enabled</name>
	<value>false</value>
</property>

<!-- 虚拟内存和物理内存设置比例,默认2.1 -->
<property>
	<description>Ratio between virtual memory to physical memory when	setting memory limits for containers. Container allocations are	expressed in terms of physical memory, and virtual memory usage	is allowed to exceed this allocation by this ratio.
	</description>
	<name>yarn.nodemanager.vmem-pmem-ratio</name>
	<value>2.1</value>
</property>

分发配置
[root@master hadoop]# scp -r /usr/hadoop/hadoop-2.7.3/etc/hadoop root@slave1:/usr/hadoop/hadoop-2.7.3/etc/

重启集群

重启集群
[root@master hadoop-3.1.3]# sbin/stop-yarn.sh
[root@master hadoop-3.1.3]# sbin/start-yarn.sh

执行WordCount程序
[root@master hadoop-3.1.3]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output

观察Yarn任务执行页面
8088端口

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值