您对Hadoop MapReduce工作的建议

时间:2012-02-27 15:01:49

标签: join hadoop mapreduce hdfs

我有2个文件存储在HDFS文件系统中:

  • tbl_userlog:<website url (non canonical)> <tab> <username> <tab> <timestamp>

    • 示例:www.website.com,foobar87,201101251456
  • tbl_websites:<website url (canonical)> <tab> <total hits>

    • 例如:website.com,25889

我编写了一个Hadoop作业序列,它连接了网站上的2个文件,对总点击量进行了过滤&gt; n每个网站然后为每个用户计算他访问过的具有&gt;的网站的数量。总命中数。序列的详细信息如下:

  1. 仅限地图的作业,用于对tbl_userlog中的网址进行优化(即从网址字段中删除www,http://和https://)
  2. 仅限地图的作业,用于对网址
  3. 上的tbl_websites进行排序
  4. 身份Map-Reduce作业,它将前2个作业的输出作为KeyValueTextInput并将它们提供给CompositeInput,以便利用使用jobConf.set("mapred.join.expr", CompositeInputFormat.compose("inner" (...))定义的Hadoop本机连接功能
  5. 一个Map and Reduce作业,用于根据总点击次数过滤上一个作业的结果&gt; n在其Map阶段,在洗牌阶段对结果进行分组,并在Reduce阶段对每个用户的网站数量进行计数。
  6. 为了链接这些步骤,我只是按照描述的顺序顺序调用作业。每个单独的作业将其结果输出到HDFS,然后链中的以下作业依次检索和处理。

    由于我是Hadoop的新手,我想请求您的咨询:

    1. 有更好的方法来连结这些工作吗?在此配置中,所有中间结果都写入HDFS,然后回读。
    2. 您是否看到这项工作存在任何设计缺陷,或者是否可以通过使用我错过的一些Hadoop功能来更优雅地编写?
    3. 我正在使用Apache Hadoop 0.20.2并且在项目范围内不可能使用Pig或Hive等更高级别的框架。

      提前感谢您的回复!

2 个答案:

答案 0 :(得分:0)

就链接工作而言,你应该看看Oozie,它是一个工作流管理器。我还没有使用它,但那是我开始的地方。

答案 1 :(得分:0)

我认为你所拥有的将会有几点需要注意。在我开始列出它们之前,我想明确两个定义。仅映射作业是具有已定义的Mapper并且使用0 reducer运行的作业。如果作业正在运行&gt; 0 IdentityReducers,那么作业不是仅限地图的作业。仅减少作业是具有定义Reducer并使用IdentityMapper运行的作业。

  1. 您的第一份工作,可以是仅限地图的工作,因为您所做的只是规范化网址。但是如果你想使用CompositeInputFormat,你应该运行一个具有0以上减速器的IdentityReducer。
  2. 对于你的第二份工作,我不知道你所选择的地图工作是什么意思。按其本质排序是减少一项任务。你可能意味着它有一个定义Mapper但没有Reducer。但是为了对URL进行排序,您应该使用超过0个reducer的IdentityReducer运行。
  3. 你的第三份工作是一个有趣的想法,但你必须小心使用CompositeInputFormat。您必须满足两个条件才能使用此输入格式。首先,两个输入目录中必须有相同数量的文件。这可以通过为Job1和Job2设置相同数量的减速器来实现。第二个条件是输入文件不能拆分。这可以通过使用不可分割的压缩来实现,例如bzip。
  4. 这个工作听起来不错。虽然您可以过滤具有&lt; n点击上一份工作的减速器并节省一些I / O.
  5. 对于软件中的问题,显然有多个解决方案,因此,虽然您的解决方案可行,但我不会推荐它。为此任务有4个MapReduce作业是有点昂贵的恕我直言。我想到的实现是使用Secondary Sort的M-R-R工作流程。