EMR中Pig脚本集成HBase加载数据失败问题排查
我来帮你搞定这个问题!你在使用Pig 0.17.0和HBase 1.3.1执行交互脚本时碰到的这个错误,本质是版本兼容性导致的。先把你遇到的错误栈贴出来:
Caused by: java.lang.RuntimeException: could not instantiate 'org.apache.pig.backend.hadoop.hbase.HBaseStorage' with arguments
at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:770)
at org.apache.pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuilder.java:885)
... 38 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:738)
... 39 more
Caused by: java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Scan.setCacheBlocks(Z)V
at org.apache.pig.backend.hadoop.hbase.HBaseStorage.initScan(HBaseStorage.java:429)
at org.apache.pig.backend.hadoop.hbase.HBaseStorage.(HBaseStorage.java:370)
... 44 more
问题原因
Pig 0.17.0默认依赖的HBase版本要高于1.3.1,org.apache.hadoop.hbase.client.Scan.setCacheBlocks(Z)V这个方法是在更高版本的HBase中新增的,而你的HBase 1.3.1里并没有这个方法,导致Pig的HBaseStorage类初始化时找不到对应方法,抛出错误。
解决方案
这里给你几个可行的解决办法:
更换兼容的Pig版本:查找和HBase 1.3.1官方兼容的Pig版本(比如Pig 0.16.0,可参考官方兼容性矩阵确认),替换当前的Pig安装包后重新运行脚本。
替换Pig自带的HBase依赖jar:
- 找到你的Pig安装目录下的
lib文件夹,备份其中所有以hbase-开头的jar包; - 从HBase 1.3.1的安装目录
lib文件夹中,复制对应的hbase-client-1.3.1.jar、hbase-common-1.3.1.jar、hbase-server-1.3.1.jar等核心jar包到Pig的lib目录,替换原来的高版本jar; - 重启Pig相关服务后再执行脚本。
- 找到你的Pig安装目录下的
运行脚本时指定HBase 1.3.1的jar包:
不需要修改Pig的默认依赖,在执行Pig脚本时通过参数指定优先使用HBase 1.3.1的jar包,命令示例如下:pig -Dpig.additional.jars=/path/to/hbase-1.3.1/lib/hbase-client-1.3.1.jar,/path/to/hbase-1.3.1/lib/hbase-common-1.3.1.jar,/path/to/hbase-1.3.1/lib/hbase-server-1.3.1.jar your_pig_script.pig注意把路径替换成你实际的HBase安装路径,并且要包含所有相关的HBase核心jar包,避免遗漏。
注意事项
如果是在集群环境中操作,要确保所有节点的Pig依赖都同步更新,或者通过分布式缓存机制让所有任务节点都能获取到正确版本的HBase jar包,避免出现节点间依赖不一致的问题。
内容的提问来源于stack exchange,提问作者Visweswaran Radhakrishnan

