我正在尝试将自定义过滤器部署到我的hbase群集。根据cloudera docs [1],默认情况下应启用过滤器jar的动态加载。
我的hbase.rootdir是/hbase
要部署我的自定义过滤器jar,我在hdfs中创建了目录/hbase/lib
并将我的jar放入其中。然后我尝试使用spark-hbase作业中的自定义过滤器:
object MyFilterTest {
def main(args: Array[String]): Unit = {
[...]
val filter = new MyFilter()
val scan = new Scan()
scan.setFilter(filter)
try {
val rdd = hbaseContext.hbaseRDD(TableName.valueOf("some_table"), scan)
val rowKeys = rdd.map(tuple => Bytes.toString(tuple._1.get))
rowKeys.saveAsTextFile(outputPath)
} finally {
sparkContext.stop()
}
}
}
但它失败了,因为ClassNotFoundException声明无法找到MyFilter。 要研究我将日志级别设置为DEBUG并在日志中查找org.apache.hbase.util.DynamicClassLoader条目,但根本找不到任何条目。由于这个事实,我试图明确地设置相关设置。在hbase-site.xml安全阀中,我把这个配置:
<property>
<name>hbase.dynamic.jars.dir</name>
<value>hdfs://myhdfs.host:8020/hbase/lib</value>
<final>true</final>
</property>
<property>
<name>hbase.local.dir</name>
<value>/tmp/hbase-root/local</value>
<final>true</final>
</property>
<property>
<name>hbase.use.dynamic.jars</name>
<value>true</value>
<final>true</final>
</property>
但是,它仍然没有用,并且没有日志表明hbase甚至试图从hdfs加载jar。
我忘了配置吗?
[1] https://www.cloudera.com/documentation/enterprise/5-8-x/topics/admin_hbase_filtering.html