我知道這是一種使用Spark的奇怪方式,但我試圖使用Spark將數據幀保存到本地文件系統(而不是hdfs),即使我在cluster mode
。我知道我可以使用client mode
,但我做想要在cluster mode
中運行,並且不關心應用程序將作爲驅動程序運行在哪個節點上(3)。 下面的代碼是我試圖做的僞代碼。使用Spark在集羣模式下將文件寫入本地系統
// create dataframe
val df = Seq(Foo("John", "Doe"), Foo("Jane", "Doe")).toDF()
// save it to the local file system using 'file://' because it defaults to hdfs://
df.coalesce(1).rdd.saveAsTextFile(s"file://path/to/file")
這就是我提交spark應用程序的方式。
spark-submit --class sample.HBaseSparkRSample --master yarn-cluster hbase-spark-r-sample-assembly-1.0.jar
這工作得很好,如果我在local mode
但yarn-cluster mode
不一樣。
例如,java.io.IOException: Mkdirs failed to create file
發生在上面的代碼中。
我已經改變了df.coalesce(1)
部分df.collect
並試圖保存使用普通Scala中的一個文件,但它結束了一個Permission denied
。
我也試過:
- 與
root
用戶 chown
版yarn:yarn
,yarn:hadoop
,spark:spark
- 了
chmod 777
到相關的目錄
,但沒有運氣。
我假設這必須做一些事情clusters
,drivers and executors
,以及誰在試圖寫入本地文件系統,但我幾乎被困在由自己解決這個問題的user
。
我使用:
- 星火:1.6.0-cdh5.8.2
- 斯卡拉:2.10.5
- 的Hadoop:2.6.0-cdh5.8.2
歡迎任何支持,並提前致謝。
有的文章我已經試過:
- 「星火saveAsTextFile()導致Mkdirs未能創建目錄的一半」 - >試圖改變用戶,但什麼都沒有改變
- 「無法保存RDD爲文本文件到本地文件系統」 - >
chmod
沒有幫助我
編輯(2016年11月25日)
這是例外,我得到的。
java.io.IOException: Mkdirs failed to create file:/home/foo/work/rhbase/r/input/input.csv/_temporary/0/_temporary/attempt_201611242024_0000_m_000000_0 (exists=false, cwd=file:/yarn/nm/usercache/foo/appcache/application_1478068613528_0143/container_e87_1478068613528_0143_01_000001)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:449)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:435)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:920)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:813)
at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:135)
at org.apache.spark.SparkHadoopWriter.open(SparkHadoopWriter.scala:91)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.apply(PairRDDFunctions.scala:1193)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.apply(PairRDDFunctions.scala:1185)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:89)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
16/11/24 20:24:12 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.io.IOException: Mkdirs failed to create file:/home/foo/work/rhbase/r/input/input.csv/_temporary/0/_temporary/attempt_201611242024_0000_m_000000_0 (exists=false, cwd=file:/yarn/nm/usercache/foo/appcache/application_1478068613528_0143/container_e87_1478068613528_0143_01_000001)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:449)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:435)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:920)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:813)
at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:135)
at org.apache.spark.SparkHadoopWriter.open(SparkHadoopWriter.scala:91)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.apply(PairRDDFunctions.scala:1193)
at org.apache.spark.rdd.PairRDDFunctions$$anonfun$saveAsHadoopDataset$1$$anonfun$13.apply(PairRDDFunctions.scala:1185)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:89)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
感謝您的快速回復。這是否意味着我錯過了使用參數?我的其他spark應用程序似乎可以使用'yarn-cluster'參數在集羣模式下正常工作。我要編輯我的問題,但我確實想在集羣模式下運行,但想保存到本地文件系統,即使我不知道它將會是哪個節點。 – tkrhgch