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 節點訪問該目錄文件。
參考
- https://stackoverflow.com/questions/35865320/apache-spark-filenotfoundexception
- https://stackoverflow.com/questions/41677897/how-to-get-path-to-the-uploaded-file
- https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/SparkContext.html#addFile-java.lang.String-
- http://spark.apache.org/docs/2.3.0/running-on-yarn.html#configuration