Hadoop入门经验总结
最近一段时间研究Hadoop,入门的话,这两篇文档都不错,按照这些基本上都可以写出第一个hadoop程序了。
http://developer.yahoo.com/hadoop/tutorial/
http://hadoop.apache.org/common/docs/current/mapred_tutorial.html
文档中提到的,我就不说了,我说一下我在实践过程中遇到的问题,我想这些问题其他人也可能会遇到。
1. Eclipse版本的和Eclipse插件的问题:
Yahoo! Mapreduce tutorial 提示了版本兼容问题, “The most recent version which worked properly with the Hadoop plugin is version 3.3.1, "Europa." To download Europa, do not visit the main Eclipse website; it can be found in the archive site http://archive.eclipse.org/eclipse/downloads/ as the ‘Archived Release (3.3.1).’”。我没当回事,结果浪费了我好多天的时间,出现了很多稀奇古怪的问题。 换了版本后,就一切正常了。这就是“不听老人言,吃亏在眼前”,希望这个杯具不出现在其他人那里。
2. Host Name的问题:
hadoop会反向解析hostname,即使是用了IP,也会使用 hostname 来启动 TaskTracker。权宜之计,设置各机器的 /etc/hosts 使hostname能用。
http://stackoverflow.com/questions/4730148/unknownhostexception-on-tasktracker-in-hadoop-cluster
3. API 版本的问题:
《Hadoop The Definitive Guide》上说,0.20以后,有了新的API,就是 ora.apache.hadoop.mapreduce包,我愿意赶新潮,还花了不少力气找新API的代码例子,是写了一个跑的通的例子,但是新API是真心不成熟啊,很多内容都没有,比如 TotalOrderPartitioner、SkipBadRecords,这些扩充的功能都没有,看来还是不能在追赶潮流,还是用成熟的东西比较好。
4. Eclipse插件执行的问题:
一定要点击鼠标右键 Run As -> Run on Hadoop。直接按工具栏上的执行按钮也可以运行,但可能在源代码上的修改不能立即生效执行,感觉好像执行的是旧的代码。
如果要设置参数,点击 “Open Run Dialog” 设置好以后,点击 “Apply”,然后再点击“Run on Hadoop”
5. 中文编码的问题
Hadoop的 io 都只支持UTF-8,如果原始文件是GBK编码(中国经常会这样),直接用 text.getString(),会读出乱码。要先用原始的编码读入到java内部,然后再处理,Java 内部都是用unicode来表示的 String s = new String(text.getBytes(), 0, text.getLength(), "GBK"); 这样告诉java,输入的是GBK编码。这样就能正确处理gbk的输入文件了。
另外, Hadoop.io.Text 中,直接用getBytes会出错,因为拿出来的字节数组中后面有可能会跟一些垃圾,所以要截断。
getBytes的说明:
<strong><a href="http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/io/Text.html#getBytes%28%29">getBytes</a></strong>()
Returns the raw bytes; however, only data up to getLength()
is valid.
6. Skip 模式的问题