Apache Nifi MergeContent输出数据不一致?

时间:2018-06-05 14:28:45

标签: hadoop hdfs cloudera apache-nifi hortonworks-data-platform

使用nifi相当新。需要设计方面的帮助。 我正在尝试使用HDFS目录中的虚拟csv文件(现在)创建一个简单的流,并将一些文本数据添加到每个流文件中的每个记录。

传入文件:

dummy1.csv
dummy2.csv
dummy3.csv

内容:

"Eldon Base for stackable storage shelf, platinum",Muhammed MacIntyre,3,-213.25,38.94,35,Nunavut,Storage & Organization,0.8
"1.7 Cubic Foot Compact ""Cube"" Office Refrigerators",BarryFrench,293,457.81,208.16,68.02,Nunavut,Appliances,0.58
"Cardinal Slant-D Ring Binder, Heavy Gauge Vinyl",Barry French,293,46.71,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39
...

期望的输出:

d17a3259-0718-4c7b-bee8-924266aebcc7,Mon Jun 04 16:36:56 EDT 2018,Fellowes Recycled Storage Drawers,Allen Rosenblatt,11137,395.12,111.03,8.64,Northwest Territories,Storage & Organization,0.78
25f17667-9216-4f1d-b69c-23403cd13464,Mon Jun 04 16:36:56 EDT 2018,Satellite Sectional Post Binders,Barry Weirich,11202,79.59,43.41,2.99,Northwest Territories,Binders and Binder Accessories,0.39
ce0b569f-5d93-4a54-b55e-09c18705f973,Mon Jun 04 16:36:56 EDT 2018,Deflect-o DuraMat Antistatic Studded Beveled Mat for Medium Pile Carpeting,Doug Bickford,11456,399.37,105.34,24.49,Northwest Territories,Office Furnishings,0.61

流程 enter image description here splitText- enter image description here ReplaceText- enter image description here MergeContent -

enter image description here enter image description here

(这可能是一种很难实现我想要获得的东西的方式,但我在某处看到uuid最适合生成唯一的会话ID。所以想到从输入数据中提取每一行到流文件并生成uuid)

但不知何故,正如你所看到的那样,数据的顺序正在搞乱。前3行在输出中不相同。但是,我使用的测试数据(50000个条目)似乎在其他一些行中有数据。多次测试通常显示2001年之后的数据顺序变化。

是的,我确实在这里搜索过类似的问题并尝试在合并中使用碎片整理方法,但它没有用。如果有人能够解释这里发生的事情以及如何以相同的方式获取每个记录的唯一session_id,时间戳,我将不胜感激。我需要更改或修改一些参数以获得正确的输出吗?如果有更好的方法,我愿意接受建议。

1 个答案:

答案 0 :(得分:4)

首先,感谢您做出如此精细而详细的回复。我觉得你对处理器的运行方式有很多疑问!

  

合并的排序仅在碎片整理模式下得到保证,因为它会根据碎片索引将流文件按顺序排列。我不确定为什么这样做不会起作用,但如果您可以使用显示问题的示例数据创建流模板,那么调试将会有所帮助。

我将尝试再次使用干净的模板复制此方法。可能是一些参数问题而且HDFS编写器无法写入。

  

我不确定您的流程的意图是重新合并已拆分的原始CSV,还是将几个不同的CSV合并在一起。碎片整理模式仅重新合并原始CSV,因此如果ListHDFS拾取10个CSV,则在拆分和重新合并后,您应该再次拥有10个CSV。

是的,这正是我所需要的。拆分数据并将其连接到相应的文件。我没有特别(还)需要再次加入输出。

  

将CSV分解为每个流文件1行以操作每一行的方法是一种常见的方法,但如果您有许多大型CSV文件,它将无法很好地执行。一种更有效的方法是尝试并操纵数据而不分割。这通常可以使用面向记录的处理器来完成。

  1. 我纯粹本能地使用这种方法,并没有意识到这是一种常见的方法。有时数据文件可能非常大,这意味着单个文件中有超过一百万条记录。这不是群集中的i / o问题吗?因为这意味着每条记录=一个流文件=一个唯一的uuid。 nifi可以处理多少个流量文件? (我知道这取决于群集配置,并将尝试从hdp admin获取有关群集的更多信息)
  2. 你建议"尝试并操纵数据而不分裂" ?你可以给一个例子或模板或处理器使用吗?
  3.   

    在这种情况下,您需要为CSV定义一个架构,其中包含数据中的所有列,以及会话ID和时间戳。然后使用UpdateRecord处理器,您将使用记录路径表达式,如/ session_id = $ {UUID()}和/ timestamp = $ {now()}。这将逐行流式传输内容并更新每条记录并将其写回,将其全部保存为一个流文件。

    这看起来很有希望。您可以共享一个简单的模板,从hdfs>处理>写入hdfs文件中提取文件,但不进行拆分吗?

    由于限制,我不愿意共享模板。但是,让我看看我是否可以创建一个通用的模板,我将分享

    感谢您的智慧! :)