在IDEA中运行SparkSQL读取hdfs文件报java.io.IOException: (null) entry in command string: null ls -F F:\tmp\hive

本文解决IDEA环境下运行SparkSQL读取HDFS文件时出现的java.io.IOException及AnalysisException错误。主要问题在于Windows未配置Hadoop环境变量、缺少winutils.exe及hadoop.dll文件。解决方案包括配置Hadoop环境、下载必要文件及调整hive目录权限。

在IDEA中运行Spark SQL读取hdfs文件时报java.io.IOException: (null) entry in command string: null ls -F F:\tmp\hive的错,
或者是报 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: ---------; 这样的错
我的情况是 spark在虚拟机中安装的 Windows上没有安。

第一个错误主要原因是 :

1、Windows上没有配hadoop的环境变量。
2、Spark初始化Hive上下文所需的winutils.exe文件丢失
3、hadoop bin目录下的 hadoop.dll 文件丢失

解决方案:

1、在Windows上配置Hadoop的运行环境

打开我的电脑高级系统设置中的环境变量设置。
在这里插入图片描述这里填写自己hadoop的安装路径!
在这里插入图片描述
在Path中加入bin目录和sbin目录

2、下载winutils 文件
点击下载即可
3、https://github.com/SweetInk/hadoop-common-2.7.1-bin中下载hadoop.dll
4、最后一种办法:重新下载hadoop解压

第二个错误的解决方案:

1、win+r cmd 进入系统操作界面
2、在黑界面输入:echo%HADOOP_HOME%
查看自己是否配置好了hadoop的环境变量
3、在黑界面输入:%HADOOP_HOME%\bin\winutils.exe chmod 777 F:\tmp\hive
这里填写自己的\tmp\hive 的准确目录,我的是在f盘下
4、在黑界面输入:%HADOOP_HOME%\bin\winutils.exe ls F:\tmp\hive
查看权限
在这里插入图片描述变成这样就可以了。
5、重启自己的IDEA 运行代码即可。

### Spark SQL分析异常问题:文件权限相关错误解决方案 在运行Spark SQL时,遇到`java.io.IOException`或`org.apache.spark.sql.AnalysisException`等异常,通常与HDFS文件权限、临时目录配置以及Windows环境下的工具缺失有关。以下是针对这些错误的详细分析和解决方法。 #### 1. 错误原因分析 - **第一个错误**:`java.io.IOException: (null) entry in command string: null ls -F F:\tmp\hive` 这个错误表明Spark尝试执行Hadoop命令(如`ls`)来检查文件权限,但由于某些配置缺失或路径不正确导致失败[^1]。 - **第二个错误**:`Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable.` 此错误提示`/tmp/hive`目录在HDFS上不可写入,可能是由于权限不足或目录未正确创建[^1]。 #### 2. 解决方案 ##### 2.1 配置HDFS上的`/tmp/hive`目录权限 确保HDFS上的`/tmp/hive`目录存在且具有正确的权限: ```bash hdfs dfs -mkdir -p /tmp/hive hdfs dfs -chmod 777 /tmp/hive ``` 上述命令会创建`/tmp/hive`目录并赋予其完全权限,以允许Spark写入临时数据[^1]。 ##### 2.2 Windows环境下配置`winutils.exe` 在Windows系统中运行Spark时,需要提供`winutils.exe`工具来模拟Hadoop命令。如果没有正确配置,会导致类似`null ls`的错误[^4]。 - 下载`winutils.exe`工具(参考链接:[winutils.exe](https://github.com/steveloughran/winutils/raw/master/hadoop-2.6.0/bin/winutils.exe))。 - 将其放置到本地路径,例如`C:\hadoop\bin\winutils.exe`。 - 设置环境变量`HADOOP_HOME`为`C:\hadoop`,并确保`%HADOOP_HOME%\bin`已添加到系统`PATH`中。 验证配置是否成功: ```cmd winutils.exe chmod 777 F:\tmp\hive ``` 如果命令无错,则说明配置正确。 ##### 2.3 调整Spark配置 在代码中明确指定HDFS上的临时目录路径,并确保其可写入。可以通过以下配置实现: ```scala val ss = SparkSession.builder() .master("local[2]") .appName("the test of SparkSession") .config("spark.hadoop.mapreduce.input.fileinputformat.split.maxsize", "67108864") .config("spark.sql.warehouse.dir", "hdfs://namenode:8020/user/hive/warehouse") // 指定Hive仓库路径 .config("spark.local.dir", "F:/tmp/spark") // 指定本地临时目录 .enableHiveSupport() .getOrCreate() ``` 上述代码中的`spark.local.dir`指定了本地临时目录,避免使用默认路径引发权限问题[^2]。 ##### 2.4 检查依赖Jar包 确保Spark集群中包含所有必要的依赖库,特别是与HBase、Hive兼容的Jar包。例如: - `hbase-hadoop2-compat-1.2.0.jar` - `guava-12.0.1.jar` - `protobuf-java-2.5.0.jar` 可以使用以下命令列出所需Jar包: ```bash ls /usr/local/hbase-1.2.0/lib | grep -E 'compat|guava|protobuf' ``` 如果缺少某些Jar包,请从官方仓库下载并添加到classpath中[^3]。 #### 3. 示例代码调整 以下是一个完整的代码示例,结合了上述配置调整: ```scala import org.apache.spark.sql.SparkSession object SparkSqlHive { def main(args: Array[String]): Unit = { val ss = SparkSession.builder() .master("local[2]") .appName("the test of SparkSession") .config("spark.sql.hive.convertMetastoreOrc", "false") // 使用HiveTableScanExec读取ORC表 .config("spark.hadoop.mapreduce.input.fileinputformat.split.maxsize", "67108864") .config("spark.sql.warehouse.dir", "hdfs://namenode:8020/user/hive/warehouse") .config("spark.local.dir", "F:/tmp/spark") .enableHiveSupport() .getOrCreate() // 删除临时表 ss.sql("DROP TABLE IF EXISTS temp.temp_ods_start_log") // 读取Hive ORC表数据到临时表 val df = ss.sql("CREATE TABLE IF NOT EXISTS temp.temp_ods_start_log AS SELECT substr(str, 1, 10) AS str10 FROM biods.ods_start_log WHERE dt='20210721'") // 触发Action算子 df.count() // 延迟线程以便观察Spark UI Thread.sleep(1000000) ss.stop() } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值