Spark查询Hive表时没有权限及无法找到表

使用spark-submit执行Python脚本操作Hive表时遇到权限错误,原因是HDFS的/tmp/hive目录权限不足。解决办法是删除HDFS和本地的/tmp/hive目录,并确保正确配置Hive的hive-site.xml,将其复制到Spark的conf目录,以解决找不到表的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用spark-submit执行python文件,进行hive表的操作时,会出现报错:

java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir: /tmp/hive on HDFS should be writable. Current permissions are: rwx------
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
        at org.apache.spark.sql.hive.client.HiveClientImpl.<init>(HiveClientImpl.scala:171)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)...

表示对hdfs下/tmp/hive目录的操作权限没有写权限。

解决方法为:

同时删HDFS与本地的目录/tmp/hive:

hadoop fs -rm -r /tmp/hive

rm -rf /tmp/hive

spark查询hive表时可能会出现找不到表或者视图的情况,该情况是由于spark未知hive的配置。

解决方案为:

在hive的配置目录conf下,找到hive的配置文件hive-site.xml

将该文件复制到spark的conf目录下

重新运行spark shell或者通过spark-submit运行文件


  
  
      

### 可能的原因分析 当遇到Spark读取Hive返回空数据的情况,可能有多种原因造成此现象。以下是几种常见的可能性: - **元数据一致**:如果Hive的元数据库与实际存储在HDFS上的文件之间存在同步,则可能导致查询结果为空[^2]。 - **分区问题**:对于分区而言,如果没有正确加载分区信息到Hive中,即使物理数据存在HDFS上也可能无法被识别。 - **权限设置当**:访问控制列(ACLs)或者其他安全机制可能会阻止Spark正常获取所需资源。 - **配置参数错误**:某些特定于环境的配置选项未正确设定也会影响最终的结果集大小。 ### 解决方案建议 针对上述提到的各种情况,这里提供一些具体的解决方案供尝试: #### 验证并同步元数据 确保所使用的`hive-site.xml`配置文件是最新的,并且包含了指向正确位置的信息。可以通过运行命令刷新外部或修复内部结构来保持两者之间的同步: ```sql MSCK REPAIR TABLE table_name; ``` #### 加载缺失的分区信息 如果是处理分区的话,在启动Spark会话之前先执行如下SQL语句以加载所有已存在的分区路径: ```scala val hiveContext = new HiveContext(sc) hiveContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict") hiveContext.sql(s"ALTER TABLE ${tableName} RECOVER PARTITIONS") ``` #### 检查权限配置 确认当前用户有足够的权利去读取目标格以及其所在目录下的任何子目录和文件。这通常涉及到调整Linux系统的文件系统级权限或者是启用/禁用Kerberos认证等功能。 #### 审核配置项 仔细审查集群环境中关于网络通信、内存分配等方面的关键属性值是否合理适当。特别是要注意那些影响Shuffle过程性能现的相关参数。 #### 测试最小化场景 构建最简单的测试案例来排除其他干扰因素的影响。比如创建一个新的小型样例数据集用于验证整个流程能否顺利工作而受原始大体量生产环境下复杂条件制约。 ```python from pyspark.sql import SparkSession spark = (SparkSession.builder.appName('TestApp') .config("spark.some.config.option", "some-value") # 添加必要的配置 .enableHiveSupport() .getOrCreate()) df_test = spark.sql('SELECT * FROM small_table LIMIT 10') # 使用一个小进行初步检测 df_test.show(truncate=False) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值