将压缩的文本文件发布到 apache nifi

Posted

技术标签:

【中文标题】将压缩的文本文件发布到 apache nifi【英文标题】:Post a zipped textfile to apache nifi 【发布时间】:2018-07-09 14:06:29 【问题描述】:

必须通过 HTTP 或 HTTPS 将 zip 格式的压缩文本文件发送到 apache nifi。在那里它必须被解压缩并存储在 HDFS 上。迄今为止的努力都没有结果。

测试文件是压缩文本文件blabla.txt


Python 帖子

import requests
requests.post('http://example.com/endpoint',
              files='files': open('blabla.zip', 'rb'))

Nifi 进程

我最好的尝试是使用以下 Nifi 处理器:

HandleHttpRequest RouteOnAttribute(在端点/endpoint 上过滤) 流文件的内容是:

--e313bde14db343d99c74fbb129fba9ac 内容处置:表单数据;名称="文件";文件名="blabla.zip"

PKh|�L��G blabla.txtK,NAB�)�&PKh|�L��G $ blabla.txt f�-.����

提取文本

文件 = ^Content\-Disposition.*?(^PK.*)$.*?^\-\-.*?\-\-$ 文件名 = ^Content\-Disposition\: form\-data\; name\=\"files\"\; filename\=\"(.*?)\"

ReplaceText:将 .* 替换为 $(file) 以将流文件的全部内容替换为 file。流文件内容现在是:

PKh|�L��G blabla.txtK,NAB�)�&PKh|�L��G $ blabla.txt f�-.����

UnpackContent 抛出以下错误:

09:43:04 CEST - 所有节点 - 错误 UnpackContent[id=d1973e21-d051-1530-ffff-fffff1485298] 无法解压 StandardFlowFileRecord[uuid=2d63555b-ff0f-4383-99d1-496df13c7a00,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=15308=78768节] =1], offset=24932, length=201],offset=0,name=1054961836825343,size=201] 由于 org.apache.nifi.processor.exception.ProcessException: IOException 从 UnpackContent[id=d1973e21-d051- 1530-ffff-fffff1485298]:java.util.zip.ZipException:设置的代码长度无效;路由失败:从 UnpackContent [id=d1973e21-d051-1530-ffff-fffff1485298] 引发的 IOException:java.util.zip.ZipException:设置的代码长度无效


不提取/替换

HandleHttpRequest RouteOnAttribute(在端点/endpoint 上过滤) 流文件的内容是:

--e313bde14db343d99c74fbb129fba9ac 内容处置:表单数据;名称="文件";文件名="blabla.zip"

PKh|�L��G blabla.txtK,NAB�)�&PKh|�L��G $ blabla.txt f�-.����

UnpackContent 产生以下错误:

09:04:16 CEST - 所有节点 - 错误 UnpackContent[id=4ffa337f-0a73-197a-9965-c1334338ebd8] 无法解压 StandardFlowFileRecord[uuid=93cad6cf-e19b-4d0b-9d2d-54e38b9b8bed,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1530878764]容器=1], offset=21130, length=312],offset=0,name=1052634174590117,size=312] 由于 org.apache.nifi.processor.exception.ProcessException: IOException 从 UnpackContent[id=4ffa337f-0a73- 197a-9965-c1334338ebd8]:java.util.zip.ZipException:意外记录签名:0X65632D2D;路由失败:从 UnpackContent [id=4ffa337f-0a73-197a-9965-c1334338ebd8] 引发的 IOException:java.util.zip.ZipException:意外记录签名:0X65632D2D

【问题讨论】:

你知道压缩后payload的文件编码是什么吗? 如果我在记事本 ++ 中打开本地 zip 文件,则表示它是 ANSI 文件格式。如果我下载 zip(解压失败),它会显示 UTF-8 我怀疑除了您看到的文件处理问题之外还有编码问题。文件是否从 Windows 机器移动到基于 Linux 的服务器,最后又回到 Windows 机器? 文件从 windows 机器移动到 linux 机器。我可以在文件内容中看到它们与我本地机器上的文件不同。我尝试使用 NiFi 的功能来更改编码,但我无法找到 ANSI。 我在发送压缩文件之前通过base64编码“解决”了这个问题。 【参考方案1】:

您是否尝试替换 ZIP 文件本身中的文本?如果您要修改内容,我认为 UnpackContent 处理器应该在 Extract/ReplaceText 之前。

【讨论】:

我不想替换任何内容!我只想获取 FlowFile 内容的 zip 部分。 我用跳过extract/replace 步骤时发生的情况更新了问题【参考方案2】:

为了使java.util.zip 工作,您只需要流文件中的压缩内容。您在上面引用的内容包括未压缩的内容:

--e313bde14db343d99c74fbb129fba9ac Content-Disposition: form-data; name="files"; filename="blabla.zip"

当 zip 实用程序遇到该字符串时,它会引发异常。所以你做了合理的事情,并试图从流文件中删除元数据。不幸的是,该操作会损坏 zip 内容,这就是您看到该错误的原因。您可以更改数据流以使用 ListenHTTP 处理器吗?在 NiFi documentation 和 blog post 关于通过 HTTP 与 NiFi 通信的文章中可以找到对这些处理器的一个不错的概述。

【讨论】:

我读了很多帖子说 ListenHTTP 没有适当的功能,而 HandleHttpRequest 是要走的路。 ListenHTTP 是否有不同的方式接收相同的消息?

以上是关于将压缩的文本文件发布到 apache nifi的主要内容,如果未能解决你的问题,请参考以下文章

Apache nifi 第二篇(小白初试) nifi数据对接流程初次尝试

拆分文本处理器中异常的数组边界

Apache Nifi 将文件移动到新的 hdfs 文件夹以获取小于当前日期的文件

Apache Kafka/NiFi 可以将数据转换为 JSON 文件吗?

将 Apache NiFi 添加到现有的 Hortonworks HDP 集群

一个文件汇集搜索系统(NiFi + ELK)