1、hadoop
core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://redhat:9000</value>
</property>
默认值: /tmp
说明: 尽量手动配置这个选项,否则的话都默认存在了里系统的默认临时文件/tmp里。并且手动配置的时候,如果服务器是多磁盘的,每个磁盘都设置一个临时文件目录,这样便于mapreduce或者hdfs等使用的时候提高磁盘IO效率。
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/cdh4.5.0/hadoop/tmp</value>
</property>
默认值: 0
说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间。一般开启这个会比较好,以防错误删除重要文件。单位是分钟。
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>io.compression.codecs</name>
<value>com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
如果这是一个以逗号分隔的目录列表,那么数据将被存储在所有命名的目录,通常在不同的设备。
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/cdh4.5.0/hadoop/dfs/data</value>
</property>
<!-- dfs.datanode.max.xcievers对于datanode来说,就如同linux上的文件句柄的限制,当datanode上面的连接数超过配置中的设置时,datanode就会拒绝连接 -->
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/cdh4.5.0/hadoop/dfs/name</value>
</property>
<!-- datanode允许磁盘损坏的个数,datanode在启动时候会使用dfs.data.dir下配置的文件夹(用于存储block的),若是有一些不可以用且个数大于上面配置的那个值就启动失败 -->
<property>
<name>dfs.datanode.failed.volumes.tolerated</name>
<value>0</value>
</property>
<!-- balancer时,hdfs移动数据的速度,默认值为1M/S的速度,一般情况下设置为10M,设置的过大会影响当前job的运行 -->
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>
<!-- 控制Datanode的白名单,仅仅在dfs.hosts文件中指定的Datanode有权限连接到Namenode上 -->
<!-- 如果该参数不指定,那么默认所有的Datanode都可以连接到Namenode上 -->
<property>
<name>dfs.hosts</name>
<value>/home/hadoop/cdh4.5.0/hadoop/etc/hadoop/slaves</value>
</property>
<!-- 每个需要下线的机器,一行一个,这个将阻止他们去连接Namenode -->
<property>
<name>dfs.hosts.exclude</name>
<value>/home/hadoop/cdh4.5.0/hadoop/etc/hadoop/exclude</value>
</property>
<!-- datanode上用于处理RPC的线程数,默认为3,较大集群,可适当调大些,比如8,需要注意的是,每添加一个线程,需要的内存增加 -->
<property>
<name>dfs.datanode.handler.count</name>
<value>50</value>
</property>
默认值:10
说明:hadoop系统里启动的任务线程数,这里改为40,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定。
<property>
<name>dfs.namenode.handler.count</name>
<value>50</value>
</property>
<!-- 这个是块大小的设置,也就是说文件按照多大的size来切分块 -->
默认值:67108864
说明: 这个就是hdfs里一个文件块的大小了,默认64M,这里设置134217728,即128M,太大的话会有较少map同时计算,太小的话也浪费可用map个数资源,而且文件太小namenode就浪费内存多。根据需要进行设置。
<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
<!-- 这样是为了保证每个磁盘写入点能预留1K的空间来,而不是让DN将每个磁盘写入点写满,以导致M/R写local文件是发生磁盘空间不够而失败,甚至启动DN时也有可能失败(DN在启动时会初使化本地临时目录),1024=1K -->
<property>
<name>dfs.datanode.du.reserved</name>
<value>3221225472</value>
</property>
<!-- 该路径必须安全地阻止无优先级进程进行中间人攻击(MITM攻击,man-in-the-middle attack),每个套接字路径必须是root拥有或者DN用户拥有,不能使用人人都可以写或者用户组 -->
<!-- 如果没有找到libhadoop或者版本不匹配,则会报异常 -->
<property>
<name>dfs.domain.socket.path</name>
<value>/var/run/hadoop-hdfs/dn_PORT</value>
</property>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.support.append</name>
<value>false</value>
</property>
(设为true表示hdfs启用权限控制)
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}
export HADOOP_NAMENODE_OPTS="-Xmx8g -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Xmx4g -Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Xmx1g -Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
export HADOOP_TASKTRACKER_OPTS="-Xmx10g -Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
export HADOOP_PID_DIR=/app/tmp
export JAVA_HOME=/usr/java/jdk1.7.0_03
mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(mapred做本地计算所使用的文件夹,可以配置多块硬盘,逗号分隔)
<property>
<name>mapred.local.dir</name>
<value>file:/home/hadoop/cdh4.5.0/hadoop/mapred/local</value>
</property>
<property>
<name>mapred.job.tarcker</name>
<value>hdfs://redhat:9001</value>
</property>
以MB为单位,默认100M,这个值比较小
map节点没运行完时,内存的数据过多,要将内存中的内容写入洗盘,这个设置就是设置内存缓冲的大小,在suffle之前
这个选项定义了map输出结果在内存里占用buffer的大小,当buffer达到某个阈值(后面那条配置),会启动一个后台线程来对buffer
的内容进行排序,然后写入本地磁盘(一个spill文件)
根据map输出数据量的大小,可以适当的调整buffer的大小,注意是适当的调整,并不是越大越好,假设内存无限大,
io.sort.mb=1024(1G), 和io.sort.mb=300 (300M),前者未必比后者快:
(1)1G的数据排序一次
(2)排序3次,每次300MB
一定是后者快(归并排序)
<property>
<name>io.sort.mb</name>
<value>512</value>
</property>
同时打开的文件句柄的数量,默认是10
当一个map task执行完之后,本地磁盘上(mapred.local.dir)有若干个spill文件,map task最后做的一件事就是执行merge sort,
把这些spill文件合成一个文件(partition,combine阶段)。
执行merge sort的时候,每次同时打开多少个spill文件,就是由io.sort.factor决定的。打开的文件越多,不一定merge sort就越
快,也要根据数据情况适当的调整。
注:merge排序的结果是两个文件,一个是index,另一个是数据文件,index文件记录了每个不同的key在数据文件中的偏移量(即partition)。
在map节点上,如果发现map所在的子节点的机器io比较重,原因可能是io.sort.factor这个设置的比较小,io.sort.factor设置小的
话,如果spill文件比较多,merge成一个文件要很多轮读取操作,这样就提升了io的负载。io.sort.mb小了,也会增加io的负载。
<property>
<name>io.sort.factor</name>
<value>100</value>
</property>
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
说明:每个reduce并行下载map结果的最大线程数
Reduce task在做shuffle时,实际上就是从不同的已经完成的map上去下载属于自己这个reduce的部分数据,
由于map通常有许多个,所以对一个reduce来说,下载也可以是并行的从多个map下载,这个并行度是可以调整的,
调整参数为:mapred.reduce.parallel.copies(default 5)。
默认情况下,每个只会有5个并行的下载线程在从map下数据,如果一个时间段内job完成的map有100个或者更多,
那么reduce也最多只能同时下载5个map的数据,
所以这个参数比较适合map很多并且完成的比较快的job的情况下调大,有利于reduce更快的获取属于自己部分的数据。
<property>
<name>mapred.reduce.parallel.copies</name>
<value>50</value>
</property>
<!-- 用于设置TaskTracker启动的子任务 -->
这个参数是配置每个map或reduce使用的内存数量。默认的是200M。
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
yarn-site.xml
<property>
<name>yarn.resourcemanager.address</name>
<value>redhat:8090</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>redhat:8091</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>redhat:8092</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>redhat:8093</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>redhat:8094</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
2、hbase
hbase-site.xml
<property>
<name>hbase.zookeeper.quorum</name>
<value>redhat</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://redhat:9000/hbase</value>
</property>
(是否以分布式方式运行)
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
zookeeper是hbase集群的"协调器"。由于zookeeper的轻量级特性,因此我们可以将多个hbase集群共用一个zookeeper集群,以节约大量的服务器。多个hbase集群共用zookeeper集群的方法是使用同一组ip,修改不同hbase集群的"zookeeper.znode.parent"属性,让它们使用不同的根目录。比如cluster1使用/hbase-c1,cluster2使用/hbase-c2,等等。
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>hbase.regionserver.handler.count</name>
<value>80</value>
</property>
<property>
<name>hbase.hregion.max.filesize</name>
<value>4294967296</value>
</property>
原来是因为region server在写入时会检查每个region对应的memstore的总大小是否超过了memstore默认大小的2倍(hbase.hregion.memstore.block.multiplier决定),如果超过了则锁住memstore不让新写请求进来并触发flush,避免产生OOM。
<property>
<name>hbase.hregion.memstore.block.multiplier</name>
<value>2</value>
</property>
减少因内存碎片导致的Full GC,提高整体性能。
<property>
<name>hbase.hregion.memstore.mslab.enabled</name>
<value>true</value>
</property>
hbase有一个参数hbase.hstore.blockingStoreFiles=30,当region下的hfile达到30个的时候是会阻塞写的。那我都bolck住写了,为什么region里hfile会到700这么多呢?原来还有另一个参数hbase.hstore.blockingWaitTime=30000.hbase考虑到对应用的影响不会长时间block住写,30秒后会恢复。
<property>
<name>hbase.hstore.blockingStoreFiles</name>
<value>7</value>
</property>
表示文件大小小于该值的store file 一定会加入到minor compaction的store file中
<property>
<name>hbase.hstore.compaction.min.size</name>
<value>83886080</value>
</property>
提高以下两个属性的值,以增加执行compaction的线程数:
hbase.regionserver.thread.compaction.large
hbase.regionserver.thread.compaction.small
<property>
<name>hbase.regionserver.thread.compaction.large</name>
<value>10</value>
</property>
<property>
<name>hbase.regionserver.thread.compaction.small</name>
<value>5</value>
</property>
生成一个SplitRequest执行线程,通过splits线程池执行此线程,
线程池大小通过hbase.regionserver.thread.split配置,默认为1
<property>
<name>hbase.regionserver.thread.split</name>
<value>5</value>
</property>
默认值:0.2
说明:storefile的读缓存占用Heap的大小百分比,0.2表示20%。该值直接影响数据读的性能。
调优:
当然是越大越好,如果读比写多,开到0.4-0.5也没问题。如果读写较均衡,0.3左右。如果写比读多,果断默认吧。设置这个值的时候,你同时要参考 hbase.regionserver.global.memstore.upperLimit ,该值是memstore占heap的最大百分比,两个参数一个影响读,一个影响写。如果两值加起来超过80-90%,会有OOM的风险,谨慎设置。
<property>
<name>hfile.block.cache.size</name>
<value>0.2</value>
</property>
<property>
<name>hbase.regionserver.codecs</name>
<value>snappy</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/run/hadoop-hdfs/dn_PORT</value>
</property>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>hbase.hregion.memstore.flush.size</name>
<value>134217728</value>
</property>
3、zookeeper
zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
dataDir=/home/hadoop/cdh4.5.0/zookeeper/data
dataLogDir=/home/hadoop/cdh4.5.0/zookeeper/logs