hive 动态分区太多问题

本文探讨了在Hive执行过程中出现的LeaseExpiredException错误,该错误与Hive动态分区有关。通过调整Hive配置参数hive.exec.max.dynamic.partitions和hive.exec.max.dynamic.partitions.pernode可以解决此问题。此外,还分析了可能的原因在于并行任务间的文件冲突。

hive 执行过程中会报下面的错误

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /tmp/hive/root/_tez_session_dir/a7af1ef7-d029-4ba9-98ac-139b60d39c07/.tez/application_1477555078714_0001/recovery/1/summary (inode 451603): File does not exist. Holder DFSClient_NONMAPREDUCE_1152536667_1 does not have any open files.
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:3521)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.completeFileInternal(FSNamesystem.java:3611)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.completeFile(FSNamesystem.java:3578)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.complete(NameNodeRpcServer.java:905)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.complete(ClientNamenodeProtocolServerSideTranslatorPB.java:544)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:640)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2313)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2309)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1724)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2307)

	at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1552)
	at org.apache.hadoop.ipc.Client.call(Client.java:1496)
	at org.apache.hadoop.ipc.Client.call(Client.java:1396)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:233)
	at com.sun.proxy.$Proxy12.complete(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.complete(ClientNamenodeProtocolTranslatorPB.java:501)
	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.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:278)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:194)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:176)
	at com.sun.proxy.$Proxy13.complete(Unknown Source)
	at org.apache.hadoop.hdfs.DFSOutputStream.completeFile(DFSOutputStream.java:2361)
	at org.apache.hadoop.hdfs.DFSOutputStream.closeImpl(DFSOutputStream.java:2338)
	at org.apache.hadoop.hdfs.DFSOutputStream.close(DFSOutputStream.java:2303)
	at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:72)
	at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:106)
	at org.apache.tez.dag.history.recovery.RecoveryService.serviceStop(RecoveryService.java:222)
	at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
	at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52)
	at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:80)
	at org.apache.hadoop.service.CompositeService.stop(CompositeService.java:157)
	at org.apache.hadoop.service.CompositeService.serviceStop(CompositeService.java:131)
	at org.apache.tez.dag.history.HistoryEventHandler.serviceStop(HistoryEventHandler.java:82)
	at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
	at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52)
	at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:80)
	at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:65)
	at org.apache.tez.dag.app.DAGAppMaster.stopServices(DAGAppMaster.java:1768)
	at org.apache.tez.dag.app.DAGAppMaster.serviceStop(DAGAppMaster.java:1949)
	at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
	at org.apache.tez.dag.app.DAGAppMaster$DAGAppMasterShutdownHandler$AMShutdownRunnable.run(DAGAppMaster.java:864)
	at java.lang.Thread.run(Thread.java:745)

网上搜索下,大概是说hive动态分区过大。需要修改如下参数(改大点)

set hive.exec.max.dynamic.partitions=100000;
set hive.exec.max.dynamic.partitions.pernode=100000;

其实本质原因可能是:运行了并行任务时,当一个任务结束时可能会删除掉其他任务的文件。当另一个任务需要获取他的文件时抛出异常。

 

Does your hive query create parallel MR jobs ? I had the same problem, and found that:LeaseExpiredException: No lease error on HDFS :

When the job ends he deletes /data/work/ folder. If few jobs are running in parallel the deletion will also delete the files of the another job. actually I need to delete /data/work/.

In other words this exception is thrown when the job try to access to files which are not existed anymore

 

转载于:https://my.oschina.net/u/2277929/blog/776618

<think>嗯,用户想知道Hive表的分区是否可以动态维护以及如何实现。我需要先回忆一下Hive动态分区相关知识。记得Hive支持动态分区,这样在插入数据时,系统可以根据指定的字段自动创建分区,而无需手动指定每个分区。 首先,动态分区的配置参数是什么来着?对了,需要设置hive.exec.dynamic.partition为true,还有hive.exec.dynamic.partition.mode设为nonstrict,这样允许所有分区都是动态的。用户可能遇到配置的问题,所以需要详细说明这些参数。 然后,动态分区的语法是怎样的?在插入数据时,使用INSERT...SELECT语句,并在PARTITION中指定分区字段,顺序要和SELECT中的字段对应。例如,如果按年和月分区,SELECT最后两个字段应该是year和month,这样Hive会自动根据这些值创建分区。 还要注意性能问题,比如动态分区数量太多可能导致资源消耗大,需要调整参数如hive.exec.max.dynamic.partitions。另外,动态分区通常和多级分区结合使用,比如年、月两级分区,这样管理更方便,查询效率也更高。 用户可能还关心动态分区和静态分区的区别,以及使用场景。动态分区适合分区值不确定的情况,而静态分区需要明确指定值。应用场景比如日志数据按天分区,或者电商订单按地区和时间分区。 需要确保回答结构清晰,分步骤说明配置方法、语法示例、注意事项等。同时,根据提供的引用内容,引用相关配置和案例,比如引用1和3提到的配置参数,引用4中的多级分区示例,以及引用2中Flink SQL的动态分区应用。 最后,生成相关问题,帮助用户进一步了解动态分区的优化、与静态分区的对比以及实际应用案例。这些应该覆盖用户可能感兴趣的扩展内容。</think>Hive表的动态分区维护方法可分为以下步骤实现: ### 一、动态分区配置方法 1. **启用动态分区功能** 需要先配置以下参数: ```sql SET hive.exec.dynamic.partition = true; -- 开启动态分区 SET hive.exec.dynamic.partition.mode = nonstrict; -- 允许全动态分区[^1][^3] ``` 2. **优化参数(可选)** 根据数据量调整以下参数: ```sql SET hive.exec.max.dynamic.partitions = 1000; -- 单个查询允许的最大动态分区数 SET hive.exec.max.dynamic.partitions.pernode = 100; -- 单节点允许的最大动态分区数 ``` ### 二、动态分区语法实现 通过`INSERT...SELECT`语句自动生成分区: ```sql INSERT INTO TABLE target_table PARTITION (partition_col1, partition_col2) SELECT col1, col2, ..., partition_col1_value, -- 动态分区字段值 partition_col2_value -- 必须作为SELECT的最后几列 FROM source_table; ``` *示例*:将订单表按`year`和`month`动态分区 ```sql INSERT INTO orders_partitioned PARTITION (year, month) SELECT order_id, amount, region, year(order_date), -- 动态分区字段1 month(order_date) -- 动态分区字段2 FROM raw_orders; ``` 此时Hive会自动根据`year(order_date)`和`month(order_date)`的值创建分区目录(如`/year=2023/month=10/`)[^4] ### 三、动态分区的核心特性 | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **自动分区创建** | 根据数据内容自动生成分区目录 | | **多级分区支持** | 最多支持3级分区(如`年/月/日`)[^4] | | **数据重分布** | 相同分区字段值的数据自动归集到同一分区 | ### 四、使用注意事项 1. **字段顺序要求** 动态分区字段必须作为`SELECT`语句的最后几列,且顺序与`PARTITION()`中声明的一致 2. **性能优化建议** - 避免单个查询产生过多分区(超过`hive.exec.max.dynamic.partitions`会导致任务失败) - 动态分区字段建议选择低基数列(如时间、地区等离散值) 3. **数据倾斜预防** 监控分区数据量分布,可通过`ANALYZE TABLE ... COMPUTE STATISTICS`分析分区信息 ### 五、典型应用场景 1. 日志分析系统:按`日期+小时`动态分区存储访问日志[^2] 2. 电商订单分析:按`地区+订单月份`动态分区 3. 物联网数据存储:按`设备类型+采集日期`动态分区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值