专栏首页Spark学习技巧hadoop系列之深入优化

hadoop系列之深入优化

五、MapReduce的优化

1、 操作系统调优

  • 增大打开文件数据和网络连接上限,调整内核参数net.core.somaxconn,提高读写速度和网络带宽使用率
  • 适当调整epoll的文件描述符上限,提高Hadoop RPC并发
  • 关闭swap。如果进程内存不足,系统会将内存中的部分数据暂时写入磁盘,当需要时再将磁盘上的数据动态换置到内存中,这样会降低进程执行效率
  • 增加预读缓存区大小。预读可以减少磁盘寻道次数和I/O等待时间
  • 设置openfile

2、Hdfs参数调优

  • core-site.xml
  1. hadoop.tmp.dir:默认值: /tmp
  2. 说明: 尽量手动配置这个选项,否则的话都默认存在了里系统的默认临时文件/tmp里。并且手动配置的时候,如果服务器是多磁盘的,每个磁盘都设置一个临时文件目录,这样便于mapreduce或者hdfs等使用的时候提高磁盘IO效率。
  3. fs.trash.interval:默认值: 0
  4. 说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间(分钟)。一般开启这个会比较好,以防错误删除重要文件。
  5. io.file.buffer.size:默认值:4096
  6. 说明:SequenceFiles在读写中可以使用的缓存大小,可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536 131072。
  • hdfs-site.xml
  1. dfs.blocksize:默认值:134217728
  2. 说明: 这个就是hdfs里一个文件块的大小了,CDH5中默认128M。太大的话会有较少map同时计算,太小的话也浪费可用map个数资源,而且文件太小namenode就浪费内存多。根据需要进行设置。
  3. dfs.namenode.handler.count:默认值:10
  4. 说明:设定 namenode server threads 的数量,这些 threads 會用 RPC 跟其他的 datanode

3、MapReduce参数调优

  1. mapred.reduce.tasks(mapreduce.job.reduces):默认值:1
  2. 说明:默认启动的reduce数。通过该参数可以手动修改reduce的个数。
  3. mapreduce.task.io.sort.factor:默认值:10
  4. 说明:Reduce Task中合并小文件时,一次合并的文件数据,每次合并的时候选择最小的前10进行合并。
  5. mapreduce.task.io.sort.mb:默认值:100
  6. 说明: Map Task缓冲区所占内存大小。
  7. mapred.child.Java.opts:默认值:-Xmx200m
  8. 说明:jvm启动的子线程可以使用的最大内存。建议值-XX:-UseGCOverheadLimit -Xms512m -Xmx2048m -verbose:gc -Xloggc:/tmp/@taskid@.gc
  9. mapreduce.jobtracker.handler.count:默认值:10
  10. 说明:JobTracker可以启动的线程数,一般为tasktracker节点的4%。
  11. mapreduce.reduce.shuffle.parallelcopies:默认值:5
  12. 说明:reuduce shuffle阶段并行传输数据的数量。这里改为10。集群大可以增大。
  13. mapreduce.tasktracker.http.threads:默认值:40
  14. 说明:map和reduce是通过http进行数据传输的,这个是设置传输的并行线程数。
  15. mapreduce.map.output.compress:默认值:false
  16. 说明: map输出是否进行压缩,如果压缩就会多耗cpu,但是减少传输时间,如果不压缩,就需要较多的传输带宽。配合 mapreduce.map.output.compress.codec使用,默认是 org.apache.hadoop.io.compress.DefaultCodec,可以根据需要设定数据压缩方式(org.apache.hadoop.io.compress.SnappyCodec)。
  17. mapreduce.reduce.shuffle.merge.percent:默认值: 0.66
  18. 说明:reduce归并接收map的输出数据可占用的内存配置百分比。类似mapreduce.reduce.shuffle.input.buffer.percent属性。
  19. mapreduce.reduce.shuffle.memory.limit.percent:默认值: 0.25
  20. 说明:一个单一的shuffle的最大内存使用限制。
  21. mapreduce.jobtracker.handler.count:默认值: 10
  22. 说明:可并发处理来自tasktracker的RPC请求数,默认值10。
  23. mapred.job.reuse.jvm.num.tasks(mapreduce.job.jvm.numtasks):默认值: 1
  24. 说明:一个jvm可连续启动多个同类型任务,默认值1,若为-1表示不受限制。
  25. mapreduce.tasktracker.tasks.reduce.maximum:默认值: 2
  26. 说明:一个tasktracker并发执行的reduce数,建议为cpu核数

4、系统优化

1)避免排序

对于一些不需要排序的应用,比如hash join或者limit n,可以将排序变为可选环节,这样可以带来一些好处:

  • 在Map Collect阶段,不再需要同时比较partition和key,只需要比较partition,并可以使用更快的计数排序(O(n))代替快速排序(O(NlgN))
  • 在Map Combine阶段,不再需要进行归并排序,只需要按照字节合并数据块即可。
  • 去掉排序之后,Shuffle和Reduce可同时进行,这样就消除了Reduce Task的屏障(所有数据拷贝完成之后才能执行reduce()函数)。

2)Shuffle阶段内部优化

  • Map端--用Netty代替Jetty
  • Reduce端--批拷贝
  • 将Shuffle阶段从Reduce Task中独立出来

5、总结

在运行mapreduce任务中,经常调整的参数有:

  • mapred.reduce.tasks:手动设置reduce个数
  • mapreduce.map.output.compress:map输出结果是否压缩
  • mapreduce.map.output.compress.codec:压缩格式
  • mapreduce.output.fileoutputformat.compress:job输出结果是否压缩
  • mapreduce.output.fileoutputformat.compress.type:默认RECORD
  • mapreduce.output.fileoutputformat.compress.codec:压缩格式

六、基于Zookeeper的HA

1、Zookeeper

1)简介

  • 一个开源的分布式的,为分布式应用提供协调服务的Apache项目,目的就是将分布式服务不再需要由于协作冲突而另外实现协作服务。提供一个简单的原语集合,以便于分布式应用可以在它之上构建更高层次的同步服务。
  • 设计非常易于编程,它使用的是类似于文件系统那样的树形数据结构

Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。

应用场景

  • 统一命名服务(Name Service)
  • 配置管理(Configuration Management)
  • 集群管理(Group Membership)
  • 共享锁(Locks)/同步锁

2) 角色

3)配置

  • 安装JDK、配置环境变量、验证java –version
  • 下载、赋执行权限、解压
    • 下载地址:http://zookeeper.apache.org/
    • 权限:chmod u+x zookeeper-3.4.5.tar.gz
    • 解压:tar -zxvf zookeeper-3.4.5.tar.gz -C /opt/modules/
  • 配置
    • 复制配置文件:cp conf/zoo_sample.cfg conf/zoo.cfg
    • 配置数据存储目录:dataDir=/opt/modules/zookeeper-3.4.5/data
    • 创建数据存储目录:mkdir /opt/modules/zookeeper-3.4.5/data
  • 启动
    • 启动:bin/zkServer.sh start
  • 检测
    • 查看状态:bin/zkServer.sh status
    • Client Shell:bin/zkCli.sh
  1. tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
  2. dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
  3. clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受
  4. initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒。
  5. syncLimit:这个配置项标识 Leader Follower 之间发送消息,请求和应答时间长度,最长不能超过
  6. server.A=B:C:D :其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
  7. 集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper

2、HA配置

1)core-site.xml

	<property>

		<name>fs.defaultFS</name>

		<value>hdfs://ns1</value>

	</property>

 

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/opt/cdh5.3.6/hadoop-2.5.0-cdh5.3.6/data/tmp</value>

    </property>


    <property>

        <name>hadoop.http.staticuser.user</name>

        <value>xuchenglong</value>

    </property>

	

	<property>

		<name>ha.zookeeper.quorum</name>

		<value>hadoop-01.xuchenglong.site:2181,hadoop-02.xuchenglong.site:2181</value>

	</property>

2)hdfs-site.xml

dfs.namenode.shared.edits.dir为namenode共享目录,设置为奇数个;CM中为一个路径地址

	<property>

		<name>dfs.nameservices</name>

		<value>ns1</value>

	</property>

 

	<property>

		<name>dfs.ha.namenodes.ns1</name>

		<value>nn1,nn2</value>

	</property>

 

	<property>

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

		<value>hadoop-01.xuchenglong.site:8020</value>

	</property>

	<property>

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

		<value>hadoop-02.xuchenglong.site:8020</value>

	</property>

 

	<property>

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

		<value>hadoop-01.xuchenglong.site:50070</value>

	</property>

	<property>

		<name>dfs.namenode.http-address.ns1.nn2</name>

		<value>hadoop-02.xuchenglong.site:50070</value>

	</property>


	<property>

		<name>dfs.namenode.shared.edits.dir</name>

		<value>qjournal://hadoop-01.xuchenglong.site:8485;hadoop-02.xuchenglong.site:8485;hadoop-03.xuchenglong.site:8485;hadoop-04.xuchenglong.site:8485;hadoop-05.xuchenglong.site:8485/ns1</value>

	</property>

	

	<property>

		<name>dfs.journalnode.edits.dir</name>

		<value>/opt/cdh5.3.6/hadoop-2.5.0-cdh5.3.6/data/dfs/jn</value>

	</property>

	

	<property>

		<name>dfs.client.failover.proxy.provider.ns1</name>

		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

	</property>

	

	<property>

		<name>dfs.ha.fencing.methods</name>

		<value>sshfence</value>

	</property>


	<property>

		<name>dfs.ha.fencing.ssh.private-key-files</name>

		<value>/home/xuchenglong/.ssh/id_rsa</value>

	</property>


	 <property>

		<name>dfs.ha.automatic-failover.enabled.ns1</name>

		<value>true</value>

	</property>

	

    <property>

        <name>dfs.permissions.enabled</name>

        <value>false</value>

    </property>

3)yarn-site.xml【YARN的HA】

<!-- resourcemanager -->

	<property>

		<name>yarn.resourcemanager.ha.enabled</name>

		<value>true</value>

	</property>

	<property>

		<name>yarn.resourcemanager.cluster-id</name>

		<value>yarn-probd</value>

	</property>


	<property>

		<name>yarn.resourcemanager.ha.rm-ids</name>

		<value>rm1,rm2</value>

	</property>

	<property>

		<name>yarn.resourcemanager.hostname.rm1</name>

		<value>hadoop-01.xuchenglong.site</value>

	</property>

	<property>

		<name>yarn.resourcemanager.hostname.rm2</name>

		<value>hadoop-05.xuchenglong.site</value>

	</property>

    <property> 

    	<name>yarn.resourcemanager.scheduler.address.rm1</name> 

		<value>hadoop-01.xuchenglong.site:8030</value>

    </property> 

    <property> 

    	<name>yarn.resourcemanager.scheduler.address.rm2</name> 

		<value>hadoop-05.xuchenglong.site:8030</value>

    </property> 

    <property>

		<name>yarn.resourcemanager.resource-tracker.address.rm1</name> 

		<value>hadoop-01.xuchenglong.site:8031</value>

	</property> 

    <property>

    	<name>yarn.resourcemanager.resource-tracker.address.rm2</name> 

		<value>hadoop-05.xuchenglong.site:8031</value>

	</property> 

    <property> 

    	<name>yarn.resourcemanager.address.rm1</name> 

		<value>hadoop-01.xuchenglong.site:8032</value>

    </property> 

    <property> 

    	<name>yarn.resourcemanager.address.rm2</name> 

		<value>hadoop-05.xuchenglong.site:8032</value>

    </property> 

    <property> 

    	<name>yarn.resourcemanager.admin.address.rm1</name> 

		<value>hadoop-01.xuchenglong.site:8033</value>

    </property> 

    <property> 

    	<name>yarn.resourcemanager.admin.address.rm2</name> 

		<value>hadoop-05.xuchenglong.site:8033</value>

    </property> 

    <property> 

    	<name>yarn.resourcemanager.webapp.address.rm1</name> 

		<value>hadoop-01.xuchenglong.site:8088</value>

	</property> 

    <property> 

    	<name>yarn.resourcemanager.webapp.address.rm2</name> 

		<value>hadoop-05.xuchenglong.site:8088</value>

	</property> 

    <property> 

    	<name>yarn.resourcemanager.ha.admin.address.rm1</name> 

		<value>hadoop-01.xuchenglong.site:23142</value>

    </property>

    <property> 

    	<name>yarn.resourcemanager.ha.admin.address.rm2</name> 

		<value>hadoop-05.xuchenglong.site:23142</value>

    </property>

    <property> 

    	<name>yarn.resourcemanager.store.class</name> 

    	<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>

		<description> Be available when yarn.resourcemanager.recovery.enabled is true.</description>

    </property>

	<property>

		<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>

		<value>true</value>

	</property>

	

	<!-- About zookeeper -->

	<property>

		<name>yarn.resourcemanager.zk-address</name>

		<value>hadoop-01.xuchenglong.site:2181,hadoop-02.xuchenglong.site:2181,hadoop-03.xuchenglong.site:2181,hadoop-04.xuchenglong.site:2181,hadoop-05.xuchenglong.site:2181</value>

	</property>

	<property>

		<name>yarn.resourcemanager.zk-state-store.address</name>

		<value>hadoop-01.xuchenglong.site:2181,hadoop-02.xuchenglong.site:2181,hadoop-03.xuchenglong.site:2181,hadoop-04.xuchenglong.site:2181,hadoop-05.xuchenglong.site:2181</value>

	</property>

3、初始化(略)

见相关配置笔记

4、HDFS Federation

一个NameNode负责一个功能,配置HA另算(3个NN配置HA总共6个NN)

Federation是为了HDFS单点故障提出的namenode水平扩展方案,允许HDFS上创建多个namespace命名空间以提高集群扩展性和隔离性(不同namespace负责不同的功能

<!--********************ns1******************* -->

<!--********************ns2******************* -->

承接子推荐阅读:

hadoop系列之基础系列

后续会讲MR的经典案例。

本文分享自微信公众号 - Spark学习技巧(bigdatatip),作者:浪1234

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark 如何摆脱java双亲委托机制优先从用户jar加载类?

    spark的类加载及参数传递过程还是很复杂的,主要是因为他运行环境太复杂了,不同的集群管理器完全不一样,即使是同一集群管理器cluster和client也不一样...

    Spark学习技巧
  • ConcurrentLinkedQueue和LinkedBlockingQueue用法

    作者: Ruthless 关注 - 28 粉丝 - 2969 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。J...

    Spark学习技巧
  • 一个真实的用户画像实例。

    本文中的产品和人物名称来源于某企业数据和真实客户,为了保密其中使用简称代替,望理解。

    Spark学习技巧
  • hadoop-3.2.0------>入门十一 完全分布式配置

    由于ResourceManager和NameNode还有SecondaryNameNode比较消耗资源,顾三个配置分别配置到不同的主机上

    用户5899361
  • Hadoop 2.x 伪分布式环境搭建

    天策
  • centos7搭建hadoop3.*.*系列

     最近搭建这个hadoop踩过不少坑,先是配置JDK搞错路径(普通用户和root用户下的路径不同),再就是hadoop版本不同导致的启动错误,网上找到的是ha...

    爱学习的孙小白
  • Hadoop高可用集群部署指南

    Hadoop是一个由Apache基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    KenTalk
  • Hadoop3-伪分布式模式安装

    kongxx
  • 【Hadoop 分布式部署 十:配置HDFS 的HA、启动HA中的各个守护进程】

    官方参考 配置 地址 :http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdf...

    梅花
  • Hadoop(二)搭建伪分布式集群

      前面只是大概介绍了一下Hadoop,现在就开始搭建集群了。我们下尝试一下搭建一个最简单的集群。之后为什么要这样搭建会慢慢的分享,先要看一下效果吧!

    大道七哥

扫码关注云+社区

领取腾讯云代金券