Hadoop Spark中的part-r-xxxxx文件

Hadoop Spark中的part-r-xxxxx文件,hadoop,apache-spark,Hadoop,Apache Spark,如果我使用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

如果我使用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个工作区,其中一些分区可能没有数据,并且不会生成相应的输出文件。这是真的吗

编辑:下面是一个具体的例子。注意索引数字是如何变为0,1,31,32的。这个S3目录是否列出了bug的证据?有证据证明这是一个bug吗

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在完成写入时会碰到一个名为
\u 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文件,您的写入就成功了。

因此,我的数据是按日期分区的,因此我有s3://bucket/path/date=yyyy-mm-dd/part-xyz。Spark确实在s3://bucket/path/\u SUCCESS根目录下放置了一个_SUCCESS文件,但这可能来自不同的写入。是否有任何原因可以跳过任务索引或出于任何原因不使用任务索引?该_SUCCESS文件应该位于
part-r-…
files的旁边否,我从未在
write.parquet
(我假设您正在使用)否,
\u SUCCESS
文件将位于输出树的根目录下,如果您使用write.partitionBy,则不会位于零件文件旁边