[Spark 進階] -- Spark 如何在運行時讀取 --files 添加的 README.md 文件?

 

Spark 如何在運行時讀取 --files 添加的 README.md 文件?

方法 1

  • 本方法適用於 spark local 和 spark on yarn-client 。
  • --files 會把文件上傳到 hdfs 的 .sparkStagin/applicationId 目錄下,使用上面說的方法先獲取到 hdfs 對應的這個目錄,然後訪問hdfs的這個文件,如下  spark.read().textFile(System.getenv("SPARK_YARN_STAGING_DIR") + "/README.md")
  • 注意:addFile 方法上傳的文件 不能使用 textFile 讀取!!

方法 2

 

  • 本方法適用於  Spark on Yarn-cluster ,因爲本地文件使用 addFile 方法添加時,在集羣的 executor 上是找不到文件的,因爲只有本地有,所以必須使用 --files 上傳,使用 SparkFiles.get(fileName) 讀取。
  • SparkFiles.get(fileName) ,我獲取的結果是:/.../yarn/local/usercache/research/appcache/applicationId/spark-*******/userFiles-****/README.md 。
  • 本地目錄: /.../yarn/local/usercache/research/... 下的確有 README.md ,但是 worker 和 driver 的本地 README.md 路徑不一樣。
  • 解釋原因:SparkFiles.get(fileName String) 獲取的目錄是 driver node 下的本地目錄,所以 sc.textFile 無法在 worker 節點訪問該目錄文件。

參考

  1. https://stackoverflow.com/questions/35865320/apache-spark-filenotfoundexception
  2. https://stackoverflow.com/questions/41677897/how-to-get-path-to-the-uploaded-file
  3. https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/SparkContext.html#addFile-java.lang.String-
  4. http://spark.apache.org/docs/2.3.0/running-on-yarn.html#configuration

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章