web-dev-qa-db-ja.com

Spark=クラスターモードでファイルをローカルシステムに書き込む

私はこれがSparkを使用する奇妙な方法であることを知っていますが、Spark私は_cluster mode_にいます。_client mode_を使用できることはわかっていますが、私はそうです _cluster mode_で実行し、どのノード(3つのうち) )アプリケーションはドライバーとして実行されます。以下のコードは、私がやろうとしていることの擬似コードです。

_// 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_になりました。

私も試しました:

  • _spark-submit_ with rootユーザー
  • chowned _yarn:yarn_、_yarn:hadoop_、_spark:spark_
  • 関連ディレクトリに_chmod 777_を与えました

しかし、運はありません。

私はこれがclusters、_drivers and executors_、およびローカルファイルシステムに書き込もうとしているuserで何かをしなければならないと仮定していますが、自分。

私は使用しています:

  • Spark:1.6.0-cdh5.8.2
  • Scala:2.10.5
  • Hadoop:2.6.0-cdh5.8.2

あらゆるサポートを歓迎し、事前に感謝します。

私が試したいくつかの記事:

  • 「Spark 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)
_
12
tkrhgch

ForEachPartitionメソッドを使用してから、パーティションごとにファイルシステムオブジェクトを取得し、レコードを1つずつ書き込みます。以下は、hdfに書き込むサンプルコードです。代わりにローカルファイルシステムも使用できます。

Dataset<String> ds=....

ds.toJavaRdd.foreachPartition(new VoidFunction<Iterator<String>>() {
    @Override
    public void call(Iterator<String> iterator) throws Exception {

    final FileSystem hdfsFileSystem = FileSystem.get(URI.create(finalOutPathLocation), hadoopConf);

    final FSDataOutputStream fsDataOutPutStream = hdfsFileSystem.exists(finalOutPath)
            ? hdfsFileSystem.append(finalOutPath) : hdfsFileSystem.create(finalOutPath);


    long processedRecCtr = 0;
    long failedRecsCtr = 0;


    while (iterator.hasNext()) {

        try {
            fsDataOutPutStream.writeUTF(iterator.next);
        } catch (Exception e) {
            failedRecsCtr++;
        }
        if (processedRecCtr % 3000 == 0) {
            LOGGER.info("Flushing Records");
            fsDataOutPutStream.flush();
        }
    }

    fsDataOutPutStream.close();
        }
});
1
SanthoshPrasad

ジョブをyarn-cluster modeとして実行すると、ドライバーはYARNによって管理されている任意のマシンで実行されるため、saveAsTextFileにローカルファイルパスがある場合、出力は次のいずれかに保存されます。ドライバーが実行されているマシン。

yarn-client modeとしてジョブを実行して、ドライバーがクライアントマシンで実行されるようにしてください。

1
Nirmal Ram

Sparkサービス以外のユーザーでファイルを実行/書き込みしようとしているかどうかを確認してください。その場合、ディレクトリACLを事前設定することでアクセス許可の問題を解決できます。

setfacl -d -m group:spark:rwx /path/to/

(ファイルを書き込もうとするユーザーグループの「スパーク」を変更します)

0
Ricardo

--masterでのspark-submitオプションの使用を理解するには、sparkドキュメントを参照してください。

  • --master localは、ローカルで実行するときに使用されることになっています。

  • --master yarn --deploy-mode clusterは、実際に糸クラスターで実行するときに使用されることになっています。

this および this を参照してください。

0
akaHuman