如果我使用Spark将数据写入S3(或HDFS),我会得到一堆零件文件
part-r-xxxxx-uuid.snappy.parquet
我理解xxxxx是map / reduce任务编号,通常从零开始向上计数。
是否有任何有效的非错误情况,其中会有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目录是否列出了错误的证据?有没有证据证明这是一个错误?
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
答案 0 :(得分:2)
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文件,您的写入就会成功。