如果我使用 Spark 将数据写入 S3(或 HDFS),我会得到一堆部分文件
part-r-xxxxx-uuid.snappy.parquet
我知道 xxxxx 是一个映射/归约任务编号,通常从零开始向上计数。
是否存在任何有效的、非错误的情况,其中将有part-r-00001输出文件但没有part-r-00000输出文件?或者有part-r-00002输出文件但没有part-r-00001文件?
我有一个 Spark 作业,它对 S3/HDFS 目录进行多次追加写入。我可以看到两个part-r-00002 文件,但只能看到一个part-r-00001 文件。这是否意味着有错误?或者这可能是一个完全有效的场景吗?
一种猜测是数据可能被分区到0,1,2个worker,其中一些分区可能没有数据,并且没有生成相应的输出文件。这是真的吗?
编辑:这是一个具体示例。请注意索引号如何变为 0、1、31、32。此 S3 目录是否列出了错误的证据?有证据表明这是一个错误吗?
2016-10-28 14:22:14 6521048 part-r-00000-a597e173-4e27-4c1a-88c2-2b02150b07fe.avro
2016-10-28 14:16:39 2486221729 part-r-00001-a597e173-4e27-4c1a-88c2-2b02150b07fe.avro
2016-10-28 16:39:24 7044366 part-r-00031-a597e173-4e27-4c1a-88c2-2b02150b07fe.avro
2016-10-28 16:33:50 2460258711 part-r-00032-a597e173-4e27-4c1a-88c2-2b02150b07fe.avro
最佳答案
Spark 通常会为每个任务生成一个 part-r-${taskIndex}
文件,无论该任务是否包含空迭代器。
Spark 完成写入后会触及一个名为 _SUCCESS
的文件。如果该文件不存在,则写入步骤中出现问题。此文件与 part-r-xxxxx
文件位于同一目录中。
编辑:我没有意识到您正在使用write.partitionBy
。我刚刚自己测试过:
scala> case class MyData(key: String, value: String)
scala> sc.parallelize(Range(0, 100000)).map(x => MyData((x / 1000).toString, "foo"))
scala> res0.toDF().write.partitionBy("key").parquet("file:///.../pqt_test")
当我研究该结构时,我得到了像您一样按键分隔的任务文件:
pqt_test/key=87/part-r-00228-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=87/part-r-00227-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=87/part-r-00226-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=78/part-r-00203-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=78/part-r-00205-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=78/part-r-00202-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=78/part-r-00204-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=71/part-r-00184-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=71/part-r-00187-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=71/part-r-00185-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=71/part-r-00186-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=40/part-r-00105-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=40/part-r-00104-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=40/part-r-00106-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=33/part-r-00085-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=33/part-r-00088-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=33/part-r-00086-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=33/part-r-00087-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=65/part-r-00169-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=65/part-r-00170-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=65/part-r-00171-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=12/part-r-00033-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=12/part-r-00032-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=12/part-r-00031-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=19/part-r-00051-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=19/part-r-00050-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=19/part-r-00049-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=39/part-r-00103-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=39/part-r-00102-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=39/part-r-00101-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=58/part-r-00153-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=58/part-r-00152-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=58/part-r-00150-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
pqt_test/key=58/part-r-00151-5c1a24f5-09cb-4faf-99a6-eeb568cd9018.gz.parquet
...
结论:这很好。只要您在 key=...
文件夹所在的目录中有一个 _SUCCESS 文件,您的写入就成功了。
关于hadoop - Spark 中的part-r-xxxxx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392461/