Monday, March 29, 2010

Hadoop Related

参考文档

收集的一些关于Hadoop的链接
Official Docs
Hadoop Quick Start (Official)
Hadoop MapReduce Tutorial using Java
Hadoop MapReduce Tutorial using Streaming
Hadoop Command Line
Jobconf parameters
Hadoop API Doc (Java)

Cluster Setup
Job Configuration的选项和默认值(有点老, 0.15的, 不过大部分没变)
Other Tutorials
Cloud 9: 关于hadoop的介绍很好很具体.有一些关于具体的programming的指导.
Hadoop Really Quick Start
Cloud computing with Linux and Apache Hadoop
The Hadoop Distributed File System

Hadoop自带工具

大部分初学者可能的问题, 先看Hadoop FAQ

DistCp

bash$ hadoop distcp hdfs://nn1:8020/foo/src1 \ 
            hdfs://nn1:8020/foo/src2 \ 
            hdfs://nn2:8020/bar/dest 

bash$ hadoop distcp -f hdfs://nn1:8020/srclist \ 
            hdfs://nn2:8020/bar/foo 

用RandomTextWriter生成随机文本
hadoop jar ${HADOOP_HOME}/hadoop-*-examples.jar randomtextwriter\
  -D test.randomtextwrite.total_bytes=52428800 \
  -D test.randomtextwrite.bytes_per_map=5242880 \
  /data/rand-text
参数test.randomtextwrite.total_bytes指定总共有多少字节要写;参数test.randomtextwrite.bytes_per_map指定每个map写多少字节.

Sort
hadoop jar ${HADOOP_HOME}/hadoop-*-examples.jar sort \
  -outKey org.apache.hadoop.io.Text \
  -outValue org.apache.hadoop.io.Text \
   /data/rand-text /data/sorted-text

Grep
hadoop jar ${HADOOP_HOME_DIR}/hadoop-*-examples.jar grep \
  /data/rand-text /data/greped-text dfs[a-z.]+' 

参数tips

reducer需要内存超过默认的1024MB的话,可以通过参数调整:
-D mapred.job.reduce.memory.mb=2048

使用Java作Hadoop MapReduce的时候,如果用到其他第三方的jar文件,用-libjars 选项来include

可以用-file选项指定需要使用的脚本
-file=myscript.sh

使用Streaming的时候,每个map task最多只能处理一个输入文件. 因此如果输入包括100个文件,则至少需要100个map.如果设定的mapred.map.tasks数目小于100,Hadoop会自动调整为100.

压缩格式的输入
当输入是gz或者是bz2文件时,不需要做特殊的处理.
-D stream.recordreader.compression=gzip

压缩格式的输出
当希望输出是压缩格式(比如.gz文件)时, 可以加上下面的选项
-D mapred.output.compress=true \
-D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCode

指定map以及reduce的数目
指定map数目
-D mapred.map.tasks=your_map_number
指定reduce数目
-D mapred.map.tasks=your_reduce_number
特别的,使用map only 的MapReduce job时,
-D mapred.reduce.tasks=0

使用identityMapper作为mapper或者reducer
-mapper org.apache.hadoop.mapred.lib.IdentityMapper
-reducer org.apache.hadoop.mapred.lib.IdentityReducer

Key,Value的划分
对于streaming job,需要将map的输出划分成key和value.默认的划分是第一个"\t"之前的是key,之后的是value.但是我们可以自定义分隔符,比如要用=作为分割:
-D stream.map.output.field.separator==
也可以指定第几个分隔符之前的作为key:
-D stream.num.map.output.key.fields=4

Primary, Secondary Key
Hadoop Mapreduce 默认根据key来分配reducer使得所有key一样的record都被同一个reducer处理.有时候我们希望每个record是这样的格式 (k1,k2,v), 然后所有k1(也就是primary key)一样的record被同一个reducer处理, 而这个reducer看见的所有k1的record按照k2来排序.这样的要求可以通过类似下面的代码来实现: 比如这里将map输出里每行的前2个field作为k1也就是partition参考, 而第3第4个field作为k2来排序
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-D stream.num.map.output.key.fields=4 \
-D num.key.fields.for.partition=2


输出路径可以在命令行中用${mapred.output.dir}指定或者在程序中用JobConf.setOutputPath来指定

No comments: