解決:caused by: java.io.ioexception: error=13, permission denied

實驗環境

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',

至此,這個鬧心的問題得以解決。真正解決問題的方式很簡單,但是找出問題出錯原因是真不容易。

從一名不羈的碼農開始,談風月之餘談技術
在這裏插入圖片描述

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