hdfs文件的互斥写入?

nzrxty8p  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(343)

基本上,在我的程序中,任务将附加到hdfs文件。但是,我不希望两个任务同时追加文件。有没有一种机制,我只有一个任务附加到hdfs文件。基本上是一种互斥机制。我在创建文件时也需要这种互斥。

xurqigkl

xurqigkl1#

spark1.5及更高版本中的Dataframe提供了附加到hdfs上现有df的能力。spark内部使用@marios在另一个答案中描述的技术。
例如(在java中):

dataframe.write().mode(SaveMode.Append).
   format(FILE_FORMAT).partitionBy("parameter1", "parameter2").save(path);

如果您选中hdfs,您将看到(写入“hello”的示例):

-rw-r--r--   3 vagrant supergroup          0 2016-05-13 17:48 /home/hello/_SUCCESS
-rw-r--r--   3 vagrant supergroup        281 2016-05-13 17:48 /home/hello/_common_metadata
-rw-r--r--   3 vagrant supergroup       2041 2016-05-13 17:48 /home/hello/_metadata
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:46 /home/hello/part-r-00000-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:48 /home/hello/part-r-00000-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:46 /home/hello/part-r-00001-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:48 /home/hello/part-r-00001-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:46 /home/hello/part-r-00002-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:48 /home/hello/part-r-00002-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:46 /home/hello/part-r-00003-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet
-rw-r--r--   3 vagrant supergroup        499 2016-05-13 17:48 /home/hello/part-r-00003-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet

请在这里查看适合您要求的不同保存模式选项
如果您使用的是spark1.4,请查看savemode文档

wr98u20j

wr98u20j2#

据我所知,不能让多个处理程序写入同一个hdfs文件。
这不是Spark限制,这只是hdfs的设计方式。在hdfs中,文件是不可变的。每个文件只有一个writer,关闭后没有附加文件。这对于大数据和spark来说是非常好的,因为您总是知道相同的文件将产生相同的数据。
在hadoop中解决这个问题的方法是让每个编写器编写自己的文件,然后有一个最终的mapreduce作业将它们合并到一个文件中(如果这是您真正想要的)。
大多数情况下,您可以只处理这些多个文件。诀窍是将文件夹作为容器;例如。, /a/b/people 其中人物文件夹有很多不同的文件,每个文件都包含不同的“人物”子集。spark读取多个文件并将它们加载到同一Dataframe或rdd中没有问题。

相关问题