如何使用 Nifi 将 Azure DataLakeStorage 中的 .parquet 数据转储到 Microsoft SQL 服务器数据库?
How can I dump the .parquet data that is in Azure DataLakeStorage to a Microsoft SQL Server database using Nifi?
找了很久的资料,怎么也得不到。我开始认为如果 .parquet 在 Azure DataLake Storage 中就无法完成。
我在 Azure DataLake Storage 中有一个包含子文件夹的文件夹。在这些子文件夹中有许多 .parquet。我设法使用 ListAzureDataLakeStorage + FetchAzureDataLakeStorage 组合将它们取出。然后我尝试通过 PutDatabaseRecord 传递它们(我认为这是数据库中转储的正确处理器)。
我想我已经很好地配置了 PutDatabaseRecord。但是在执行时它给我一个错误:“由于java.lang.NullPointerException:名称为空而无法处理 StandardFlowFileRecord,因此无法处理会话”。
我不确定我是否正确使用了 PutDatabaseRecord。我认为 PutDatabaseRecord 读取了将其内容解释为 .parquet 的流文件(它应该使用 ParquetReader 作为 RecordReader),能够将数据理解为记录。但令我惊讶的是,没有必要说明如何解释 .parquet,也没有必要说明如何将其列与数据库的列映射 table。它仍然没有像我想的那样工作,它需要流文件内容已经作为记录到达吗?
事实是我无法更好地解释自己,因为我不太了解 Nifi 中的记录或记录与读取 .parquet 的关系。
要么是我缺少处理器,要么是我配置有误。但我唯一找到的是 FetchParquet,它似乎能够读取 .parquet 并将其作为记录放入 FlowFile。但是,它只能与 ListHDFS 或 ListFile 一起使用,它们不允许我从 Azure Data Lake Storage 获取数据
经过多次测试(使用 ConvertRecord 和 QueryRecord 处理器),我得出的结论是问题出在 ParquetReader 对到达的 FlowFiles 内容的读取上。好吧,每个需要 ParquetReader 的处理器都会给出相同的错误。下载进入 ParquetReader 使用的处理器(无论它是什么)的 FlowFile 的内容并使用 .parquet 查看器我已经验证该内容是好的。
不知道该怎么办,我附上了具体错误的截图。我仍然不知道错误指的是什么“名称”。
Error Name is null
注意:我还在 Cloudera 上发布了我的问题,也许解释得更好。我留下 link 以防有人想看它。 (https://community.cloudera.com/t5/Support-Questions/How-can-I-dump-the-parquet-data-that-is-in-Azure/td-p/316020)
最后,最接近我遇到的错误的是这里 (https://issues.apache.org/jira/browse/NIFI-7817)。这似乎是与创建 ParquetReader 有关的错误。这是有道理的,因为它会命中任何使用 ParquetReader 的处理器。此外,FlowFiles甚至没有进入使用它的处理器。
我使用的是 Nifi 版本 1.12.1。我已经下载了 1.13.2 版本,它不再给出名称错误。此外,可以看到流文件已经进入处理器。在新版本 (https://nifi.apache.org/download.html) 的下载页面上,您可以访问发行说明和迁移指南,以了解相对于先前版本已修复的内容以及迁移时必须小心使用哪些处理器。
然而,即使数据进入处理器,它仍然给我一个错误,但它是不同的,我将在另一个post.
中打开它
找了很久的资料,怎么也得不到。我开始认为如果 .parquet 在 Azure DataLake Storage 中就无法完成。
我在 Azure DataLake Storage 中有一个包含子文件夹的文件夹。在这些子文件夹中有许多 .parquet。我设法使用 ListAzureDataLakeStorage + FetchAzureDataLakeStorage 组合将它们取出。然后我尝试通过 PutDatabaseRecord 传递它们(我认为这是数据库中转储的正确处理器)。
我想我已经很好地配置了 PutDatabaseRecord。但是在执行时它给我一个错误:“由于java.lang.NullPointerException:名称为空而无法处理 StandardFlowFileRecord,因此无法处理会话”。
我不确定我是否正确使用了 PutDatabaseRecord。我认为 PutDatabaseRecord 读取了将其内容解释为 .parquet 的流文件(它应该使用 ParquetReader 作为 RecordReader),能够将数据理解为记录。但令我惊讶的是,没有必要说明如何解释 .parquet,也没有必要说明如何将其列与数据库的列映射 table。它仍然没有像我想的那样工作,它需要流文件内容已经作为记录到达吗?
事实是我无法更好地解释自己,因为我不太了解 Nifi 中的记录或记录与读取 .parquet 的关系。
要么是我缺少处理器,要么是我配置有误。但我唯一找到的是 FetchParquet,它似乎能够读取 .parquet 并将其作为记录放入 FlowFile。但是,它只能与 ListHDFS 或 ListFile 一起使用,它们不允许我从 Azure Data Lake Storage 获取数据
经过多次测试(使用 ConvertRecord 和 QueryRecord 处理器),我得出的结论是问题出在 ParquetReader 对到达的 FlowFiles 内容的读取上。好吧,每个需要 ParquetReader 的处理器都会给出相同的错误。下载进入 ParquetReader 使用的处理器(无论它是什么)的 FlowFile 的内容并使用 .parquet 查看器我已经验证该内容是好的。 不知道该怎么办,我附上了具体错误的截图。我仍然不知道错误指的是什么“名称”。
Error Name is null
注意:我还在 Cloudera 上发布了我的问题,也许解释得更好。我留下 link 以防有人想看它。 (https://community.cloudera.com/t5/Support-Questions/How-can-I-dump-the-parquet-data-that-is-in-Azure/td-p/316020)
最后,最接近我遇到的错误的是这里 (https://issues.apache.org/jira/browse/NIFI-7817)。这似乎是与创建 ParquetReader 有关的错误。这是有道理的,因为它会命中任何使用 ParquetReader 的处理器。此外,FlowFiles甚至没有进入使用它的处理器。
我使用的是 Nifi 版本 1.12.1。我已经下载了 1.13.2 版本,它不再给出名称错误。此外,可以看到流文件已经进入处理器。在新版本 (https://nifi.apache.org/download.html) 的下载页面上,您可以访问发行说明和迁移指南,以了解相对于先前版本已修复的内容以及迁移时必须小心使用哪些处理器。
然而,即使数据进入处理器,它仍然给我一个错误,但它是不同的,我将在另一个post.
中打开它