hadoop-----06
shuffle过程
Shuffle过程是MapReduce奇迹发生的地方
Map阶段:
1.如果map任务量小,缓冲区里的数据没有达到溢写阈值,就不会发生spill过程,就不会发生merge过程。针对这种情况,reduce会只从缓冲区里拽数据。
2.如果发生了spill溢写,但是最后一次可能存在数据残留情况,此时,会进行flush操作,flush到文件里。确保数据都在文件中,从而在merger阶段数据不丢。
3.如果在map阶段引入了combine过程,好处是减少spill溢写次数,从而减少磁盘I/O次数,从而提高性能。
4.在map的merge阶段也可能会发生combine,好处是,总数据量减少,reduce拿到结果后,reduce合并的工作也减少了。为什么说可能发生,如果只有一个spill溢写文件,在merge阶段就不会发生combine,此外,如果有两个spill文件,虽然有效果,但性能提升不大,所以,Cutting设置了merger阶段的combine阈值是3,也是说3个和3个以上的spill文件,会发生combine。
5.如果提高溢写内存大小(默认是100MB),也会减少spill溢写次数,从而减少磁盘I/O,从而提高性能。
6.环形缓冲区
reduce阶段扩展补充:
1.fetch过程的线程数量要近可能接近Map任务数量,达到并行抓取效果。默认是5个。这个参数是可以调控的。调节远程copy线程数量,从而提高性能。
2.reduce 的merge的合并因子是10。比如fetch到50个结果文件。
合并算法:①拿5个合一次——>1个文件
②剩45个,按10个一合——>合4个 余 5个
③最后:1+4+5=10 ,这个10个直接交个reuduce处理。
比如40个,
①4个一合 1
②剩36,按10个一合,3个剩6
3+6+1
根据以上的结论,可以提高merge合并因子(hadoop默认是10),也能够减少合并次数,从而减少I/O次数,提高性能
Hadoop常见参数控制+调优策略
配置所在文件 | 参数 | 参数默认值 | 作用 |
hdfs-site.xml | dfs.namenode.support.allow.format | true |
NN是否允许被格式化?在生产系统,把它设置为false,阻止任何格式化操作在一个运行的DFS上。
建议初次格式化后,修改配置禁止,改成false |
hdfs-site.xml | dfs.heartbeat.interval | 3 |
DN的心跳间隔,秒 在集群网络通信状态不好的时候,适当调大 |
hdfs-site.xml | dfs.blocksize | 134217728 |
块大小,默认是128MB 必须得是1024的整数倍 |
hdfs-site.xml | dfs.stream-buffer-size | 4096 |
文件流缓存大小。需要是硬件page大小的整数倍。在读写操作时,数据缓存大小。 注意:是1024的整数倍 注意和core-default.xml中指定文件类型的缓存是不同的,这个是dfs共用的 |
mapred-site.xml | mapreduce.task.io.sort.mb | 100 |
任务内部排序缓冲区大小,默认是100MB 此参数调大,能够减少Spil溢写次数,减少磁盘I/O |
mapred-site.xml | mapreduce.map.sort.spill.percent | 0.8 | Map阶段溢写文件的阈值。不建议修改此值,如果要调这个值,要往小调。比如要调成1的话,达不到同时spill和往缓冲区里写数据的效果。 |
mapred-site.xml | mapreduce.reduce.shuffle.parallelcopies | 5 |
Reduce Task 启动的并发拷贝数据的线程数 建议,尽可能等于或接近于Map任务数量, 但是不易过多。 |
mapred-site.xml | mapreduce.job.reduce.slowstart.completedmaps | 0.05 | 当Map任务数量完成率在5%时,Reduce任务启动,这个参数建议不要轻易改动,如果Map任务总量非常大时,可以将此参数调低,让reduce更早开始工作。 |
mapred-site.xml | io.sort.factor | 10 | merge文件合并因子,如果结果文件数量太多,可以适当调大,从而减少I/O次数 |
mapred-site.xml |
mapred.compress.map.output
| false | 是否对Map的输出结果文件进行压缩,默认是不压缩。但是如果Map的结果文件很大,可以开启压缩,在Reduce的远程拷贝阶段可以节省网络带宽。开启:true |
mapred-site.xml | mapred.map.tasks.speculative.execution | true |
启动map任务推测执行机制 推测执行是Hadoop对“拖后腿”的任务的一种优化机制,当一个作业的某些任务运行速度明显慢于同作业的其他任务时,Hadoop会在另一个节点上为“慢任务”启动一个备份任务,这样两个任务同时处理一份数据,而Hadoop最终会将优先完成的那个任务的结果作为最终结果,并将另一个任务杀掉。 |
mapred-site.xml | mapred.reduce.tasks.speculative.execution | true | 启动reduce任务推测执行机制 |
MR调优策略
Map Task和Reduce Task调优的一个原则就是
1.减少数据的传输量
2.尽量使用内存
3.减少磁盘IO的次数
4.增大任务并行数
5.除此之外还有根据自己集群及网络的实际情况来调优。
硬件角度调优
Hadoop自身架构的基本特点决定了其硬件配置的选项。Hadoop采用了Master/Slave架构,其中,master维护了全局元数据信息,重要性远远大于slave。在较低Hadoop版本中,master存在单点故障问题,因此,master的配置应远远好于各个slave。
Hadoop2.0 HA集群搭建步骤
集群节点分配
Park01
Zookeeper
NameNode (active)
Resourcemanager (active)
Park02
Zookeeper
NameNode (standby)
Park03
Zookeeper
ResourceManager (standby)
Park04
DataNode
NodeManager
JournalNode
Park05
DataNode
NodeManager
JournalNode
Park06
DataNode
NodeManager
JournalNode
安装步骤
0.永久关闭每台机器的防火墙
执行:service iptables stop
再次执行:chkconfig iptables off
1.为每台机器配置主机名以及hosts文件
配置主机名=》执行: vim /etc/sysconfig/network =》然后执行 hostname 主机名=》达到不重启生效目的
配置hosts文件=》执行:vim /etc/hosts
示例:
127.0.0.1 localhost
::1 localhost
192.168.234.21hadoop01
192.168.234.22hadoop02
192.168.234.23hadoop03
192.168.234.24hadoop04
192.168.234.25hadoop05
192.168.234.26hadoop06
2.通过远程命令将配置好的hosts文件 scp到其他5台节点上
执行:scp /etc/hosts hadoop02: /etc
3.为每天机器配置ssh免秘钥登录
执行:ssh-******
ssh-copy-id [email protected] (分别发送到6台节点上)
Ssh-******是生成秘钥,在hadoop01上生成秘钥(在hadoop01上执行了这个命令),然后在hadoop01上执行ssh-copy-id [email protected](执行的时候会让你输入hadoop01的密码)后以后在hadoop01上登录到hadoop01就不许要在输入hadoop01的密码了、在hadoop01上执行ssh-copy-id [email protected](执行的时候会让你输入hadoop02的密码)后以后在hadoop01上登录到hadoop02就不许要在输入hadoop02的密码了……
4.前三台机器安装和配置zookeeper
配置conf目录下的zoo.cfg以及创建myid文件
5.为每台机器安装jdk和配置jdk环境
6.为每台机器配置主机名,然后每台机器重启,(如果不重启,也可以配合:hostname hadoop01生效)
执行: vim/etc/sysconfig/network 进行编辑
7.安装和配置01节点的hadoop
配置hadoop-env.sh
配置jdk安装所在目录
配置hadoop配置文件所在目录
8.配置core-site.xml
<configuration>
<!--用来指定hdfs的老大,ns为固定属性名,表示两个namenode-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--用来指定hadoop运行时产生文件的存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/hadoop-2.7.1/tmp</value>
</property>
<!--执行zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
9.配置01节点的hdfs-site.xml
配置
<configuration>
<!--执行hdfs的nameservice为ns,和core-site.xml保持一致-->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!--ns下有两个namenode,分别是nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!--nn1的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop01:9000</value>
</property>
<!--nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop01:50070</value>
</property>
<!--nn2的RPC通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以从jn集群里获取
最新的namenode的信息,达到热备的效果-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop04:8485;hadoop05:8485;hadoop06:8485/ns</value>
</property>
<!--指定JournalNode存放数据的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/software/hadoop-2.7.1/journal</value>
</property>
<!--开启namenode故障时自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置切换的实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置隔离机制-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--配置隔离机制的ssh登录秘钥所在的位置-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是
core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/software/hadoop-2.7.1/tmp/namenode</value>
</property>
<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是
core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/software/hadoop-2.7.1/tmp/datanode</value>
</property>
<!--配置block副本数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件 生产环境中不能这样配,不安全-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
10.配置mapred-site.xml
配置代码:
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
11.配置yarn-site.xml
配置代码:
<configuration>
<!-- 开启YARNHA -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定两个resourcemanager的名称-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!--开启yarn恢复机制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--执行rm恢复机制实现类-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
<description>Formultiple zk services, separate them with comma</description>
</property>
<!-- 指定YARN HA的名称 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<property>
<!--指定yarn的老大 resoucemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
12.配置slaves文件
配置代码:
hadoop04
hadoop05
hadoop06
13.配置hadoop的环境变量(可不配)vim /etc/profile
JAVA_HOME=/home/software/jdk1.8
HADOOP_HOME=/home/software/hadoop-2.7.1
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export JAVA_HOMEPATH CLASSPATH HADOOP_HOME
source/etc/profile
14.根据配置文件,创建相关的文件夹,用来存放对应数据
在hadoop-2.7.1目录下创建:
①journal目录
②创建tmp目录
③在tmp目录下,分别创建namenode目录和datanode目录
15.通过scp 命令,将hadoop安装目录远程copy到其他5台机器上
比如向hadoop02节点传输:
scp -r hadoop-2.7.1 hadoop02:/home/software
然后把/etc/profile 发往其他5台机器,别忘了每台机器执行:source/etc/profile
Hadoop集群启动
16.启动zookeeper集群
在Zookeeper安装目录的bin目录下执行:shzkServer.sh start
17.格式化zookeeper 第一次搭建集群是执行,第二次启动集群不需要执行
在zk的leader节点上执行(可以是任何目录下):
hdfs zkfc -formatZK,这个指令的作用是在zookeeper集群上生成ha节点(ns节点)
18.启动journalnode集群
在04、05、06节点上执行(只需在04上执行,05、06上的journalnode也启动了):
切换到hadoop安装目录的sbin目录下,执行:
sh hadoop-daemons.sh start journalnode(在sbin目录下执行)
然后执行jps命令查看:
19.格式化01节点的namenode 第一次搭建集群是执行,第二次启动集群不需要执行
在01节点上执行:
hadoop namenode -format(在hadoop.2.7.0/sbin目录下执行即可)
20.启动01节点的namenode
在01节点上执行:
hadoop-daemon.sh start namenode(在sbin目录下执行)
21.把02节点的 namenode节点变为standby namenode节点 第一次搭建集群是执行,第二次启动集群不需要执行
在02节点上执行:
hdfs namenode -bootstrapStandby(在hadoop.2.7.0目录下执行)
22.启动02节点的namenode节点
在02节点上执行:
hadoop-daemon.sh start namenode(sbin)
23.在04,05,06节点上启动datanode节点(/home/software/hadoop-2.7.1/sbin目录下)
在04,05,06节点上执行: hadoop-daemon.sh start datanode
24.启动zkfc(启动FalioverControllerActive)(/home/software/hadoop-2.7.1/sbin目录下)
在01,02节点上执行:
hadoop-daemon.sh start zkfc
25.在01节点上启动 主Resourcemanager
在01节点上执行:start-yarn.sh
启动成功后,04,05,06节点上应该有nodemanager 的进程
26.在03节点上启动副 Resoucemanager(任意目录)
在03节点上执行:yarn-daemon.sh start resourcemanager
27.测试
输入地址:http://192.168.234.21:50070,查看namenode的信息,是active状态的
然后停掉01节点的namenode(hadoop-daemon.shstop namemode),此时返现standby的namenode变为active。
再次启动01节点的namenode(hadoop-daemon.sh start namemode)
28.查看yarn的管理地址停掉:yarn-daemon.sh stop resourcemanager
启动:yarn-daemon.sh start resourcemanager
排错:
1.排查防火墙
2.排查ip,如果不是固定ip的话,要看下ip是否被更换
3.主机名
4.hosts ip和主机名是否对应上
5.排查zk的配置文件
6.排查hadoop的配置文件
eclipse中hadoop插件: