集群调优

来源:互联网 发布:王思聪 知乎 编辑:程序博客网 时间:2024/06/03 05:07
  1. 系统调优

    ① 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,这个选项指定一个进程可以打开的最大文件数

  2. Java调优

    ① 开启并行GC: -XX:+UseParallelGC

    ② 增加ParallelGCThread的值: -XX:ParallelGCThreads=<4 or More>

    ③ 禁用自适应内存调整,设置堆的Max和Min为一样的值

    ④ 禁用显式GC,以防开发人员主动GC: -XX:+DisableExplicitGC
    这些设置可以在Hadoop和HBase的env文件中修改

  3. 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>
  4. 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>
  5. Zookeeper调优

    <name>zookeeper.session.timeout</name><value>3000</value>

    以上值关系到master多久可以检查到服务器宕机,可以减少此值让master尽快发现宕机的服务器,但会影响GC。如果写入HBase集群时有超时错误,需要增大此值。如果值太小,当向HBase写入大量数据时,触发GC,导致服务器停止服务,从而超时。将Zookeeper的数据目录设置在一个安全的目录,不要使用默认的HBase的temp目录,这样在出现故障的时候可以检查日志和数据

  6. 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的内存是个不错的选择,不建议分配非常大的堆内存