【发布时间】:2018-12-07 22:39:43
【问题描述】:
我有一个包含数十 GB 数据的文本文件,我需要从 HDFS 加载并并行化为 RDD。此文本文件使用以下格式描述项目。请注意,字母字符串不存在(每行的含义是隐含的),并且每行可以包含空格以分隔不同的值:
0001 (id)
1000 1000 2000 (dimensions)
0100 (weight)
0030 (amount)
0002 (id)
1110 1000 5000 (dimensions)
0220 (weight)
3030 (amount)
我认为并行化此文件的最直接方法是将其从本地文件系统上传到 HDFS,然后通过执行 sc.textFile(filepath) 创建 RDD。但是,在这种情况下,分区将取决于文件对应的 HDFS 拆分。
上述方法的问题是每个分区可能包含不完整的项目。例如:
分区 1
0001 (id)
1000 1000 2000 (dimensions)
0100 (weight)
0030 (amount)
0002 (id)
1110 1000 5000 (dimensions)
分区 2
0220 (weight)
3030 (amount)
因此,当我们为每个分区调用一个方法并将其对应的数据块传递给它时,它将收到标识为 0002 的项目的不完整规范。这将导致在调用内部执行的计算输出错误方法。
为了避免这个问题,对这个 RDD 进行分区或重新分区的最有效方法是什么?可以指定每个分区的行数为4的倍数吗?如果是,应该由Hadoop还是Spark来完成?
【问题讨论】:
标签: apache-spark hadoop rdd hadoop-partitioning