0

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

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

  • 从分布式记录列表开始,例如 Scalding 管道或类似的
  • 通过一些计算函数对项目进行分组
  • 使属于同一组的项目驻留在同一台服务器上
  • 在每个组上,应用一个转换 - 涉及排序 - 并将结果写入磁盘。事实上我需要写一堆 MapFile——它们本质上是排序的 SequenceFile,加上一个索引。

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

虽然当然不能以分布式方式写入已排序的数据,但将数据拆分为块然后写入本地排序的每个块应该仍然可行。尽管如此,我还是找不到任何 MapFile 输出用于 map-reduce 作业的实现。

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

有没有办法用 Scalding 做类似的事情?可能我可以直接使用 Cascading,或者真正使用其他管道框架,例如 Spark。

4

1 回答 1

0

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

由于访问磁盘数据的路径更快,使用 Spark 会加快速度。但是,它仍然需要对磁盘/hdfs 进行洗牌,因此不会好几个数量级。

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

val allData = sc.hadoopRdd(paths)
val partitionedRdd = sc.partitionBy(new RangePartitioner(numPartitions, allData)
val groupedRdd = partitionedRdd.groupByKey(..).
// apply further transforms..
于 2014-05-12T17:46:16.073 回答