我编写了一个自定义Filter
,这只是提供AgeOffFilter
的一些额外内容。我的目标是根据自定义时间字段从Accumulo中删除条目。
public class CustomAgeOffFilter extends Filter {
它有以下概要:
public CustomAgeOffFilter()
@Override public boolean accept(k, v)
@Override public void init(source, options, env)
@Override public SortedKeyValueIterator<Key, Value> deepCopy(env)
@Override public OptionDescriber.IteratorOptions describeOptions()
@Override public boolean validateOptions(options)
//... and custom helper methods
我编译了我的类,将jar放在$ACCUMULO_HOME/lib
中的群集中的每个节点上并重新启动它。
我使用以下命令通过Accumulo Shell
设置迭代器:
setiter -class my.class.path.CustomAgeOffFilter -n customageoff -p 10 -scan -t myTable
运行config -t myTable -f customageoff
会返回:
---------+-------------------------------------------------+--------------------------------------
SCOPE | NAME | VALUE
---------+-------------------------------------------------+--------------------------------------
table | table.iterator.scan.customageoff .............. | 10,my.class.path.CustomAgeOffFilter
table | table.iterator.scan.customageoff.opt.ttl ...... | 1000
table | table.iterator.scan.customageoff.opt.custom1 .. | 123
---------+-------------------------------------------------+--------------------------------------
我正在使用Accumulo 1.7.2
到Cloudera 5.10.0
。
问题
虽然我的过滤器与我的自定义options
一起正确描述(使用上面的config
shell命令进行了验证),但在执行{{{}}时,它并未输入我的@override accept(k,v)
方法来自shell的1}}因为它似乎忽略了我的逻辑。它也没有打印出任何log4j语句,导致我相信它根本没有被执行,而是默认为其他东西。 (我没有成功连接远程调试器)。此外,在scan
参数上切换true
和false
会保留所有记录或删除它们,因此肯定会执行某些操作。
另一个观察是我的negate
没有被调用(因为它也没有产生我的log4j语句)。
注意:我的@override init(source, options, env)
和@override describeOptions()
方法都被调用并打印出日志告诉我。
我在这里做错了什么?感谢