系统调优
① Nproc:单个用户同一时刻可用的最大进程数量
② Ulimit:单个用户同时打开的最大文件数,调整ulimit上限
修改limits.conf文件,执行ulimit -a命令可以检查这个文件的内容。③ 禁用JVM的自适应堆大小,固定堆内存的上下限
④ 启用JVM重用,可以设置mapred.job.reuse.jvm.num.tasks参数为我们想重用的JVM的个数
⑤ atime和noatime属性是Linux文件系统用于记录文件创建和读取时间的属性。禁用这两个属性会大大提升性能。使用/etc/fstab中的fstab(文件系统表)进行设置:
/mnt/dev1/Vol1 / ext4 defaults,noatime,nodiratiome1 1
⑥ 开启文件系统的预读缓存可提高读取速度
block --setra32768 /dev/sda
⑦ 使用下面的命令禁用操作系统交换分区vm.swappiness
sysctl -w vm.swappiness=0 #此值应该是0或者小于10
⑧ 集群应该有时间同步机制
⑨ /proc/sys/fs/file-max:指定同时打开的文件数上限。修改该文件中的fs.file-max为32K到64K
⑩客户端连接并发请求数的上限
/proc/sys/net/ipv4/tcp_max_syn_backlog
128MB内存以上的机器默认值是1024,以下是128。如果系统负载很高,可以调大此参数,修改/etc/sysctl.conf文件中的net.ipv4.tcp_max_syn_backlog
socket监听队列的上限,用户空间是SOMAXCONN
/proc/sys/net/core/somaxconn
默认值是128。如果有大量的并发请求,需要调大此值。可以修改/etc/rc.d/rc.local或者/etc/sysctl.conf脚本来持久化
修改Linux的epoll限制,在/etc/systel.conf文件中修改fs.epoll.max_user_instances=1024,这个选项指定一个进程可以打开的最大文件数Java调优
① 开启并行GC: -XX:+UseParallelGC
② 增加ParallelGCThread的值: -XX:ParallelGCThreads=<4 or More>
③ 禁用自适应内存调整,设置堆的Max和Min为一样的值
④ 禁用显式GC,以防开发人员主动GC: -XX:+DisableExplicitGC
这些设置可以在Hadoop和HBase的env文件中修改Hadoop调优
① 创建专门的Hadoop/HBase用户来运行守护进程
② NameNode元数据使用SSD
③ 定时备份NameNode上的元数据
④ 为NameNode指定多个元数据目录,使用dfs.name.dir或者dfs.namenode.name.dir指定。
⑤ 设置dfs.namenode.name.dir.restore为true来开启NameNode在做检查点期间尝试恢复之前失效的dfs.namenode.name.dir目录
⑥ master节点必须配置为RAID1结构(镜像对)
⑦ 保持NameNode日志目录有足够的空间
⑧ 因为Hadoop是I/O密集型的,应该选择尽可能好的存储(速度和吞吐量)
⑨ 开启垃圾回收,这对误删文件有保护作用
⑩ 保证RPC调用有较多的线程数
-dfs.namenode.handler.count和mapred.jobtracker.handler.count
参数的默认值是10,根据机器的可用内存可以改成50到100
-dfs.datanode.handler.count是DataNode的处理线程数,默认值是3,如果HDFS客户端程序读写请求较多,可以调高到5到10。设置的值越大,消耗的内存越多。
-根据数据量和重要性调整dfs.replication。如果数据量巨大且不重要,可以调成2到3,如果数据很重要,可以调成3到5
-dfs.block.size定义了块大小。根据文件大小,建议设置成64MB到256MB之间。
在hdfs-site.xml和hbase-site.xml中添加如下代码:<name>dfs.support.append</name> <value>true</value>
以上将开启HDFS同步,对HBase数据同步和持久化很重要。配置之后,需要重启集群
<name>dfs.datanode.max.xcievers</name> <value>4096</value>
以上决定了DataNode上可以打开的最大文件数,需要调大此参数
<name>dfs.datanode.socket.write.timeout</name> <value>0</value> <name>dfs.socket.timeout</name> <value>0</value>
以上参数会使socket等待很长时间,对于经常有超长事务的集群来说很重要
DataNode有多个磁盘,当一个磁盘出现故障,默认行为DataNode失效,设置下面的值为1,当一个盘出现故障时,数据会被复制到其他正常的DataNode上,当前的DataNode继续工作。可以修改hdfs-site.xml<name>dfs.datanode.failed.volumes.tolerated</name> <value>1<value>
MapReduce调优
① mapreduce.tasktracker.http.threads定义HTTP服务的工作线程数。默认40,对于大集群可调整到80到100
② mapreduce.task.io.sort.factor定义了排序因子,调高可以减少磁盘的读取。这个参数也定义了同时可以打开的文件数
③ 将mapreduce.map.speculative设置成true,任务可以并发执行,在有任务失败的时候可以加快执行效率(对于执行时间很长的任务,比如一两个小时,应该设置为false)
④ 对于大集群,设置Map和Reduce输出压缩为true,小集群设置为false
-jobconfmapred.output.compress=true⑤ 根据节点的CPU核数,调大mapper和reducer的数目
⑥ Map和Reduce个数限制
一个单独的TaskTracker可以同时运行的Map任务数量为:-mapred.tasktracker.map.tasks.maxmum
一个单独的TaskTracker可以同时运行的Reduce任务数量为:
-mapred.tasktracker.reduce.tasks.maxmum
假设一个8核的CPU,作业是CPU密集型的,可以设置Map数为4,对于非CPU密集型的,可以设置Map任务数为40,Reduce任务数为20
Map与Reduce的最大任务数:也可以在程序中设置Map和Reduce任务数,用以下公式计算:
mapred.tasktracker.map.tasks.maxmum=2+cpu_num*2/3
mapred.tasktracker.reduce.tasks.maxmum=2+cpu_num*1/3<name>mapreduce.map.output.compress</name> <value>true</value> <name>mapreduce.map.output.compress.codec</name> <value>org.apache.hadoop.io.compress.GizpCodec</value>
以上开启对MapReduce作业的中间临时文件的压缩,会大大缩短写入时间
同时,调整下面的参数并检验性能:·mapred.map.tasks ·mapred.tasktracker.map.tasks.maximum ·mapred.reduce.tasks ·mapred.tasktracker.reduce.tasks.maximum ·mapred.map.child.java.opts ·mapred.reduce.child.java.opts
下面的参数默认为true,如果在Hadoop上运行HBase集群,可以将此值改成false,如果Map任务经常因为某个节点导致任务失败,也可以选择开启:
<name>mapred.map.tasks.speculative.execution</name> <value>true</value>
下面的参数默认为true,如果在Hadoop上运行HBase集群,可以将此值改成false,如果TaskTracker因为较多的失败任务而被列入黑名单时,也可以选择开启:
<name>mapred.reduce.tasks.speculative.execution</name> <value>true</value>
Zookeeper调优
<name>zookeeper.session.timeout</name> <value>3000</value>
以上值关系到master多久可以检查到服务器宕机,可以减少此值让master尽快发现宕机的服务器,但会影响GC。如果写入HBase集群时有超时错误,需要增大此值。如果值太小,当向HBase写入大量数据时,触发GC,导致服务器停止服务,从而超时。将Zookeeper的数据目录设置在一个安全的目录,不要使用默认的HBase的temp目录,这样在出现故障的时候可以检查日志和数据
HBase调优
下面的默认值是30,用于指定RPC监听的数量。可以根据客户的请求数进行调整,读写请求较多时增加此值,较少时减少此值:
<name>hbase.regionserver.handler.count</name> <value>30</value>
下面参数定义了HStore文件的大小,默认10GB。如果需要运行HBase MapReduce任务,可以减少此值,因为Map的数量取决于region的大小,一个region一个mapper,如果region很大,Map任务就会执行很长时间:
<name>habse.hregion.max.filesize</name> <value>10737418240</value>
下面参数用于指定HTable客户端缓存,增大此值可以减少RPC调用次数:
<name>hbase.client.write.buffer</name> <value>2097152</value>
下面参数用于指定执行scan.next(从HBase表读取数据的方法)获取的行数。默认100,可以增加至1000或10000来加快获取速度,值越大越消耗内存:
<name>habse.client.scanner.caching</name> <value>100</value>
创建表时,可以指定表创建在内存中。分配全部可用内存的70%给Hadoop/HBase的Java堆,16GB到48GB的内存是个不错的选择,不建议分配非常大的堆内存
集群调优
最新推荐文章于 2024-05-09 09:37:21 发布