您对Hadoop MapReduce作业的建议



我有两个文件存储在HDFS文件系统上:

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

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

    • 例如:website.com,25889

我写了一个Hadoop作业序列,它将网站上的2个文件连接起来,对每个网站的总点击量>n进行筛选,然后为每个用户计算他访问过的总点击数>n的网站数量。序列的详细信息如下:

  1. 仅映射作业,将tbl_userlog中的url规范化(即从url字段中删除www、http://和https://)
  2. 仅地图作业,在url上对tbl_websites进行排序
  3. 一个标识映射减少作业,它将前两个作业的输出作为KeyValueTextInput,并将它们提供给CompositeInput,以便使用jobConf.set("mapred.join.expr", CompositeInputFormat.compose("inner" (...))定义的Hadoop本机连接功能
  4. Map and Reduce作业在其Map阶段过滤上一个作业的总点击数>n的结果,在shuffling阶段对结果进行分组,并在Reduce阶段对每个用户的网站数量进行计数

为了链接这些步骤,我只是按照描述的顺序顺序调用作业。每个单独的作业将其结果输出到HDFS中,然后链中的下一个作业依次检索和处理HDFS。

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

  1. 有没有更好的方法来连锁这些工作?在这种配置中,所有中间结果都被写入HDFS,然后读回
  2. 你看到这份工作中有什么设计缺陷吗?或者可以利用我错过的Hadoop功能来写得更优雅吗

我使用的是Apache Hadoop 0.20.2,在项目范围内不可能使用更高级别的框架,如Pig或Hive。

提前感谢您的回复!

我认为您所拥有的将与几个注意事项一起使用。在开始列出它们之前,我想明确两个定义。仅映射作业是指具有已定义的映射器并使用0个减速器运行的作业。如果作业运行时带有>0个IdentityReducers,则该作业不是仅映射作业。仅reduce作业是指具有define Reducer并使用IdentityMapper运行的作业。

  1. 您的第一项工作可以是仅映射的工作,因为您所做的只是规范化URL。但是,如果要使用CompositeInputFormat,则应该使用包含0个以上减速器的IdentityReducer运行
  2. 对于你的第二份工作,我不知道你所说的那种只靠地图的工作是什么意思。按其本质进行排序是一项次要任务。您的意思可能是它有一个define Mapper,但没有Reducer。但是,为了对URL进行排序,您应该使用一个包含0个以上减速器的IdentityReducer来运行
  3. 你的第三份工作是一个有趣的想法,但你必须小心使用CompositeInputFormat。您必须满足两个条件才能使用此输入格式。首先,两个输入目录中必须有相同数量的文件。这可以通过为Job1和Job2设置相同数量的减速器来实现。第二个条件是输入文件不能拆分。这可以通过使用诸如bzip之类的不可拆分压缩来实现
  4. 这份工作听起来不错。尽管你可以过滤那些<n命中了上一个作业的减速器,为自己节省了一些I/O

软件中的一个问题显然有不止一个解决方案,所以虽然你的解决方案可行,但我不推荐它。有4个MapReduce作业来完成这项任务有点昂贵。我想到的实现是一个使用辅助排序的M-R-R工作流。

就链接作业而言,您应该了解Oozie,它是一个工作流管理器。我还没有用过,但那是我的起点。

相关内容

  • 没有找到相关文章