實驗環境
centos 7;cdh5.15; anaconda3
問題描述
筆者使用Cloudera Manager
對集羣中的機器進行分配組件,這裏用的就是Spark2
組件。
python 環境,及這些組件都安裝好,在Pyspark
交互界面讀取文件時報錯:
Caused by: java.io.IOException: Cannot run program "/root/anaconda3/bin/python": error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at org.apache.spark.api.python.PythonWorkerFactory.startDaemon(PythonWorkerFactory.scala:197)
at org.apache.spark.api.python.PythonWorkerFactory.createThroughDaemon(PythonWorkerFactory.scala:122)
at org.apache.spark.api.python.PythonWorkerFactory.create(PythonWorkerFactory.scala:95)
at org.apache.spark.SparkEnv.createPythonWorker(SparkEnv.scala:117)
at org.apache.spark.api.python.BasePythonRunner.compute(PythonRunner.scala:108)
at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:65)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
at org.apache.spark.scheduler.Task.run(Task.scala:121)
at org.apache.spark.executor.Executor$TaskRunner$$anonfun$10.apply(Executor.scala:403)
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1405)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:409)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
... 1 more
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
問題分析及解決
根據以上報錯,說的就是無訪問權限。這可都是系統默認安裝的,這是怎麼回事呢?一臉尼克楊問號!!!!
之後就是google、baidu和bing 各種檢索。大多說的是:修改環境變量~/.bashrc
,其實這一點我早就改過了,還是未能解決。
對了,這裏提一下。對於這個報錯,要看你是如何安裝spark
。我是手動,用Cloudera Manager
分配都試過。至此手動安裝的是可以正常讀取HDFS
文件(這個報錯也是容易解決),唯獨使用Cloudera Manager
分配的組件不能正常工作。
手動安裝 Spark
這裏也說下手動安裝Spark
,環境變量的配置。
我是參考廈門大學數據庫實驗室來做的,給出了鏈接
使用 Clouder Manager 分配
在網上搜索找到下圖:
意思就是在每個節點上都要有相同的Python
,由於這一個問題好久都沒解決,但凡有希望那都得去試試。於是在七臺虛擬機上挨個裝了 anaconda ,真是苦力活,但是未果(不過也建議個節點上保持版本一致)。
繼續解決,直到看到下面兩張圖:
首先這位作者先是拋出問題,和我的報錯很像。
最後,看到他自己回帖。說是重新安裝了anaconda
到/opt/anaconda
目錄下問題得以解決。
安裝上面給的提示,我將anaconda
重新安裝在/opt/
目錄下(默認是安裝在 /root
目錄下),果然可以正常讀取HDFS
中的數據了。
linux系統安裝 anaconda
參考文件
注意:這裏安裝完之後,記得修改 ~/.bashrc 文件中的環境變量
export PYSPARK_DRIVER_PYTHON=ipython
export PYSPARK_PYTHON=/opt/anaconda/bin/python
成功讀取HDFS
文件:
(base) [root@slave3 opt]# pyspark2
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
19/08/07 14:15:17 WARN lineage.LineageWriter: Lineage directory /var/log/spark2/lineage doesn't exist or is not writable. Lineage for this application will be disabled.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.0.cloudera1
/_/
Using Python version 3.7.3 (default, Mar 27 2019 22:11:17)
SparkSession available as 'spark'.
In [1]: input = sc.textFile("/user/platform/dga/output_file/20190610172348.txt")
In [2]: input.first()
Out[2]: 'baidu.com,legit,0.15,0.85'
In [3]: input.take(10)
Out[3]:
['baidu.com,legit,0.15,0.85',
'taobao.com,legit,0.0,1.0',
'vovo.tech,legit,0.0,1.0',
'ecmychar.live,legit,0.05,0.95',
至此,這個鬧心的問題得以解決。真正解決問題的方式很簡單,但是找出問題出錯原因是真不容易。
從一名不羈的碼農開始,談風月之餘談技術