自定义烫洗水龙头(或等效的Spark)

时间:2014-04-22 17:17:49

标签: scala hadoop cascading apache-spark scalding

我正在尝试使用自定义文件格式转储我在Hadoop集群上的一些数据,通常是在HBase中。

我想做的或多或少是以下几点:

  • 从分布式记录列表开始,例如Scalding pipe或类似的
  • 按某些计算函数分组项目
  • 使属于同一组的项目位于同一服务器上
  • 在每个组上,应用转换 - 涉及排序 - 并将结果写入磁盘。实际上我需要编写一堆MapFile - 它们基本上是排序的SequenceFile,加上索引。

我想用Scalding实现上述功能,但我不知道如何做最后一步。

虽然当然无法以分布式方式编写已排序的数据,但仍然可以将数据拆分成块然后写入本地排序的每个块。尽管如此,我找不到MapFile输出的任何MapFile输出实现。

我认识到对非常大的数据进行排序是一个坏主意,这就是我计划将数据分成块的单个服务器的原因。

有没有办法用Scalding做这样的事情?可能我会直接使用Cascading,或者实际上是其他管道框架,例如Spark。

1 个答案:

答案 0 :(得分:0)

使用Scalding(以及底层Map / Reduce),您将需要使用TotalOrderPartitioner,它会进行预采样以创建输入数据的适当存储桶/拆分。

由于更快的磁盘数据访问路径,使用Spark会加快速度。但是它仍然需要shuffle到磁盘/ hdfs,所以它不会像数量级更好。

在Spark中,您将使用RangePartitioner,它获取分区数和RDD:

val allData = sc.hadoopRdd(paths)
val partitionedRdd = sc.partitionBy(new RangePartitioner(numPartitions, allData)
val groupedRdd = partitionedRdd.groupByKey(..).
// apply further transforms..