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

本文详细记录了解决在使用ClouderaManager分配的Spark2组件中,遇到的读取HDFS文件时报权限错误的问题过程。通过调整Anaconda安装路径至/opt/目录并配置环境变量,最终成功解决了这一棘手问题。
部署运行你感兴趣的模型镜像

实验环境

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

至此,这个闹心的问题得以解决。真正解决问题的方式很简单,但是找出问题出错原因是真不容易。

从一名不羁的码农开始,谈风月之余谈技术
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 关于 `java.io.IOException` 权限不足的解决方案 当在 Java 中遇到由于权限不足引发的 `java.io.IOException` 时,这通常是由于程序尝试执行某些受限的操作而未能获得必要的访问权。以下是几种可能的原因及其对应的解决策略: #### 原因分析 1. **文件或目录权限不足** 如果程序试图读取或写入某个文件或目录,但当前运行环境下的用户对该资源没有足够的权限,则会抛出此异常[^2]。 2. **操作系统级别的限制** 某些情况下,操作系统本身可能会阻止特定类型的 I/O 操作,即使代码逻辑完全正确也可能触发该异常[^4]。 3. **运行环境配置不当** 当应用程序以较低权限启动(例如,在 Windows 上未以管理员身份运行),或者 Linux/macOS 下缺少适当的权利设置时,也会发生此类问题[^3]。 #### 解决方案 ##### 方法一:调整目标文件/目录的权限 可以通过修改文件系统的权限来允许程序访问所需的资源。对于 Unix/Linux/Mac 系统来说,可以使用命令行工具更改权限;而在 Windows 平台上则需通过属性对话框手动设定。 ```bash chmod u+rwx /path/to/file_or_directory # 添加可读、可写和可执行权限给文件拥有者 chown your_user_name /path/to/resource # 更改所有权至指定用户名 ``` ##### 方法二:提升应用运行级别 如果上述方法不适用,考虑提高整个进程的安全上下文。比如,在 Windows 上右键点击快捷方式选择“以管理员身份运行”,或是Linux下利用sudo命令前缀重新调用脚本或服务实例: ```bash sudo java -jar YourApplication.jar ``` ##### 方法三:检查并修正路径字符串 有时看似简单的路径拼接错误也能引起类似的权限拒绝现象。因此务必确认所提供的绝对或相对地址无误,并且遵循平台约定的标准格式[^1]. ##### 方法四:捕获异常后的优雅处理机制设计 即便采取预防措施也不能完全杜绝意外状况的发生,所以在编码阶段就应该考虑到这一点并通过try-catch结构妥善管理潜在风险点。下面给出一段示范性的伪代码片段用于展示如何合理应对这种情况: ```java import java.io.*; public class SafeFileHandler { public static void main(String[] args){ File file = new File("/example/path"); try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { // 实际业务逻辑... } catch(IOException e) { System.err.println("An error occurred while accessing the specified resource."); if(e.getMessage().contains("Permission denied")){ System.err.println("Please ensure that you have sufficient privileges to access this location."); } throw new RuntimeException(e); } } } ``` 以上列举了几种针对由权限不足所引起的 `java.io.IOException` 的具体处置办法。实际开发过程中应综合考量项目需求以及部署环境特点选取最合适的手段加以实施。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值