给力星

Web Developer

Hadoop-in-Practice第四章MapReduce-Join代码运行问题

最近在做基于 MapReduce 的 Join 算法,搜到了《Hadoop in Practice》这本书,不得不说老外写的书就是好啊,特别是 PDF 电子版,这代码注释排版,给人的感觉很舒服,而且在 GitHub 上给出了代码: https://github.com/alexholmes/hadoop-book,并且有在更新。相比于前阵子买的一本国人写的技术书,部分代码的缩进都是有问题的,看着都累…

Hadoop in Practice 代码截图Hadoop in Practice 代码截图

书中第四章 “Applying MapReduce patterns to big data” 对基于 MapReduce 的 Join 算法做了较为详细的介绍,即重分区算法(repartition join)、优化重分区算法(optimized repartition join)、复制连接算法(Replicated joins)、半连接(Semi-joins),感兴趣的同学可以下载此书(本文最后有下载地址)来看一看,在此就不做详细介绍。

因为书上的代码是在 CDH3u2(基于Hadoop 0.20.x) 上测试过的,虽然第四章的代码也进行了更新,支持 CDH4(Hadoop 2),不过我在原生的 Hadoop 2.4.1 伪分布式环境 / Ubuntu 14.04 上运行时,出现了一些问题,在此整理一下,希望能帮助有需要的同学。

CDH Hadoop

CDH 由 cloudera 发行,基于稳定版 Apache Hadoop,并应用了最新Bug修复或者 Feature 的 Patch。Cloudera 常年坚持季度发行 Update 版本,年度发行 Release 版本,更新速度比 Apache 官方快,而且在实际使用过程中 CDH 表现无比稳定,并没有引入新的问题。Cloudera 官方网站上安装、升级文档详细,省去 Google 时间。有兴趣的同学可以尝试一下,官网:http://www.cloudera.com/content/cloudera/en/products-and-services/cdh.html

代码运行问题

按照代码说明 mvn package 之后,可以运行,看代码中的 main 函数可知道代码的运行参数,不过运行时会出现两个问题:

  • Repartition join 和 optimized repartition join 读取的并不是 HDFS 上的内容,而是本地目录内容。可能因为不是用 CDH 运行代码的原因。
  • Replicated joins 和 Semi-joins 用到了 DistributedCache,但在运行时会出现 java.lang.Exception: java.io.FileNotFoundException: File 'file:/usr/local/hadoop/tmp/mapred/local/1413365272181/part-r-00000' does not exist

搜索网上一些说法,都没用,后来仔细看日记,发现其读取的本地文件为 file:/ 开头,而不是 file:// 开头。代码中传递的路径是对的,但到某一步的时候,路径就从 file:// 变为 file:/ 了。

file: 可能表示的是读取本地文件,后面跟的是目录,这说得通,而且运行代码后,在代码目录下也确实生成了一个 file:,不过看了该 file: 格式是目录?应该是链接吧?于是试了下,删除该 file:,用 ln -s / file:/ 命令新建了一个指向 root 的符号链接,这样 file:/usr/local/hadoop/tmp.. 就是指向 /user/local/hadoop/tmp.. 这个 Hadoop temp 目录了。创建后,代码就可以正确运行了!

Linux 符号链接

通过 ln -s source dist 可以创建符号链接/软链接,符号链接是一个指针,指向文件在文件系统中的位置。符号链接可以跨文件系统,甚至可以指向远程文件系统中的文件。

Eclipse 运行问题

将代码放到 Eclipse 上运行也是会遇到同样的问题,在 Project 目录下也创建一个符号链接就可以了,另外将代码直接拷贝到 Eclipse project 目录中时,路径要遵循 package ,如:

cd ~/workspace/Join                   # 项目目录,假设项目为 Join
mkdir -p ./src/com/manning/hip/ch4/   # 创建所需目录
cd ~/hadoop-book-master                 # 书上的代码
cp -r ./src/main/java/com/manning/hip/ch4/joins ~/workspace/Join/src/com/manning/hip/ch4/

在 Eclipse 上运行还可能会遇到另一个问题:contribjoin 使用了 Hadoop 源码中的 contrib 社区包,但运行时提示找不到,则需要将 Hadoop 源码中的 contrib 也复制到 project 目录中:

cd ~/hadoop-2.4.1-src
cp -r ./hadoop-tools/hadoop-datajoin/src/main/java/org ~/workspace/Join/src/

所以当 MapReduce 程序出现错误时,看错误日志很重要。

Hadoop in Practice PDF 下载

下载地址:http://pan.baidu.com/s/1nticyyX 转载自网络,仅供学习使用,有能力请支持购买此书~

参考资料

  1. hadoop in aciton 上面用的是hadoop0.2.X版本。请问楼主用的什么版本,我用hadoop2.6.0版本可以吗?

      • 好的,我打算好好看看hadoop in action这本书。你这本书上所有的例子程序在2.6.0版本下都可以运行吗?

        • 并不是。Hadoop 0.2.x 与 Hadoop 2 的代码还是有区别的。可以看下 Github 上,该书代码的更新状态,https://github.com/alexholmes/hadoop-book/tree/master/src/main/java/com/manning/hip ,有几个章节的更新状态为“fixes to enable code examples to run against Hadoop 2”,就表示这章节的代码可以在Hadoop 2.6.0下运行。