Exception in thread "main" org.apache.hadoop.mapred.InvalidInputException:
Input path does not exist: hdfs://mycluster-tj/user/engine_arch/data/mllib/sample_libsvm_data.txt
核心原因:YARN 集群模式下,Spark 任務在分布式節點運行,無法訪問本地文件系統,必須讀取 HDFS 或其他分布式存儲上的數據。
file:///data/xxx.txt)# 1. 上傳本地文件到 HDFS
hdfs dfs -mkdir -p /user/engine_arch/data/mllib/
hdfs dfs -put sample_libsvm_data.txt /user/engine_arch/data/mllib/
# 2. 代碼中使用 HDFS 路徑
val data = spark.read.format("libsvm")
.load("hdfs://mycluster-tj/user/engine_arch/data/mllib/sample_libsvm_data.txt")
spark-submit \
--master yarn \
--deploy-mode cluster \
--files /local/path/sample_libsvm_data.txt \
--class com.example.Main \
app.jar
# 代碼中通過 SparkFiles.get() 獲取
import org.apache.spark.SparkFiles
val path = SparkFiles.get("sample_libsvm_data.txt")
生產環境建議統一使用 HDFS/S3 路徑,避免環境差異導致問題:
// 配置文件中統一管理
spark.data.path=hdfs://nameservice1/user/app/data/
// 代碼讀取配置
val dataPath = spark.conf.get("spark.data.path")
val df = spark.read.parquet(dataPath + "table_name")
| 誤區 | 正確做法 |
|---|---|
代碼寫死本地絕對路徑 /home/user/data.txt | 使用 HDFS 路徑或通過配置注入 |
| 以為 --files 適合大文件 | --files 走 Driver HTTP 分發,大文件極慢,只適合 <100MB 小文件 |
| 忽略 HDFS 高可用邏輯路徑 | 使用 hdfs://nameservice/ 而非具體 IP |
| 權限不足導致讀取失敗 | 確保提交用戶有 HDFS 目錄讀權限 |
hdfs dfs -ls hdfs://mycluster-tj/user/engine_arch/data/mllib/hdfs dfs -test -r /path(返回 0 表示可讀)「Input path does not exist」在 YARN 模式下 90% 以上由本地路徑未遷移至 HDFS引起。建立「開發測試用本地、生產部署用 HDFS」的路徑管理規範,配合配置中心統一管理存儲路徑,可徹底杜絕此類問題。