Hadoop 资源+配备+性能

Hadoop 资源+配置+性能

Hadoop 资源

 

淘宝Hadoop的技术分享

http://rdc.taobao.com/blog/dw/archives/category/hadoop

http://rdc.taobao.com/blog/dw/archives/244

 

Hadoop基本流程与应用开发

http://www.infoq.com/cn/articles/hadoop-process-develop

 

Hadoop性能调优

http://wiki.apache.org/hadoop/PerformanceTuning

 

HBase性能调优

http://wiki.apache.org/hadoop/Hbase/PerformanceEvaluation

 

 

hadoop中使用lzo压缩格式

http://code.google.com/p/hadoop-gpl-compression/wiki/FAQ

http://blog.csdn.net/workhardupc100/archive/2010/03/04/5345013.aspx

http://www.cloudera.com/blog/2009/11/hadoop-at-twitter-part-1-splittable-lzo-compression/

 

给MR加jar

hadoop jar hadoop-examples.jar wordcount -files cachefile.txt -libjars mylib.jar input output

 

Hadoop DFS Used是如何计算的? (集群中所有dfs.data.dir目录相加)

bin/hadoop fs -du /

http://hadoop.hadoopor.com/redirect.php?tid=562&goto=lastpost

 

-----------------------------

Hadoop 集群参数配置

hadoop-0.20.2\docs\cluster_setup.html

 

MapReduce的同时 ,(DFS Used : 8.21 GB  )大小会增加,因为被使用。默认存放Job中间文件的路径是dfs.data.dir(/tmp目录,由Hadoop自动清理,或者手动hadoop fs -rmr /tmp )

 

默认提交的Job,都会在后台执行,即使前台停止。

 

Kiss不要的Job

bin/hadoop job -kill  job_201004141024_0002

 

配置每个Task对应的Map和Reduce数量

conf/mapred-site.xml

(The maximum number of Map/Reduce tasks, which are run simultaneously on a given TaskTracker, individually. )

mapred.tasktracker.map.tasks.maximum=2

mapred.tasktracker.reduce.tasks.maximum=2

默认为2,如果有3台hadoop机器,则同时最多6个Map在执行。

 

mapred.map.tasks (The default number of map tasks per job.)

配置MapReduce的大小

 

关于多少Map和Reduce的建议

Map的数目通常是由输入数据的大小决定的,一般就是所有输入文件的总块(block)数。

 

Reduce的数目建议是0.951.75乘以 (<no. of nodes> * mapred.tasktracker.reduce.tasks.maximum)。

用0.95,所有reduce可以在maps一完成时就立刻启动,开始传输map的输出结果。用1.75,速度快的节点可以在完成第一轮reduce任务后,可以开始第二轮,这样可以得到比较好的负载均衡的效果。

 

http://wiki.apache.org/hadoop/HowManyMapsAndReduces

 

-----------------------------

Hadoop + Hbase 性能

 

 -----------------------------

Hadoop 性能测试

 

1千万条记录,3台机器,每台机器最多并行10个Map

/home/bmb/jdk1.6.0_16/bin/java  -cp examples.zip examples.CreateLogFile  test.log 10000000

1KW=350.74MB =5.46 Block

 

bin/hadoop fs -put test.log hadoop-performance-test

 

计算文件中,同一时间生成的行数

/home/iic/hadoop-0.20.2/bin/hadoop jar hadoop-examples.zip examples.HadoopMRTest hadoop-performance-test  hadoop-performance-test-out  1

 

第一次启动,Hadoop自动分配 map6, reduce 1

1KW/39=25W/s

10/04/14 13:43:36

10/04/14 13:44:15

 

从Job的Complet Map中,可以看到,每台机器运行2个Map

 

查看结果

bin/hadoop fs -cat hadoop-performance-test-out/part-r-00000

1271222992947 349

验证:

grep 1271222992947 test.log |wc -l

删除目录,方便重新测试

bin/hadoop fs -rmr hadoop-performance-test-out

bin/hadoop fs -rmr hadoop-performance-test

  

 

1亿条记录==3.61GB=58 Block

/home/bmb/jdk1.6.0_16/bin/java  -cp examples.zip examples.CreateLogFile  test_10KW.log 100000000

bin/hadoop fs -put test_10KW.log hadoop-performance-test

 

/home/iic/hadoop-0.20.2/bin/hadoop jar hadoop-examples.zip examples.HadoopMRTest hadoop-performance-test  hadoop-performance-test-out 6

 

指定reduce 6,Hadoop自动分配 map 58 

10KW/197=50.76W/s

10/04/14 14:14:40

10/04/14 14:17:57  

 

 

 -----------------------------

此例子3台机器, replication=2 , 默认块大小64M,功能,把表mrtest的列content的值反转到列text里面

 

初始100W数据,执行Map Reduce,只有1个Map.

(重新清理Hadoop后,统计得:刚开始DFS Used : 100.03 KB ,创建完后DFS Used : 234.27 MB,Replication=2,

一次MR后,DFS Used : 345.88 MB ,同时HBase中表mrtest的内容被重新分布(原因是Hbase是Readonly,当执行Update操作,必然导致重新创建),DFS Used之所以增大,是因为Hadoop保存数据默认3个时间版本,所以一次MR后,多了一个版本的数据

重启Hadoop,DFS Used : 262.87 MB

第二次MR后,DFS Used : 537.04 MB ,重启Hadoop,DFS Used : 358.61 MB

第三次MR后,DFS Used : 431.89 MB  ,重启Hadoop,DFS Used : 454.35 MB

 

/home/iic/hadoop-0.20.2/bin/hadoop jar  examples.zip  examples.TestTableMapReduce examples.TestTableMapReduce

 

时间执行 (100W / (8*60) ) = 2083个记录/每秒

10/04/13 14:08:33

10/04/13 14:16:25

 

cd /home/iic/hadoop-0.20.2/examples

./run_test.sh 生成900W的数据

/home/iic/bmb/jdk1.6.0_16/bin/java  -cp .: com.test.hadoop.hbase.HBaseTest  1 10000000

 

同样环境,测试1000W数据

出现java.lang.ClassNotFoundException: org.apache.hadoop.hbase.mapreduce.TableOutputFormat

原因:新增的Hadoop机器:5.12类路径没有包含HBase,在conf/hadoop-env.sh中,加入类库引用

export HBASE_HOME=/home/iic/hbase-0.20.3
export HADOOP_CLASSPATH=$HBASE_HOME/hbase-0.20.3.jar:$HBASE_HOME/hbase-0.20.3-test.jar:$HBASE_HOME/conf:${HBASE_HOME}/lib/zookeeper-3.3.0.jar

 

  

1000W的数据,大小达到3个Block, 执行Map Reduce,这时Map数量为3,由于是对Hbase进行MapReduce,而HBase最多的Map值是通过以下计算(for the list of regions and makes a map-per-region or mapred.map.tasks maps, whichever is smaller )。

 

时间执行 (1000W / (33*60) ) = 5050个记录/每秒

10/04/13 18:48:52

10/04/13 19:20:06  

 

修改Map为6(实际Hadoop Job自动生成5)和Reduce的数量3

从5.11拷贝到2.79

cd  /home/iic/hadoop-0.20.2

scp examples.zip iic@192.168.2.79:/home/iic/hadoop-0.20.2/

 

时间执行 (1000W / (21*60) ) = 7936个记录/每秒

10/04/13 19:43:55

10/04/13 20:04:17

 

修改map为9(Hadoop自动转成16,同时把/hbase/mrtest分成17个目录,17个Block),Reduce为9

(注:Hadoop会缓存mapred.map.tasks,除非出现新的参数)

mapred-site.xml

  <property>
    <name>mapred.map.tasks</name>
    <value>9</value>
  </property>

时间执行 (1000W / (18*60) ) = 9259个记录/每秒

10/04/14 09:27:36

10/04/14 09:45:55

 

按照上面的配置,再次执行一遍,Map变成17(Hadoop和Hbase会自动根据Block大小,增加Map数量)。

从日志看,Reduce会存在网络的Block复制,如果网速快,也会增加MR的速率

当Map为17的时候,每台机器的CPU从Map为3的20%增加到100%多。

但是执行到最后,2.79和5.11的Hbase,region server当掉。导致执行失败。

 

重启Hadoop和Hbase,再执行

Map自动变成18,Reduce 9

时间执行 (1000W / (18*60) ) = 9259个记录/每秒

10/04/14 10:27:39

10/04/14 10:45:48

 

每次执行后,Block数量一直在增加

虽然Map是18,但是由于只有3台机器,而且默认mapred.tasktracker.map.tasks.maximum=2,每个TaskTracker最多同时并行2个Map,所以18个Map不是全部并行执行。

最多同时6个Map。同理最多同时6个Task。

 

修改3台机器的参数mapred-site.xml,重启Hadoop

 <property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>10</value>
 </property>

 <property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>10</value>
 </property>

 

时间执行 (1000W / (15*60) ) = 11111个记录/每秒

10/04/14 11:36:49

10/04/14 11:51:56

 

 

 测试的时候,2.79的region server 挂了,用以下命令重启

bin/hbase-daemon.sh start regionserver