1、属性值被截断的问题
在数据实时接入阶段,使用NIFI ExecuteScript组件生成增、改、删SQL语句,将SQL语句放到了attribute中(详见视频教程http://mp.weixin.qq.com/s?__biz=MzIyNzkwNDE4Nw==&mid=2247486672&idx=1&sn=41793a61dc5f7ca6b6f9a34b4fa0ac02&chksm=e85b5304df2cda1247e0e6dfdddab7c68ff7b29e2f35b9d3eacb61baf13ec18d27367f78dfe9&scene=21#wechat_redirect)。
在NiFi中,session.putAttribute方法没有对属性值的长度进行限制。
在使用putAttribute方法时,可以将任何字符串值分配给属性,该字符串可以是任何长度。只要有足够的内存可用来创建和维护该属性的值,就可以将任何长度的字符串值分配给该属性。
然而,如果同一个流文件上设置重复的属性名,则会被视为同一属性,后面的属性值会覆盖先前的属性值。因此,在设置属性时应格外注意,以避免不必要的数据丢失。
这里会有一个不方便的地方,就是如果使用View Data Provenance菜单查看历史记录时,会发现由于attribute内容过多,显示不完整。出现这个情况,是因为属性nifi.provenance.repository.max.attribute.length的限制:
nifi.provenance.repository.max.attribute.length属性是Apache NiFi工具中的一个属性,用于指定属性值(即Attributes)的最大长度。
在NiFi中,Provenance Repository是一种跟踪数据流的机制,可用于了解从组件到组件的数据处理行为。Provenance事件会记录数据流中每个数据包的信息,包括数据包类型、大小、来源和目标等。该属性指定了Provenance事件中Attribute的最大长度。如果属性的实际长度超过此值,将无法存储Provenance事件。
默认情况下,该属性的值为 65536 字节(64 KB),这意味着属性的最大长度为 64 KB。可以通过编辑nifi.properties文件来更改该值。
例如,如果将属性设置为100000,则Provenance事件中的属性值不能超过100000字节。如果Provenance事件中的任何属性值超过此限制,则会被截断。
2、将SQL语句输出到FlowFile内容中
这一思路在视频中提了一下,没有详解,有朋友询问如何实现,这里给出方法。
首先,增、改、删三种SQL要输出到三个FlowFile中,因为如果输出到一个FlowFile,三个SQL以分号分割,在下一步执行时,会报错,这是JDBC机制决定的。
其次,输出的顺序应该是增、改、删的顺序,下一步的队列优先级应该设置为FIFO。
下面是实现代码:
var sql_array = all_sql.split(";");
for(var i=0;i<sql_array.length;i++)
{
if(sql_array[i].length>0)
{
var outputFlowFile = session.create();
outputFlowFile = session.write(outputFlowFile,
new OutputStreamCallback(function(outputStream) {
outputStream.write(sql_array[i].getBytes(StandardCharsets.UTF_8))
}));
session.transfer(outputFlowFile, REL_SUCCESS);
}
}
session.remove(flowFile);
3、JSON.parse方法long精度丢失的问题
如果处理的数据中有长整型,要注意此问题。尤其是主键值为长整型,由于精度丢失,会导致记录被覆盖。笔者遇到此类问题,使用Java语言做了处理,经测试没再发现此类问题。
感谢大家的持续关注!我会持续以文字和视频的形式分享实时数仓项目建设过程中,遇到的各种坑和一些经验。