本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
- 🚀 魔都架构师 | 全网30W技术追随者
- 🔧 大厂分布式系统/数据中台实战专家
- 🏆 主导交易系统百万级流量调优 & 车联网平台架构
- 🧠 AIGC应用开发先行者 | 区块链落地实践者
- 🌍 以技术驱动创新,我们的征途是改变世界!
- 👉 实战干货:编程严选网
1 报错
bash
$ hive
Logging initialized using configuration in file:/opt/apps/emr/service/hive/package/hive-2.3.9/conf/hive-log4j2.properties Async: true
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Previous writer likely failed to write hdfs://xxx:9000/tmp/hivescratchdir/hive-root/root/_tez_session_dir/268b9c6d-0215-417d-889b-b7bd2a06edfa/hadoop-shim-0.9.2.jar. Failing because I am unlikely to write too.
at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:636)
at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:553)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:750)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:328)
at org.apache.hadoop.util.RunJar.main(RunJar.java:241)
Caused by: java.io.IOException: Previous writer likely failed to write hdfs://xxx:9000/tmp/hivescratchdir/hive-root/root/_tez_session_dir/268b9c6d-0215-417d-889b-b7bd2a06edfa/hadoop-shim-0.9.2.jar. Failing because I am unlikely to write too.
2 分析
这错误表明 Hive 无法在 HDFS 上写入临时文件,通常权限或 HDFS 存储空间问题,与 Hive 的临时目录权限和 Tez 会话相关。
3 排查
3.1 先检查 HDFS 临时目录权限
Hive 启动时会创建许多临时会话目录,尤其 Tez 引擎下,需确保当前用户对这些目录具有写入权限:
① 确认当前用户是否具有操作 HDFS 临时目录的权限
bash
# 检查 Hive 启动时的用户
whoami # 确认用户后执行以下命令来验证权限
$ hadoop fs -ls /tmp/hivescratchdir/hive-root/root/_tez_session_dir
drwx------ - root supergroup 0 2023-03-22 13:52 /tmp/hivescratchdir/hive-root/root/_tez_session_dir/098a8702-e67a-4a77-b073-eb49e290c3cd
drwx------ - root supergroup 0 2023-03-22 13:39 /tmp/hivescratchdir/hive-root/root/_tez_session_dir/0c4996c3-e8bc-4d09-a198-4f97051d3017
...
若当前用户对该目录没有写入权限,可切换为 hadoop 或 hdfs 用户,再尝试执行 Hive。
② 配置 Hive 的启动用户权限
若系统中 Hive 服务不是使用默认的 hadoop 用户,建议在 hive-site.xml 中增加 Hive 的 HDFS 操作权限配置:
xml
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
bash
# 检查并修复临时目录权限
$ hadoop fs -ls /tmp/hivescratchdir
Found 1 items
drwx-wx-wx - root supergroup 0 2022-12-19 14:45 /tmp/hivescratchdir/hive-root
hadoop fs -chmod -R 777 /tmp/hivescratchdir
# 若目录不存在,创建并设置权限
hadoop fs -mkdir -p /tmp/hivescratchdir
hadoop fs -chmod -R 777 /tmp/hivescratchdir
3.2 确保 Tez 守护进程和 Yarn 正常运行
Hive 通过 Tez 提交到 Yarn 进行执行,因此 Yarn 状态不正常也可能导致 Hive 失败。尝试查看 Yarn 资源管理器和 Tez 应用程序的状态:
bash
yarn application -list # 查看正在运行的应用
yarn logs -applicationId <Application_ID> # 获取特定 Tez 应用的日志
若看到大量失败或异常日志,可能需重启 Yarn 或 Tez 守护进程。
① 清理 Tez 的临时会话目录
bash
# 删除现有的 tez 会话目录
hadoop fs -rm -r /tmp/hivescratchdir/hive-root/root/_tez_session_dir
3.3 检查 Hive 临时目录
bash
# 检查并修复 Hive 临时目录权限
hadoop fs -chmod -R 777 /tmp/hive
若至此还不能解决,尝试:
a. 在 hive-site.xml 中添加或修改以下配置:
xml
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive/scratchdir</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive/resources</value>
</property>
b. 创建并设置这些目录的权限:
bash
hadoop fs -mkdir -p /tmp/hive/scratchdir
hadoop fs -mkdir -p /tmp/hive/resources
hadoop fs -chmod -R 777 /tmp/hive
3.4 确保 HDFS 服务正常运行
如验证 HDFS 剩余空间,确保 HDFS 上有足够的空间供 Hive 进行临时文件操作。若 HDFS 空间不足,Hive 会在写入临时目录时遇到错误。
bash
# 检查 HDFS 状态
$ hdfs dfsadmin -report
Configured Capacity: 105553760256 (98.30 GB)
Present Capacity: 62747512181 (58.44 GB)
DFS Remaining: 53281357173 (49.62 GB)
DFS Used: 9466155008 (8.82 GB)
DFS Used%: 15.09%
Replicated Blocks:
Under replicated blocks: 61
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Low redundancy blocks with highest priority to recover: 61
Pending deletion blocks: 0
Erasure Coded Block Groups:
Low redundancy block groups: 0
Block groups with corrupt internal blocks: 0
Missing block groups: 0
Low redundancy blocks with highest priority to recover: 0
Pending deletion blocks: 0
-------------------------------------------------
Live datanodes (1):
Name: 192.168.0.126:50010 (icv-etl-gateway)
Hostname: xxx
Decommission Status : Normal
Configured Capacity: 105553760256 (98.30 GB)
DFS Used: 9466155008 (8.82 GB)
Non DFS Used: 38279925760 (35.65 GB)
DFS Remaining: 53281357173 (49.62 GB)
DFS Used%: 8.97%
DFS Remaining%: 50.48%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 0
Last contact: Wed Nov 06 14:25:48 CST 2024
Last Block Report: Wed Nov 06 09:50:12 CST 2024
Num of Blocks: 3421
查看到有空间。
若仍有问题,可尝试重启 HDFS:
bash
# 重启 HDFS(如你有权限)
stop-dfs.sh
start-dfs.sh
若问题仍然存在,可查看详细日志:
bash
# 检查 Hive 日志
cat /opt/apps/emr/service/hive/package/hive-2.3.9/logs/hive.log
还要确认你的 Hadoop 用户有适当的权限操作这些目录。通常使用 hdfs 或 hadoop 用户运行相关服务会更好。