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.95或1.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 [email protected]:/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