2016-01-20 7 views
15

私はリモートクラスタ上で実行するスパークジョブを送信していことで火花を提出つまり、Sparkコンテキストを作成してRDDタスクを起動する前に実行します。ファイルはリモートドライバにコピーされますが、ドライバの作業ディレクトリにはコピーされません。で送信されたファイルを読む私は<strong>ドライバ</strong>コードによって<code>some.properties</code>ファイルの内容を読みたい</p> <pre><code>spark-submit ... --deploy-mode cluster --files some.properties ... </code></pre> <p>を実行することにより、ドライバ

私の知っているこの問題を回避する方法は以下のとおりです。

  1. ストアアプリジャー内のファイル

このファイルは頻繁にあるので、どちらが不便であるHDFSにファイルをアップロード開発マシンを提出すると変更されました。

ドライバコードのメインメソッドで--filesフラグを使用してアップロードされたファイルを読み取る方法はありますか?

+0

SparkContextに、クラスタ上のすべてのノードからアクセス可能なマウントあなた自身を得ました。この方法で、ドライバプログラムのマウントから読み込むことができます。ファイルを返す単純なエンドポイントを公開することができます。この方法で、あなたのドライバープログラムはhttp呼び出しを行うことができます。 –

+0

真実、@AlexNaspoですが、冗長です。このファイルはドライバjarと一緒に転送され、同じフォルダにはなく、サーバ上の同じファイルシステムに格納されます。 HTTP経由でもう一度*送信するのは無駄に見えます。 –

+1

@ AlexNaspoの提案に従えば、 '--files'でプロパティファイルを渡す必要がないので、重複しないでしょうか? –

答えて

6

はい、--files引数でアップロードしたファイルにアクセスできます。私はこれらのファイルは、労働者にダウンロードされていると信じてやる

val filename = args(0) 
val linecount = Source.fromFile(filename).getLines.size 

./bin/spark-submit \ 
--class com.MyClass \ 
--master yarn-cluster \ 
--files /path/to/some/file.ext \ 
--jars lib/datanucleus-api-jdo-3.2.6.jar,lib/datanucleus-rdbms-3.2.9.jar,lib/datanucleus-core-3.2.10.jar \ 
/path/to/app.jar file.ext 

と私のスパークのコードで:

は、これは私が--files経由で渡されたファイルにアクセスすることができるよ方法ですjarファイルと同じディレクトリが置かれます。そのため、絶対パスではなくファイル名を単に渡すのはSource.fromFileです。

+1

これは私が試みたものです。ファイルは作業者の作業ディレクトリにコピーされますが、ドライバのディレクトリにはコピーされません。 YARNモードでは違うかもしれません。 –

+1

申し訳ありませんが、あなたはYARNモードで走っていないことを見落としました。 ['SparkFiles'](https://spark.apache.org/docs/1.4.1/api/scala/index.html#org.apache.spark.SparkFiles$)というヘルパークラスがあります。 'SparkFiles.get(filename)'は 'filename'がダウンロードされたパスを返しますが、Sparkコンテキストが初期化されるまでそれを使用することはできません。 Sparkコンテキストが初期化される前にファイルを読む必要がある特別な理由はありますか? –

+1

私はこれらのプロパティのいくつかを使用してSparkパラメータを設定します –

1

--filesオプションと--archivesオプションは、Hadoopに似た#でファイル名を指定することをサポートします。たとえば、--files localtest.txt#appSees.txtを指定すると、ローカルにlocaltest.txtという名前のファイルがHDFSにアップロードされますが、これはappSees.txtという名前でリンクされます。アプリケーションでは、 YARNで実行しているときに参照するappSees.txtという名前。

これは私のsparkストリーミングアプリケーションの糸/クライアントと糸/クラスタモードの両方で動作します。多分あなたを助けることができます

0

私はPython Sparkで開発した素晴らしいソリューションを使って、外部からのファイルをビッグデータプラットフォームに統合しています。

楽しんでください。

# Load from the Spark driver any local text file and return a RDD (really useful in YARN mode to integrate new data at the fly) 
# (See https://community.hortonworks.com/questions/38482/loading-local-file-to-apache-spark.html) 
def parallelizeTextFileToRDD(sparkContext, localTextFilePath, splitChar): 
    localTextFilePath = localTextFilePath.strip(' ') 
    if (localTextFilePath.startswith("file://")): 
     localTextFilePath = localTextFilePath[7:] 
    import subprocess 
    dataBytes = subprocess.check_output("cat " + localTextFilePath, shell=True) 
    textRDD = sparkContext.parallelize(dataBytes.split(splitChar)) 
    return textRDD 

# Usage example 
myRDD = parallelizeTextFileToRDD(sc, '~/myTextFile.txt', '\n') # Load my local file as a RDD 
myRDD.saveAsTextFile('/user/foo/myTextFile') # Store my data to HDFS 
0

問題を回避する方法は、あなたがSparkFiles.get('FILE')の助けを借りて--filesに渡されたファイルを単にSparkContext.getOrCreate()を呼び出すことによって、一時的なSparkContextを作成し、読むことができるということです。

ファイルを読み終えたら、必要なすべての設定をSparkConf()変数で取得します。その後

この関数を呼び出す:

SparkContext.stop(SparkContext.getOrCreate()) 

これは、既存のSparkContext次の行に比べてをdistroyます単にこのような必要な構成で新しいSparkContextをinitalize。

sc = SparkContext(conf=conf).getOrCreate() 

あなたは、ネットワーク上のファイルを置くことが目的の設定

関連する問題

 関連する問題