使用 Hadoop 的 Ruby
在 shell 环境中您的 map 和 reduce 脚本按预期工作,通过 Hadoop 将它们放入测试中。我将会跳过 Hadoop 安装任务(参考本系列的 用 Hadoop 进行分布式数据处理,第 1 部分:入门 或 用 Hadoop 进行分布式数据处理,第 2 部分:进阶 以便建立 Hadoop 并使其运行)。
第一步将要在 HDFS 内为您的输入信息创建输入字典,然后提供一个将测试您脚本的简单文件。清单 9 说明了此步骤(有关这些步骤的更多信息,请参考本系列的 用 Hadoop 进行分布式数据处理,第 1 部分:入门 或 用 Hadoop 进行分布式数据处理,第 2 部分:进阶)。
清单 9. 为 MapReduce 过程创建输入数据
# hadoop fs -mkdir input # hadoop dfs -put /usr/src/linux-source-2.6.27/Documentation/memory-barriers.txt input # hadoop fs -ls input Found 1 items -rw-r--r-- 1 root supergroup 78031 2010-06-04 17:36 /user/root/input/memory-barriers.txt #
下一步,使用 流 实用工具,通过自定义脚本来调用 Hadoop,简化输出的输入数据和位置(请参考清单 10)。在此示例中请注意 -file 选项会简单地告诉 Hadoop 来打包您的 Ruby 脚本作为部分作业提交。
清单 10. 通过 Ruby MapReduce 脚本使用 Hadoop 流
# hadoop jar /usr/lib/hadoop-0.20/contrib/streaming/hadoop-0.20.2+228-streaming.jar -file /home/mtj/ruby/map.rb -mapper /home/mtj/ruby/map.rb -file /home/mtj/ruby/reduce.rb -reducer /home/mtj/ruby/reduce.rb -input input/* -output output packageJobJar: [/home/mtj/ruby/map.rb, /home/mtj/ruby/reduce.rb, /var/lib/hadoop-0.20/... 10/06/04 17:42:38 INFO mapred.FileInputFormat: Total input paths to process : 1 10/06/04 17:42:39 INFO streaming.StreamJob: getLocalDirs(): [/var/lib/hadoop-0.20/... 10/06/04 17:42:39 INFO streaming.StreamJob: Running job: job_201006041053_0001 10/06/04 17:42:39 INFO streaming.StreamJob: To kill this job, run: 10/06/04 17:42:39 INFO streaming.StreamJob: /usr/lib/hadoop-0.20/bin/hadoop job ... 10/06/04 17:42:39 INFO streaming.StreamJob: Tracking URL: :50030/... 10/06/04 17:42:40 INFO streaming.StreamJob: map 0% reduce 0% 10/06/04 17:43:17 INFO streaming.StreamJob: map 100% reduce 0% 10/06/04 17:43:26 INFO streaming.StreamJob: map 100% reduce 100% 10/06/04 17:43:29 INFO streaming.StreamJob: Job complete: job_201006041053_0001 10/06/04 17:43:29 INFO streaming.StreamJob: Output: output #
最后,通过 hadoop 实用工具使用 cat 文件系统操作来探索输出(请参考清单 11)。
Listing 11. Exploring the Hadoop output
# hadoop fs -ls /user/root/output Found 2 items drwxr-xr-x - root supergroup 0 2010-06-04 17:42 /user/root/output/_logs -rw-r--r-- 1 root supergroup 23014 2010-06-04 17:43 /user/root/output/part-00000 # hadoop fs -cat /user/root/output/part-00000 | head -12 +--->| 4 immediate 2 Alpha) 1 enable 1 _mandatory_ 1 Systems 1 DMA. 2 AMD64 1 {*C,*D}, 2 certainly 2 back 2 this 23 #
在不到 30 行的脚本中,您已经在 Hadoop 框架内实现了 map 和 reduce 元素并演示了它们的执行。虽然是一个简单的示例,但是通过自定义的和专有的算法说明了 Hadoop 背后真实的力量以及为什么 Hadoop 正在成为一种用于处理大型数据集的流行框架。