【问题标题】:MapReduce and downloading files from external sourceMapReduce 和从外部源下载文件
【发布时间】:2014-07-04 16:06:36
【问题描述】:

我有一个项目,要求以分布式方式从外部来源下载文件。我们已经对 Hadoop 进行了大量投资,并希望利用 MapReduce——但更多的是作为分布式任务而不是 ETL。

1) 以前有人做过吗?

2) 是否应该只有一个没有 Reducer 的 Mapper?

3) 将 FTP/HTTP 连接的抽象实现传递给 Mapper 的最佳方式是什么? -- 需要明确的是,我的意思是我想要一种无需进行集成测试即可对其进行单元测试的好方法,因此需要一种模拟 FTP/HTTP 的方法。

4) MapReduce 是处理这类事情的最佳方法吗? -- 我们在滥用 MapReduce 吗?

谢谢。

【问题讨论】:

  • 我会说“是的,你在这里滥用 map/reduce”,但这只是我。
  • 我认为这也是“滥用 map/reduce”,但有可能,mapper 是这里更好的方法。

标签: java http ftp hadoop mapreduce


【解决方案1】:

这“听起来”与 Nutch 所做的类似(尽管除了该声明之外,我对 Nutch 不太熟悉)。

一些观察点:

  • 如果您有多个由同一服务器托管的 URL,您实际上可能会受益于按主机名进行分区,然后在 Reducer 中进行拉取(取决于您从中拉取的 URL 数量)
  • 如果内容是“可缓存的”,并且您将一遍又一遍地从相同的 URL 中提取内容,那么您“可能”受益于在您的 hadoop 集群和互联网之间放置一个缓存/代理服务器(您的公司和 ISP 可能/应该已经这样做了)。尽管如果您访问的是唯一 URL 或内容是动态的,这实际上会阻碍您,因为您在缓存/代理服务器中存在单一瓶颈

【讨论】:

    【解决方案2】:

    我认为你应该看看 Storm。这是一个可扩展的框架,对于从许多不同来源收集数据非常有用。这确实是你想要做的。处理仍然可以使用 map reduce 来完成,但对于实际的集合,您应该使用 Storm 之类的框架。

    【讨论】:

      【解决方案3】:

      我认为在这种情况下您的互联网连接很容易成为瓶颈,但我相信它可以做到。

      1. 我还没有做这件事,但我不得不从我的 Mapper 进行 Web 服务调用,以从第 3 方 API 获取一些元数据以进行进一步处理。第 3 方网络服务很快成为瓶颈,拖慢了一切。
      2. 是的,因为在这种情况下没有什么需要减少的(我假设您只想将下载的文件保存在某个地方)。
      3. 我会将 FTP/HTTP URL 保存在 HDFS 中,并让您的 Mapper 读取 HDFS 中的 URL。
      4. 我非常怀疑 MapReduce 是处理这类事情的最佳方法。就像我已经说过的那样,我认为您的互联网连接很容易成为瓶颈,您将无法大大扩展您的 MR 程序。一旦下载(并保存在 HDFS 中),如果您想使用 MapReduce 处理数据,那将是另一回事。是的,在这种情况下,我会说你在滥用 MR。

      【讨论】:

      • 感谢您的 cmets。 3) 请明确我的意思是我想要一种无需进行集成测试即可对其进行单元测试的好方法,因此需要一种模拟 FTP/HTTP 的方法。有没有很好的方法将对象传入映射器?
      • 对不起,我一定误解了你的问题 #3。没有直接的方法可以将 Objects 传递到我知道的映射器中。当我不得不将字符串传递给我的映射器时,我使用了Configuration 类中可用的getter/setter 方法。我想你可能可以使用setClass()
      猜你喜欢
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多