hadoop-----06

shuffle过程


Shuffle过程是MapReduce奇迹发生的地方

 

Map阶段:

1.如果map任务量小,缓冲区里的数据没有达到溢写阈值,就不会发生spill过程,就不会发生merge过程。针对这种情况,reduce会只从缓冲区里拽数据。

2.如果发生了spill溢写,但是最后一次可能存在数据残留情况,此时,会进行flush操作,flush到文件里。确保数据都在文件中,从而在merger阶段数据不丢。

3.如果在map阶段引入了combine过程,好处是减少spill溢写次数,从而减少磁盘I/O次数,从而提高性能。

4.mapmerge阶段也可能会发生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。比如fetch50个结果文件。

合并算法: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最终会将优先完成的那个任务的结果作为最终结果,并将另一个任务杀掉。
启动推测执行机制的目的是更快的完成
job
但是在集群计算资源紧张时,比如同时在运行很多个job,启动推测机制可能会带来相反效果。如果是这样,就改成false
对于这个参数的控制,轻易不要改动。

mapred-site.xml

mapred.reduce.tasks.speculative.execution

true

启动reduce任务推测执行机制

MR调优策略

Map TaskReduce 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-keygen

 ssh-copy-id root@hadoop01 (分别发送到6台节点上)

Ssh-keygen是生成秘钥,在hadoop01上生成秘钥(在hadoop01上执行了这个命令),然后在hadoop01上执行ssh-copy-id root@hadoop01(执行的时候会让你输入hadoop01的密码)后以后在hadoop01上登录到hadoop01就不许要在输入hadoop01的密码了、在hadoop01上执行ssh-copy-id root@hadoop02(执行的时候会让你输入hadoop02的密码)后以后在hadoop01上登录到hadoop02就不许要在输入hadoop02的密码了……

 

4.前三台机器安装和配置zookeeper

配置conf目录下的zoo.cfg以及创建myid文件

zookeeper集群安装

5.为每台机器安装jdk和配置jdk环境

6.为每台机器配置主机名,然后每台机器重启,(如果不重启,也可以配合:hostname  hadoop01生效)

执行: vim/etc/sysconfig/network 进行编辑


7.安装和配置01节点的hadoop

配置hadoop-env.sh

配置jdk安装所在目录

配置hadoop配置文件所在目录


Sourcehadoop-env.sh

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>

<!--执行hdfsnameservicens,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>

<!--nn1RPC通信地址-->

<property>

<name>dfs.namenode.rpc-address.ns.nn1</name>

<value>hadoop01:9000</value>

</property>

<!--nn1http通信地址-->

<property>

<name>dfs.namenode.http-address.ns.nn1</name>

<value>hadoop01:50070</value>

</property>

<!--nn2RPC通信地址-->

<property>

<name>dfs.namenode.rpc-address.ns.nn2</name>

<value>hadoop02:9000</value>

</property>

<!--nn2http通信地址-->

<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>

 

<!-- 配置rm1rm2的主机 -->

<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            第一次搭建集群是执行,第二次启动集群不需要执行

zkleader节点上执行(可以是任何目录下):

hdfs zkfc -formatZK,这个指令的作用是在zookeeper集群上生成ha节点(ns节点)


18.启动journalnode集群

040506节点上执行(只需在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 namenodesbin

 

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状态的


输入地址:http://192.168.234.22:50070,查看namenode的信息,是standby状态

然后停掉01节点的namenodehadoop-daemon.shstop namemode,此时返现standbynamenode变为active

再次启动01节点的namenodehadoop-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插件:


此外注意,写的项目中job连接的地址是active namenode的地址


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值