使用 Pig 访问 Hbase

Posted

技术标签:

【中文标题】使用 Pig 访问 Hbase【英文标题】:Access Hbase with Pig 【发布时间】:2015-12-30 16:48:15 【问题描述】:

我正在尝试使用 Pig (0.15.0)HBase (1.1.2) 加载数据。我试过注册太多的 JAR,但没有成功。我可以使用 Java 访问它,但不能使用 Pig。下面我注册了所有 JAR。前五个,然后是我的 Java 代码使用的 lib/*.jar then target/alternateLocation/*.jar。一切都安装在我的本地 PC 上,HBase 在 HDFS 上运行。

--REGISTER /home/halmousli/hbase-1.1.2/lib/*.jar

--REGISTER /home/halmousli/mygit/Hbase/apachehbase/target/alternateLocation/*.jar

set hbase.zookeeper.quorum 'localhost'
data = LOAD 'hbase://emp'       USING org.apache.pig.backend.hadoop.hbase.HBaseStorage('professional:designation', '-loadKey true')
   as (id:bytearray,prof:CHARARRAY);
DUMP data;

pig 脚本无法验证:java.lang.RuntimeException:无法使用参数“[专业:指定,-loadKey true]”实例化“org.apache.pig.backend.hadoop.hbase.HBaseStorage” 解析失败:Pig 脚本解析失败: 猪脚本无法验证:java.lang.RuntimeException:无法使用参数“[专业:指定,-loadKey true]”实例化“org.apache.pig.backend.hadoop.hbase.HBaseStorage” 在 org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:199) 在 org.apache.pig.PigServer$Graph.parseQuery(PigServer.java:1735) 在 org.apache.pig.PigServer$Graph.access$000(PigServer.java:1443) 在 org.apache.pig.PigServer.parseAndBuild(PigServer.java:387) 在 org.apache.pig.PigServer.executeBatch(PigServer.java:412) 在 org.apache.pig.PigServer.executeBatch(PigServer.java:398) 在 org.apache.pig.tools.grunt.GruntParser.executeBatch(GruntParser.java:171) 在 org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:749) 在 org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:376) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:230) 在 org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:205) 在 org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:81) 在 org.apache.pig.Main.run(Main.java:631) 在 org.apache.pig.Main.main(Main.java:177) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.hadoop.util.RunJar.run(RunJar.java:221) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:136) 造成的: /home/halmousli/mygit/Pig/mavenpigtester/src/main/resources/hbaseGetter.pig,第 21 行,第 7 列> pig 脚本无法验证:java.lang.RuntimeException:无法实例化 'org.apache.pig.backend .hadoop.hbase.HBaseStorage' 带有参数 '[professional:designation, -loadKey true]' 在 org.apache.pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuilder.java:897) 在 org.apache.pig.parser.LogicalPlanGenerator.load_clause(LogicalPlanGenerator.java:3568) 在 org.apache.pig.parser.LogicalPlanGenerator.op_clause(LogicalPlanGenerator.java:1625) 在 org.apache.pig.parser.LogicalPlanGenerator.general_statement(LogicalPlanGenerator.java:1102) 在 org.apache.pig.parser.LogicalPlanGenerator.statement(LogicalPlanGenerator.java:560) 在 org.apache.pig.parser.LogicalPlanGenerator.query(LogicalPlanGenerator.java:421) 在 org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:191) ... 19 更多 引起:java.lang.RuntimeException:无法使用参数“[专业:指定,-loadKey true]”实例化“org.apache.pig.backend.hadoop.hbase.HBaseStorage” 在 org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:772) 在 org.apache.pig.parser.LogicalPlanBuilder.buildLoadOp(LogicalPlanBuilder.java:885) ... 25 更多 引起:java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:740) ... 26 更多 引起:java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Scan.setCacheBlocks(Z)V 在 org.apache.pig.backend.hadoop.hbase.HBaseStorage.initScan(HBaseStorage.java:427) 在 org.apache.pig.backend.hadoop.hbase.HBaseStorage.(HBaseStorage.java:368) ... 31 更多 2015-12-30 11:19:14,794 [main] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1200:Pig 脚本无法解析: 猪脚本无法验证:java.lang.RuntimeException:无法使用参数“[专业:指定,-loadKey true]”实例化“org.apache.pig.backend.hadoop.hbase.HBaseStorage” 日志文件中的详细信息:/home/halmousli/hadoop-2.6.0/sbin/pig_1451492353570.log

我不知道为什么我看到的原因是:java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Scan.setCacheBlocks。在我的 Java 代码中,我能够找到该函数并运行它,但不能在 Pig 中运行,而且我使用的是相同的 jar。

Scan scan = new Scan();
scan.setCacheBlocks(true); 

有什么建议可以解决这个问题或从 Pig 访问 HBase 的其他方式吗?谢谢。

【问题讨论】:

缩进你的代码!选中所有代码 sn-ps 并按 ctrl+k 【参考方案1】:

上述错误的原因是我的hadoop版本和hbase不兼容。我安装了 hbase-0.98.16-hadoop2 并且猪代码运行没有错误。

通常,当您看到 java.lang.NoSuchMethodError 时,可能表示版本之间不兼容。

【讨论】:

【参考方案2】:

如果你想使用 pig 访问 hbase,更安全的版本是 hbase 0.98 和 pig 0.15。我希望这能解决您的集成问题

【讨论】:

详细说明你的答案【参考方案3】:

HBase 社区在将 #setCacheBlocks() 的返回值从“void”更改为“Scan”时破坏了二进制兼容性。它期望从 HBase 0.98 中找到 setCacheBlocks(),但找到了 HBase 1.1.2 的版本。

一种解决方案是重新编译 Pig 以使用 HBase 1.1.2。

https://issues.apache.org/jira/browse/PIG-4743

【讨论】:

以上是关于使用 Pig 访问 Hbase的主要内容,如果未能解决你的问题,请参考以下文章

PIG - HBASE - 铸造值

何时使用 Hadoop、HBase、Hive 和 Pig?

无法使用 Pig 从 hbase 加载数据

使用 Pig 将 csv 导入 HBase

如何使用 Pig 和 HBaseStorage 存储到 HBase

使用 Pig 脚本将 Json 导入 Hbase