不想看廢話的可以直接拉到最底看總結
廢話開始:
master:
master主機存在文件,卻報
執行spark-shell語句: ./spark-shell --master spark://master:7077 --executor-memory 1G --total-executor-cores 2
報錯:WARN TaskSetManager: Lost task 1.0 in stage 0.0 (TID 1, slave02): java.io.FileNotFoundException: File file:/home/dummy/spark_log/file1.txt does not exist
明明指定了master主機,為什么會報錯slave02找不到文件呢
把文件改為file.txt file2.txt還是同樣的錯誤,所以你就會覺得他是從slave02讀取文件的吧?
那就在slave02創建個aa.txt:
返回master執行
然后報錯
導入路徑找到不?這是很多新手就懵逼了
其實原因在於最初的執行spark-shell語句: ./spark-shell --master spark://master:7077 --executor-memory 1G --total-executor-cores 2
每個主機的executor默認是一個core ! 這里設置為2個,就會從其他主機拉取一個core
用jps查看3台主機的進程:
master:
slave01:
slave02:
CoarseGrainedExecutorBackend是什么?
我們知道Executor負責計算任務,即執行task,而Executor對象的創建及維護是由CoarseGrainedExecutorBackend負責的
總結:
在spark-shell里執行textFile方法時,如果total-executor-cores設置為N,哪N台機有CoarseGrainedExecutorBackend進程的,讀取的文件需要在這N台機都存在
如果設置為1,就讀取指定的master spark的文件
如果只執行 ./spark-shell 就讀取啟動命令的主機的文件,即在哪台機啟動就讀取哪台機
以上僅為個人小白的觀點,如有錯誤,歡迎糾正!