Hadoop入门经验总结

文档中提到的,我就不说了,我说一下我在实践过程中遇到的问题,我想这些问题其他人也可能会遇到。

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 as the ‘Archived Release (3.3.1).’”。我没当回事,结果浪费了我好多天的时间,出现了很多稀奇古怪的问题。 换了版本后,就一切正常了。这就是“不听老人言,吃亏在眼前”,希望这个杯具不出现在其他人那里。

2. Host Name的问题:

hadoop会反向解析hostname,即使是用了IP,也会使用 hostname 来启动 TaskTracker。权宜之计,设置各机器的 /etc/hosts 使hostname能用。

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的说明:

()
Returns the raw bytes; however, only data up to is valid.

6. Skip 模式的问题

SkipBadRecords.setMapperMaxSkipRecords 要在 new JobConf 之前。如果这两个语句的顺序颠倒的话,skip mode不能正常工作。 设置了Skip模式,会使效率大大的降低。参看

7. Secondary Sort 中 GroupComparator的解释,参看  。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/213ca495ab7459018fb5a89654b3b706.html