使用NiFi HBase_1_1_2_ClientMapCacheService

时间:2018-04-18 17:31:55

标签: apache-nifi

我需要从我开发的流程中删除重复项,它可以多次收到相同的$ {filename}。我尝试将HBase_1_1_2_ClientMapCacheService与DetectDuplicate一起使用(我正在使用NiFi v1.4),但发现它可以让一些重复通过。如果我使用DistributedMapCache(ClientService和Server),我不会得到任何重复。为什么我会收到一些HBase Cache的副本?

作为测试,我在所有群集节点(4个节点)上列出了一个包含20,000个文件的目录(ListSFTP),并传递给DetectDuplicate(使用HBase Cache服务)。它路由20,020到"非重复",有趣的是该表实际上有20,000行。

1 个答案:

答案 0 :(得分:2)

不幸的是,我认为这是由于HBase提供的操作有限制。

DetectDuplicate处理器依赖于操作“getAndPutIfAbsent”,该操作应返回原始值,然后设置新值(如果不存在)。例如,第一次通过它将返回null并设置新值,表明它不是重复的。

HBase本身不支持此操作,因此HBase映射缓存客户端中此方法的实现执行此操作:

V got = get(key, keySerializer, valueDeserializer);
boolean wasAbsent = putIfAbsent(key, value, keySerializer, valueSerializer);

if (! wasAbsent) return got;
      else return null;

因为这是两个单独的呼叫,可能存在竞争条件......

想象一下节点1调用第一行并获取null,但是然后节点2执行get和putIfAbsent,现在当节点1调用putIfAbsent时它会变为false,因为节点2刚刚填充了缓存,所以现在节点1返回空值从最初的获取...这两个看起来像DetectDuplicate非重复。

在DistributedMapCacheServer中,它会锁定每个操作的整个缓存,以便它可以提供原子getAndPutIfAbsent。