hbase+flume 配置
测试hbase+flume 过程中遇到版本不兼容问题:
- hbase 0.98.2 单机版
- flume 1.7 1.6 1.5
遇到问题如下
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Put.setWriteToWAL(Z)Lorg/apache/hadoop/hbase/client/Put;
at org.apache.flume.sink.hbase.HBaseSink$3.run(HBaseSink.java:375)
at org.apache.flume.sink.hbase.HBaseSink$3.run(HBaseSink.java:370)
at org.apache.flume.auth.SimpleAuthenticator.execute(SimpleAuthenticator.java:50)
at org.apache.flume.sink.hbase.HBaseSink.putEventsAndCommit(HBaseSink.java:370)
at org.apache.flume.sink.hbase.HBaseSink.process(HBaseSink.java:340)
at org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:67)
at org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:145)
at java.lang.Thread.run(Thread.java:745)
最终看flume hbasesink代码观察到,putEventsAndCommit函数中有如下代码:
public Void run() throws Exception {
for (Row r : actions) {
if (r instanceof Put) {
((Put) r).setWriteToWAL(enableWal);
}
// Newer versions of HBase - Increment implements Row.
if (r instanceof Increment) {
((Increment) r).setWriteToWAL(enableWal);
}
}
table.batch(actions);
return null;
}
我在hbase 0.98的对应client的jar包中并没有发现 Increment 的setWriteToWAL方法。
然后我又打开了flume1.7的源码,观察到pom.xml文件里面引用的竟然hbase1.0相关的jar包,然后意识到自己的hbase的版本太低了,hbase版本和flume版本匹配有问题。
查看flume的release文档,观察到
从flume 1.6开始就已经开始使用hbase1.0版本了,hbase大版本号的变动还是比较大的啊
[FLUME-2657] - Upgrade to Hive 1.0
[FLUME-2658] - Upgrade to Hbase 1.0
因为是只是测试就暂时把flume的版本降低到1.5解决问题。
不太清楚是不是可以通过编译flume源码指定Hadoop版本号来解决flume和hbase版本的匹配问题,有时间再继续研究。有问题或者有好的想法留言交流,谢谢。