return code -101 from org.apache.hadoop.hive.ql.exec.DDLTask问题解决

本文介绍了在使用Hive创建表时遇到的一个错误及其解决办法。该错误由于HBase和Zookeeper的jar包版本不一致引起,通过统一版本可以解决。

      运行Hive shell命令创建表时,报出下面这个错误:

java.lang.NoSuchMethodError: org.apache.hadoop.net.NetUtils.getInputStream(Ljava/net/Socket;)Ljava/io/InputStream;
        at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.java:437)
        at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:1124)
        at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:974)
        at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:86)
        at com.sun.proxy.$Proxy18.getProtocolVersion(Unknown Source)
        at org.apache.hadoop.hbase.ipc.WritableRpcEngine.getProxy(WritableRpcEngine.java:138)
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:711)
        at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:126)
        at org.apache.hadoop.hive.hbase.HBaseStorageHandler.getHBaseAdmin(HBaseStorageHandler.java:73)
        at org.apache.hadoop.hive.hbase.HBaseStorageHandler.preCreateTable(HBaseStorageHandler.java:147)
        at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.createTable(HiveMetaStoreClient.java:462)
        at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.createTable(HiveMetaStoreClient.java:455)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:74)
        at com.sun.proxy.$Proxy17.createTable(Unknown Source)
        at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:596)
        at org.apache.hadoop.hive.ql.exec.DDLTask.createTable(DDLTask.java:3776)
        at org.apache.hadoop.hive.ql.exec.DDLTask.execute(DDLTask.java:256)
        at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:144)
        at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:57)
        at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1355)
        at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1139)
        at org.apache.hadoop.hive.ql.Driver.run(Driver.java:945)
        at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)
        at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
        at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:413)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:756)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:614)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.DDLTask

     问题的原因:hbase或者zookeeper的包版本不一致引起的。

        解决方法:将正在运行的HBase和Zookeeper的jar包放到Hive 0.11版的lib目录下,删除hive下原来版本的jar包。

### Hadoop Hive MapRedTask 执行时遇到 `GC overhead limit exceeded` 错误的解决方案 当Hive作业执行过程中出现`GC overhead limit exceeded`错误时,表明垃圾回收器花费了过多的时间来尝试释放内存中的对象,但只成功回收了一小部分可用空间。这通常发生在JVM试图运行大量短生命周期的对象或存在内存泄漏的情况下。 #### 增加 JVM 参数配置 调整MapReduce任务的JVM参数可以有效缓解此问题。具体来说: - 提高堆大小以容纳更多的临时对象,减少频繁触发年轻代收集的可能性。 ```sql SET mapreduce.map.memory.mb=8096; SET mapreduce.reduce.memory.mb=8096; SET mapred.child.java.opts=-Xmx8000m; SET mapreduce.map.java.opts=-Xmx8096m; SET mapreduce.reduce.java.opts=-Xmx8096m; ``` - 使用更高效的垃圾回收算法,比如CMS(Concurrent Mark Sweep),它可以在应用程序继续运行的同时清理不再使用的对象,从而降低暂停时间。 ```sql SET mapreduce.map.java.opts="-Xmx6144m -XX:+UseConcMarkSweepGC"; SET mapreduce.reduce.java.opts="-Xmx6144m -XX:+UseConcMarkSweepGC"; ``` 这些设置有助于提高单个Mapper/Reducer实例的最大允许内存用量,并指定更适合大数据集处理场景下的垃圾回收策略[^3]。 #### 数据分布优化 对于大规模数据集的操作,除了增加硬件资源外,还可以考虑改进SQL查询逻辑以及如何分配工作负载给不同的节点。例如,在插入语句中添加`CLUSTER BY`子句可以让输入记录按照特定列分组并均匀分布在多个reducer之间,进而减轻单一进程的压力。 ```sql INSERT INTO TABLE target_table PARTITION (partition_column) SELECT * FROM source_table CLUSTER BY partition_key; ``` 这种方法不仅能够平衡各阶段的工作负荷,还能促进更好的本地化读取模式,进一步提升整体性能表现[^2]。 #### 控制并发度 适当控制并发的任务数目也是解决问题的一个方向。如果一次性启动太多的小型任务可能会导致整个集群资源紧张甚至耗尽。因此可以根据实际情况调整Split的数量或者设定合理的最大并行度限制。 ```bash /usr/bin/sqoop import \ --connect jdbc:mysql://hadoop01:3306/scrm \ --username root \ --password 123456 \ --query "select *,date_format(create_date_time,'%Y-%m-%d') as dt from employee where 1=1 and \$CONDITIONS" \ --hcatalog-database ods_dim \ --hcatalog-table ods_dim_scrm_employee_i \ --split-by id \ -m N # 这里的N代表期望创建多少个mapper去完成这次import操作 ``` 通过上述措施应该能较好地应对因`GC overhead limit exceeded`引发的各种挑战[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值