13

たとえば、次のフォルダーがあります。

/
  - test.py
  - test.yml

ジョブは次のように Spark クラスターに送信されます。

gcloud beta dataproc jobs submit pyspark --files=test.yml "test.py"

で、test.pyアップロードした静的ファイルにアクセスしたい。

with open('test.yml') as test_file:
    logging.info(test_file.read())

しかし、次の例外が発生しました:

IOError: [Errno 2] No such file or directory: 'test.yml'

アップロードしたファイルにアクセスするにはどうすればよいですか?

4

3 に答える 3

18

SparkContext.addFile(および)を使用して配布されたファイル--filesは、 からアクセスできますSparkFiles。次の 2 つの方法があります。

  • getRootDirectory()- 配布ファイルのルート ディレクトリを返す
  • get(filename)- ファイルへの絶対パスを返します

Dataproc 固有の制限があるかどうかはわかりませんが、次のようなものは問題なく動作するはずです。

from pyspark import SparkFiles

with open(SparkFiles.get('test.yml')) as test_file:
    logging.info(test_file.read())
于 2016-01-22T07:40:29.933 に答える
0

ええ、シャグンは正しいです。

基本的に、spark ジョブを spark に送信すると、処理するファイルが各ワーカーにシリアル化されません。あなたはそれを自分でしなければならないでしょう。

通常、HDFS、S3 (Amazon)、またはすべてのワーカーがアクセスできるその他の DFS などの共有ファイル システムにファイルを配置する必要があります。これを行うとすぐに、spark スクリプトでファイルの宛先を指定すると、spark ジョブは必要に応じて読み取りと処理を行うことができます。

ただし、これを言っても、すべてのワーカーとマスターのファイル構造の同じ宛先にファイルをコピーすることもできます。/opt/spark-job/all-files/Exp、すべてのsparkノードのようにフォルダーを作成rsyncし、それらすべてにファイルを作成してから、sparkスクリプトでファイルを使用できます。しかし、これをしないでください。DFS または S3 は、このアプローチよりもはるかに優れています。

于 2016-01-22T06:14:35.320 に答える