2016-01-22 348 views
4

例如,我有一個文件夾:在使用pyspark提交作業時,如何使用--files參數訪問靜態文件上傳?

/ 
    - test.py 
    - test.yml 

,且作業submited引發集羣:在test.py

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

,我要訪問我上傳的靜態文件。

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

卻得到了以下異常:

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

如何訪問我上傳的文件?

+1

第一件事就是將文件添加到分佈式文件系統(如HDFS)whic h羣集可以訪問。我相信其他人會提供更好的解決方案。 –

回答

9

使用SparkContext.addFile(和--files)分發的文件可以通過SparkFiles訪問。它提供了兩種方法:

  • getDirectory() - 返回根目錄分佈式文件
  • get(filename) - 返回文件

絕對路徑我不知道是否有任何Dataproc具體的限制,但喜歡的事這應該工作得很好:

from pyspark import SparkFiles 

with open(SparkFiles.get('test.yml')) as test_file: 
    logging.info(test_file.read()) 
+0

它的作品,謝謝!注意:SparkFiles.get返回文件路徑,而不是文件obj! – lucemia

0

沒錯,Shagun是正確的。

基本上當你提交的火花工作火花,它不序列您要處理到每個工人的文件。你必須自己做。

通常情況下,你將不得不將文件放在HDFS一樣,S3(亞馬遜),或任何其他DFS可以由全體職工進行訪問的共享文件系統。只要你這樣做,並在你的火星腳本中指定文件的目的地,火花工作將能夠閱讀和處理,如你所願。

不過,話雖如此,將文件複製到同一目的地的各位工作人員和主人的文件結構也行。精通,你可以創建一個像/opt/spark-job/all-files/在所有Spark節點,rsync文件到所有這些文件夾,然後你就可以在你的火花腳本中使用文件。但請不要這樣做。 DFS或S3比這種方法更好。

+0

謝謝,所以當我可以使用'--files'參數? – lucemia

+1

application-jar:包含應用程序和所有依賴項的捆綁jar的路徑。 URL必須在集羣內全局可見,例如,所有節點上都存在hdfs://路徑或file://路徑。 從http://spark.apache.org/docs/latest/submitting-applications.html –

相關問題