基本上,在我的程序中,任务将附加到hdfs文件。但是,我不希望两个任务同时追加文件。有没有一种机制,我只有一个任务附加到hdfs文件。基本上是一种互斥机制。我在创建文件时也需要这种互斥。
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文档
wr98u20j2#
据我所知,不能让多个处理程序写入同一个hdfs文件。这不是Spark限制,这只是hdfs的设计方式。在hdfs中,文件是不可变的。每个文件只有一个writer,关闭后没有附加文件。这对于大数据和spark来说是非常好的,因为您总是知道相同的文件将产生相同的数据。在hadoop中解决这个问题的方法是让每个编写器编写自己的文件,然后有一个最终的mapreduce作业将它们合并到一个文件中(如果这是您真正想要的)。大多数情况下,您可以只处理这些多个文件。诀窍是将文件夹作为容器;例如。, /a/b/people 其中人物文件夹有很多不同的文件,每个文件都包含不同的“人物”子集。spark读取多个文件并将它们加载到同一Dataframe或rdd中没有问题。
/a/b/people
2条答案
按热度按时间xurqigkl1#
spark1.5及更高版本中的Dataframe提供了附加到hdfs上现有df的能力。spark内部使用@marios在另一个答案中描述的技术。
例如(在java中):
如果您选中hdfs,您将看到(写入“hello”的示例):
请在这里查看适合您要求的不同保存模式选项
如果您使用的是spark1.4,请查看savemode文档
wr98u20j2#
据我所知,不能让多个处理程序写入同一个hdfs文件。
这不是Spark限制,这只是hdfs的设计方式。在hdfs中,文件是不可变的。每个文件只有一个writer,关闭后没有附加文件。这对于大数据和spark来说是非常好的,因为您总是知道相同的文件将产生相同的数据。
在hadoop中解决这个问题的方法是让每个编写器编写自己的文件,然后有一个最终的mapreduce作业将它们合并到一个文件中(如果这是您真正想要的)。
大多数情况下,您可以只处理这些多个文件。诀窍是将文件夹作为容器;例如。,
/a/b/people
其中人物文件夹有很多不同的文件,每个文件都包含不同的“人物”子集。spark读取多个文件并将它们加载到同一Dataframe或rdd中没有问题。