如何在Hadoop中创建一个来自1..N的迭代器?

时间:2015-11-09 01:50:18

标签: hadoop amazon-s3 apache-spark

我想将Hadoop用作管理网格作业的简单系统。 (我之前使用SGE和pbs / Torque进行此操作,但我们正在转向Hadoop。)我有1000个ZIP文件,每个文件包含1000个文件,总共1M个文件。我想将它们全部上传到Amazon S3。理想情况下,我想在不将文件放入HDFS的情况下执行此操作。所有文件都可以通过WWW访问。

我想做的是:

  1. 有一个从0..999
  2. 开始的迭代器
  3. 对于每个地图作业,获取迭代器并:
    • 获取ZIP文件(大约500MB,因此它将写入临时存储空间)
    • 阅读ZIP目录。
    • 提取每个文件并将其上传到Amazon S3。
  4. 我知道如何在Java和Python中使用ZIP文件魔术。我的问题是:如何创建一个迭代器,以便映射器得到数字0..999?

    reducer的输出将是每次上传的时间量。然后,我想要第二个map / reduce步骤,它将生成时间的直方图。所以我想正确的事情是将时间和失败代码写入HDFS(尽管将它们写入SQL数据库似乎更有意义)。

    我有兴趣在传统的MapReduce(最好用Python,但我会用Java或Scala,如果必须的话)和Spark中做这个(为此我需要在Scala中做,对吧?)。虽然我可以看到在Spark中这样做没有真正的优势。

1 个答案:

答案 0 :(得分:1)

在Spark中,您可以简单地在范围内进行并行化:

  • 的Python

    n = ...  # Desired parallelism 
    
    rdd = sc.parallelize(range(1000), n)
    
    def do_something_for_side_effects(i): ...
    rdd.foreach(do_something_for_side_effects)    
    

    def do_something(i): ...
    rdd.map(do_something).saveAsTextFile(...)  # Or another save* method
    
  • Scala

    val n: Int = ???  // Desired parallelism 
    
    val rdd = sc.parallelize(1 until 1000, n)
    
    def doSomethingForSideEffects(i: Int): Unit = ???
    rdd.foreach(doSomethingForSideEffects)
    

    def doSomething(i: Int) = ???
    rdd.foreach(doSomething).saveAsTextFile(...)  // Or another save* method