hive常见问题(持续更新。。。)

本文介绍了Hive在使用过程中常见的六种错误及其解决方法,包括动态分区数量限制、内存溢出、LZO压缩错误等问题,并提供了具体的配置调整建议。

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

1.在进行insert select操作的时候报如下错误

Caused by: org.apache.hadoop.hive.ql.metadata.HiveFatalException: [Error 20004]: Fatal error occurred when node tried to create too many dynamic partitions. The maximum number of dynamic partitions is controlled by hive.exec.max.dynamic.partitions and hive.exec.max.dynamic.partitions.pernode. Maximum was set to: 100
根据报错结果可以知道,动态分区数默认100,查询出来的结果已经超过了默认最大动态分区数,因此在跑程序的时候做如下设置:

##hive动态分区参数设置
##开启动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
##调大动态最大动态分区数
set hive.exec.max.dynamic.partitions.pernode=1000;
set hive.exec.max.dynamic.partitions=1000;

2.hive提交任务后报错

Invalid resource request, requested memory < 0, or requested memory > max configured, requestedMemory=1536, maxMemory=1024
这两个配置需要调整大一些:
yarn.scheduler.maximum-allocation-mb
yarn.nodemanager.resource.memory-mb
或者将虚拟机内存调大

3. hive内存溢出

2018-06-21 09:15:13     Starting to launch local task to process map join;      maximum memory = 3817865216
2018-06-21 09:15:29     Dump the side-table for tag: 0 with group count: 30673 into file: file:/tmp/data_m/753a5201-5454-431c-bcbb-d320d7cc0df6/hive_2018-06-21_09-03-15_808_550874019358135087-1/-local-10012/HashTable-Stage-11/MapJoin-mapfile20--.hashtable
2018-06-21 09:15:30     Uploaded 1 File to: file:/tmp/data_m/753a5201-5454-431c-bcbb-d320d7cc0df6/hive_2018-06-21_09-03-15_808_550874019358135087-1/-local-10012/HashTable-Stage-11/MapJoin-mapfile20--.hashtable (1769600 bytes)
2018-06-21 09:15:30     End of local task; Time Taken: 16.415 sec.
Execution completed successfully
MapredLocal task succeeded
Launching Job 4 out of 7
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1515910904620_2397048, Tracking URL = http://nma04-305-bigdata-030012222.ctc.local:8088/proxy/application_1515910904620_2397048/
Kill Command = /software/cloudera/parcels/CDH-5.8.3-1.cdh5.8.3.p0.2/lib/hadoop/bin/hadoop job  -kill job_1515910904620_2397048
Hadoop job information for Stage-11: number of mappers: 0; number of reducers: 0
2018-06-21 09:17:19,765 Stage-11 map = 0%,  reduce = 0%
Ended Job = job_1515910904620_2397048 with errors
Error during job, obtaining debugging information...
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

在上面的日志信息中看到:maximum memory = 3817865216
错误信息为:FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
导致错误的原因是由于join的时候其中一个表的数据量太大,导致OOM,错了导致MR被杀死,故日志中提示maximum memory = 3817865216,修改Hive SQL,限定数据范围,降低数据量后虽然也提示maximum memory = 3817865216,但是MR能正常执行了。

4. hive报lzo Premature EOF from inputStream错误

  • hql
insert overwrite table data_m.tmp_lxm20180624_baas_batl_dpiqixin_other_https_4g_ext
partition(prov_id,day_id,net_type)
select msisdn,sai,protocolid,starttime,prov_id,day_id,net_type
from dpiqixinbstl.qixin_dpi_info_4g
where day_id='20180624' and prov_id='811';
  • 报错信息
Error: java.io.IOException: java.lang.reflect.InvocationTargetException  
    at org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderCreationException(HiveIOExceptionHandlerChain.java:97)  
    at org.apache.hadoop.hive.io.HiveIOExceptionHandlerUtil.handleRecordReaderCreationException(HiveIOExceptionHandlerUtil.java:57)  
    at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:302)  
    at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.<init>(HadoopShimsSecure.java:249)  
    at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileInputFormatShim.getRecordReader(HadoopShimsSecure.java:363)  
    at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getRecordReader(CombineHiveInputFormat.java:591)  
    at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.<init>(MapTask.java:168)  
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:409)  
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)  
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)  
    at java.security.AccessController.doPrivileged(Native Method)  
    at javax.security.auth.Subject.doAs(Subject.java:396)  
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1550)  
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)  
Caused by: java.lang.reflect.InvocationTargetException  
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)  
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)  
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)  
    at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.initNextRecordReader(HadoopShimsSecure.java:288)  
    ... 11 more  
Caused by: java.io.EOFException: Premature EOF from inputStream  
    at com.hadoop.compression.lzo.LzopInputStream.readFully(LzopInputStream.java:75)  
    at com.hadoop.compression.lzo.LzopInputStream.readHeader(LzopInputStream.java:114)  
    at com.hadoop.compression.lzo.LzopInputStream.<init>(LzopInputStream.java:54)  
    at com.hadoop.compression.lzo.LzopCodec.createInputStream(LzopCodec.java:83)  
    at org.apache.hadoop.hive.ql.io.RCFile$ValueBuffer.<init>(RCFile.java:667)  
    at org.apache.hadoop.hive.ql.io.RCFile$Reader.<init>(RCFile.java:1431)  
    at org.apache.hadoop.hive.ql.io.RCFile$Reader.<init>(RCFile.java:1342)  
    at org.apache.hadoop.hive.ql.io.rcfile.merge.RCFileBlockMergeRecordReader.<init>(RCFileBlockMergeRecordReader.java:46)  
    at org.apache.hadoop.hive.ql.io.rcfile.merge.RCFileBlockMergeInputFormat.getRecordReader(RCFileBlockMergeInputFormat.java:38)  
    at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.<init>(CombineHiveRecordReader.java:65)  
    ... 16 more  

日志显示,在使用LZO进行压缩时出现Premature EOF from inputStream错误,该错误出现在stage-3

  • 问题查找
    根据lzo Premature EOF from inputStream错误信息google了一把,果然有人遇到过类似的问题,链接:
    http://www.cnblogs.com/aprilrain/archive/2013/03/06/2946326.html

  • 问题原因:
    如果输出格式是TextOutputFormat,要用LzopCodec,相应的读取这个输出的格式是LzoTextInputFormat。
    如果输出格式用SequenceFileOutputFormat,要用LzoCodec,相应的读取这个输出的格式是SequenceFileInputFormat。
    如果输出使用SequenceFile配上LzopCodec的话,那就等着用SequenceFileInputFormat读取这个输出时收到“java.io.EOFException: Premature EOF from inputStream”吧。

  • 解决方法:
    查看mapreduce.output.fileoutputformat.compress.codec配置信息

set mapreduce.output.fileoutputformat.compress.codec;
##配置参数如下:
mapreduce.output.fileoutputformat.compress.codec=com.hadoop.compression.lzo.LzoCodec

##将其修改为:
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec;
从新运行hql问题解决
##其他原因:
最近又碰到同样的报错信息,用上面的方法发现并不是这个问题,一番排查后结论为:
数据目录下的文件存在size为0的文件,也就是坏文件,解决办法是删除该文件

5.hive.exec.max.created.files:所有hive运行的map与reduce任务可以产生的文件的和

  • 在文件过多的情况下,进行hive查询,会出现文件数超出预设值,hive.exec.max.created.files参数默认值是100000,当超过默认值时加大参即可

6.Split metadata size exceeded 10000000

  • 输入文件包括大量小文件或者文件目录,造成Splitmetainfo文件超过默认上限
  • 修改默认作业参数mapreduce.jobtracker.split.metainfo.maxsize =100000000(默认值是1000000)
<think>首先,用户的问题是关于Hive HiveServer2连接数过多的问题处理方法。用户引用了几个参考,但明确指出这些引用仅供参考,我需要基于用户的问题来回答。 用户的问题:"我想解决HiveServer2连接数过多的问题 请问Hive HiveServer2 连接数过多 问题处理方法" 从引用中,我提取了相关信息: - 引用[2]提到HiveServer2连接数过多导致堵塞,建议修改内核参数如net.ipv4.tcp_keepalive_time等。 - 引用[3]提到HIVE-8596问题,但可能不直接相关。 - 引用[1]是关于无法读取HiveServer2配置的异常。 但用户强调这些引用仅供参考,所以我应该专注于解决连接数过多的问题。 我的回答需要遵循系统级指令: - 所有行内数学表达式用$...$格式。例如,如果有变量,如连接数,用$x$表示。 - 独立公式用$$...$$格式,但这里可能不需要数学公式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。用户提供了引用[1],[2],[3],所以我需要引用这些。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 回答结构: 1. **介绍问题**:简要解释HiveServer2连接数过多的原因和影响。 2. **解决方法**: - 检查当前连接状态。 - 调整内核参数。 - 优化Hive配置。 - 监控和预防。 3. **生成相关问题**:在最后添加相关问题。 关键解决方法从引用[2]: - 修改/etc/sysctl.conf文件中的内核参数,如: - net.ipv4.tcp_keepalive_time = 30 - net.ipv4.tcp_keepalive_probes = 2 - net.ipv4.tcp_keepalive_intvl = 2 - net.ipv4.tcp_fin_timeout = 30 - net.ipv4.tcp_syncookies = 1 - net.ipv4.tcp_tw_reuse = 1 - net.ipv4.tcp_tw_recycle = 1 - net.ipv4.ip_local_port_range = 1024 65000 - net.ipv4.tcp_max_syn_backlog = 8192 - net.ipv4.tcp_max_tw_buckets = 5000 - net.ipv4.route.gc_timeout = 100 - net.ipv4.tcp_syn_retries = 1 - net.ipv4.tcp_synack_retries = 1 - 然后执行sysctl -p使参数生效。 其他可能的方法: - 增加HiveServer2的资源或实例。 - 使用连接池。 - 检查是否有僵尸连接或优化查询。 在回答中引用[^2]作为参考。 确保回答用中文。 生成相关问题: - 基于主题,如: 1. 如何监控HiveServer2连接数? 2. 什么是CLOSE_WAIT状态,如何解决? 3. HiveServer2性能优化的其他方法? 最后,回答要真实可靠,基于Hive最佳实践。</think>### Hive HiveServer2 连接数过多问题处理方法 HiveServer2 连接数过多通常是由于客户端连接未正确关闭,导致大量 CLOSE_WAIT 状态连接堆积,进而引发服务堵塞或性能下降。这会影响查询执行效率,甚至造成集群资源耗尽[^2]。以下是结构化的解决方法,帮助您逐步排查和优化问题。解决过程需结合系统监控和配置调整,确保操作在测试环境验证后再应用到生产环境。 #### 步骤 1: 诊断当前连接状态 首先,确认连接数是否异常,并识别问题根源: - **检查连接状态**:在 HiveServer2 服务器上运行命令,查看端口 10000 的连接情况(10000 是 HiveServer2 默认端口)。 ```bash netstat -tunap | grep 10000 # 查看所有与 HiveServer2 相关的连接 ``` 如果输出显示大量 `CLOSE_WAIT` 状态(例如 `tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN` 后跟多行 `CLOSE_WAIT`),表明连接未释放[^2]。 - **分析原因**:常见原因包括: - 客户端未正确关闭连接(如 JDBC/ODBC 驱动未调用 `close()`)。 - 网络不稳定导致连接超时。 - HiveServer2 配置不当,无法及时回收空闲连接。 - ZooKeeper 配置问题(如引用[^1]所述,但本问题焦点在连接数)。 #### 步骤 2: 调整内核参数优化连接回收 针对 CLOSE_WAIT 堆积,修改 Linux 内核参数以加速连接回收。编辑 `/etc/sysctl.conf` 文件,添加或更新以下参数(基于引用[^2]推荐): ```bash # 打开文件编辑 sudo vi /etc/sysctl.conf # 添加以下内容 net.ipv4.tcp_keepalive_time = 30 # 空闲连接探测间隔(秒) net.ipv4.tcp_keepalive_probes = 2 # 探测失败次数后断开 net.ipv4.tcp_keepalive_intvl = 2 # 探测间隔(秒) net.ipv4.tcp_fin_timeout = 30 # FIN_WAIT_2 状态超时 net.ipv4.tcp_syncookies = 1 # 防止 SYN 洪水攻击 net.ipv4.tcp_tw_reuse = 1 # 允许重用 TIME_WAIT 连接 net.ipv4.tcp_tw_recycle = 1 # 快速回收 TIME_WAIT 连接(注意:在高并发环境中慎用) net.ipv4.ip_local_port_range = 1024 65000 # 扩大本地端口范围 net.ipv4.tcp_max_syn_backlog = 8192 # 半连接队列大小 net.ipv4.tcp_max_tw_buckets = 5000 # 最大 TIME_WAIT 连接数 net.ipv4.route.gc_timeout = 100 # 路由缓存超时 net.ipv4.tcp_syn_retries = 1 # SYN 重试次数 net.ipv4.tcp_synack_retries = 1 # SYN-ACK 重试次数 ``` - **应用更改**:运行 `sudo sysctl -p` 使参数生效。 - **效果**:这些参数减少连接保持时间,促进快速回收。例如,`tcp_fin_timeout = 30` 将 FIN_WAIT_2 状态超时从默认 60 秒缩短,降低 CLOSE_WAIT 累积风险[^2]。注意:`tcp_tw_recycle` 在 NAT 环境中可能导致问题,如果集群跨多节点,建议先测试。 #### 步骤 3: 优化 HiveServer2 配置 调整 Hive 自身配置以管理连接生命周期: - **修改 Hive 配置文件**:编辑 `hive-site.xml`,添加或更新以下属性: ```xml <!-- 设置空闲连接超时时间(单位:秒) --> <property> <name>hive.server2.session.check.interval</name> <value>3000</value> <!-- 检查间隔,默认 1 小时,建议缩短至 3000 秒(约 50 分钟) --> </property> <property> <name>hive.server2.idle.session.timeout</name> <value>1800</value> <!-- 空闲会话超时,默认 1 小时,建议 1800 秒(30 分钟) --> </property> <!-- 限制最大连接数 --> <property> <name>hive.server2.thrift.max.worker.threads</name> <value>100</value> <!-- 默认 500,根据服务器资源调整(例如 4 核 8GB 设为 100) --> </property> <!-- 启用连接池(如使用 HikariCP) --> <property> <name>hive.server2.transport.mode</name> <value>binary</value> </property> <property> <name>hive.server2.thrift.sasl.qop</name> <value>auth</value> </property> ``` - **重启 HiveServer2**:应用配置后重启服务: ```bash hive --service hiveserver2 --stop hive --service hiveserver2 --start ``` - **原理**:缩短 `idle.session.timeout` 强制关闭空闲连接,减少资源占用。连接池优化能复用连接,避免频繁创建新连接[^3]。 #### 步骤 4: 监控与预防措施 长期维护避免问题复发: - **实时监控**:使用工具如 `netstat` 定期检查: ```bash watch -n 60 "netstat -tunap | grep 10000 | awk '{print \$6}' | sort | uniq -c" # 每 60 秒统计连接状态 ``` - **日志分析**:检查 HiveServer2 日志(默认在 `/var/log/hive/hiveserver2.log`),搜索异常如 `Unable to read HiveServer2 configs`[^1],确保 ZooKeeper 健康。 - **最佳实践**: - 客户端代码确保调用 `close()` 方法释放连接。 - 在负载均衡环境下,部署多个 HiveServer2 实例分散连接。 - 升级 Hive 版本(如 Hive 3.x 修复了连接泄漏问题,如 HIVE-8596[^3])。 #### 注意事项 - **风险提示**:内核参数调整需评估服务器负载,过度激进可能影响其他服务。建议先在非生产环境测试。 - **效果评估**:实施后,监控 CLOSE_WAIT 连接数是否下降,查询延迟是否改善。如果问题持续,检查网络或客户端代码。 - **引用说明**:本方案基于 Hive 社区最佳实践和内核优化指南[^2],结合了连接管理经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值