> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 使用 NiFi 数据管道将数据流式写入 ClickHouse

# 将 Apache NiFi 连接到 ClickHouse

export const CommunityMaintainedBadge = () => {
  return <div className="CommunityMaintainedBadge">
            <div className="CommunityMaintainedIcon">
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">
                <path d="M244.8,150.4a8,8,0,0,1-11.2-1.6A51.6,51.6,0,0,0,192,128a8,8,0,0,1-7.37-4.89,8,8,0,0,1,0-6.22A8,8,0,0,1,192,112a24,24,0,1,0-23.24-30,8,8,0,1,1-15.5-4A40,40,0,1,1,219,117.51a67.94,67.94,0,0,1,27.43,21.68A8,8,0,0,1,244.8,150.4ZM190.92,212a8,8,0,1,1-13.84,8,57,57,0,0,0-98.16,0,8,8,0,1,1-13.84-8,72.06,72.06,0,0,1,33.74-29.92,48,48,0,1,1,58.36,0A72.06,72.06,0,0,1,190.92,212ZM128,176a32,32,0,1,0-32-32A32,32,0,0,0,128,176ZM72,120a8,8,0,0,0-8-8A24,24,0,1,1,87.24,82a8,8,0,1,0,15.5-4A40,40,0,1,0,37,117.51,67.94,67.94,0,0,0,9.6,139.19a8,8,0,1,0,12.8,9.61A51.6,51.6,0,0,1,64,128,8,8,0,0,0,72,120Z"></path>
            </svg>
        </div>
            由社区维护
        </div>;
};

export const Image = ({img, alt, size = "lg", background}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  const backgroundColor = background === "white" ? "white" : background === "black" ? "rgb(31 31 28)" : undefined;
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} style={{
    backgroundColor
  }} />
      </Frame>
    </div>;
};

<CommunityMaintainedBadge />

<a href="https://nifi.apache.org/" target="_blank">Apache NiFi</a> 是一款开源工作流管理软件，用于自动化不同软件系统之间的数据流转。它支持创建 ETL 数据管道，并内置了 300 多种数据处理器。本分步教程将介绍如何将 Apache NiFi 连接到 ClickHouse，使其既可作为源端，也可作为目标端，并加载一个样本数据集。

<Steps>
  <Step title="准备连接信息" id="1-gather-your-connection-details">
    要通过 HTTP(S) 连接到 ClickHouse，你需要以下信息：

    | Parameter(s) | Description |
    | - | - |
    | `HOST` and `PORT` | 通常，使用 TLS 时端口为 8443；不使用 TLS 时端口为 8123。 |
    | `DATABASE NAME` | 默认情况下，存在一个名为 `default` 的数据库。请使用你要连接的数据库名称。 |
    | `USERNAME` and `PASSWORD` | 默认情况下，用户名为 `default`。请根据你的使用场景使用相应的用户名。 |

    你的 ClickHouse Cloud 服务的连接信息可在 ClickHouse Cloud 控制台中查看。
    选择一个服务，然后点击 **Connect**：

    <div className="ch-image-md">
      <Frame>
        <img src="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/GTkpPcjoRQ_okrH3/images/_snippets/cloud-connect-button.webp?fit=max&auto=format&n=GTkpPcjoRQ_okrH3&q=85&s=d059c1bbcc7317ff8df85b20189e65f4" alt="ClickHouse Cloud 服务连接按钮" width="998" height="932" data-path="images/_snippets/cloud-connect-button.webp" />
      </Frame>
    </div>

    选择 **HTTPS**。连接信息会显示在示例 `curl` 命令中。

    <div className="ch-image-md">
      <Frame>
        <img src="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/GTkpPcjoRQ_okrH3/images/_snippets/connection-details-https.webp?fit=max&auto=format&n=GTkpPcjoRQ_okrH3&q=85&s=f7a41f485276d8d238dbe28772bfa56c" alt="ClickHouse Cloud HTTPS 连接信息" width="1320" height="1184" data-path="images/_snippets/connection-details-https.webp" />
      </Frame>
    </div>

    如果你使用的是自管理 ClickHouse，则连接信息由你的 ClickHouse 管理员配置。
  </Step>

  <Step title="下载并运行 Apache NiFi" id="2-download-and-run-apache-nifi">
    对于全新部署，请从 [https://nifi.apache.org/download.html](https://nifi.apache.org/download.html) 下载二进制程序，然后运行 `./bin/nifi.sh start` 启动服务
  </Step>

  <Step title="下载 ClickHouse JDBC 驱动" id="3-download-the-clickhouse-jdbc-driver">
    1. 访问 GitHub 上的 <a href="https://github.com/ClickHouse/clickhouse-java/releases" target="_blank">ClickHouse JDBC 驱动发布页面</a>，查找最新的 JDBC 发布版本
    2. 在该发布版本页面中，点击 "Show all xx assets"，然后找到文件名中包含关键字 "shaded" 或 "all" 的 JAR 文件，例如 `clickhouse-jdbc-0.5.0-all.jar`
    3. 将该 JAR 文件放在 Apache NiFi 可访问的文件夹中，并记下其绝对路径
  </Step>

  <Step title={<>添加 <code>DBCPConnectionPool</code> Controller Service 并配置其属性</>} id="4-add-dbcpconnectionpool-controller-service-and-configure-its-properties">
    1. 要在 Apache NiFi 中配置 Controller Service，请点击“齿轮”按钮，进入 NiFi Flow Configuration 页面

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_01.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=f5ae305056832545c3c978c9982da585" size="sm" border alt="突出显示齿轮按钮的 NiFi Flow Configuration 页面" width="564" height="409" data-path="images/integrations/data-ingestion/etl-tools/nifi_01.webp" />

    2. 选择 Controller Services 选项卡，然后点击右上角的 `+` 按钮，添加新的 Controller Service

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_02.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=66a0b1a695179e269d23588a2022a1dd" size="lg" border alt="突出显示添加按钮的 Controller Services 选项卡" width="1999" height="636" data-path="images/integrations/data-ingestion/etl-tools/nifi_02.webp" />

    3. 搜索 `DBCPConnectionPool`，然后点击“Add”按钮

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_03.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=60b17bbb991fd8cc13c615c62601a629" size="lg" border alt="突出显示 DBCPConnectionPool 的 Controller Service 选择对话框" width="1999" height="1287" data-path="images/integrations/data-ingestion/etl-tools/nifi_03.webp" />

    4. 新添加的 `DBCPConnectionPool` 默认处于 Invalid 状态。点击“齿轮”按钮开始配置

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_04.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=ea701cc66a8e5afa61476914bfd4c30d" size="lg" border alt="显示处于 Invalid 状态的 DBCPConnectionPool 且突出显示齿轮按钮的 Controller Services 列表" width="1893" height="607" data-path="images/integrations/data-ingestion/etl-tools/nifi_04.webp" />

    5. 在“Properties”部分中，输入以下值

    | Property | 值 | 备注 |
    | - | - | - |
    | Database Connection URL | jdbc[https://HOSTNAME:8443/default?ssl=true](https://HOSTNAME:8443/default?ssl=true)true | 相应替换 connection URL 中的 HOSTNAME |
    | Database Driver Class Name | com.clickhouse.jdbc.ClickHouseDriver | |
    | Database Driver Locations | /etc/nifi/nifi-X.XX.X/lib/clickhouse-jdbc-0.X.X-patchXX-shaded.jar | ClickHouse JDBC 驱动 JAR 文件的绝对路径 |
    | Database User | default | ClickHouse 用户名 |
    | Password | password | ClickHouse 密码 |

    6. 在 Settings 部分中，将 Controller Service 的名称改为“ClickHouse JDBC”，以便后续识别

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_05.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=4fa0c9abd59a324f0db03523678957b4" size="lg" border alt="显示已填写属性的 DBCPConnectionPool 配置对话框" width="1586" height="1184" data-path="images/integrations/data-ingestion/etl-tools/nifi_05.webp" />

    7. 点击“lightning”按钮，然后点击“Enable”按钮，启用 `DBCPConnectionPool` Controller Service

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_06.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=3e0a2d317d7d8eff2401ec2575c2bf1c" size="lg" border alt="突出显示 lightning 按钮的 Controller Services 列表" width="2878" height="812" data-path="images/integrations/data-ingestion/etl-tools/nifi_06.webp" />

           <br />

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_07.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=6824bfe31062bdbeb8947661873d1b28" size="lg" border alt="启用 Controller Service 的确认对话框" width="1586" height="1172" data-path="images/integrations/data-ingestion/etl-tools/nifi_07.webp" />

    8. 检查 Controller Services 选项卡，确认该 Controller Service 已启用

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_08.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=5183beb6bf1bab0f604eafe174d31982" size="lg" border alt="显示已启用 ClickHouse JDBC 服务的 Controller Services 列表" width="1999" height="636" data-path="images/integrations/data-ingestion/etl-tools/nifi_08.webp" />
  </Step>

  <Step title={<>使用 <code>ExecuteSQL</code> 处理器从表中读取数据</>} id="5-read-from-a-table-using-the-executesql-processor">
    1. 添加 `ExecuteSQL` 处理器，以及相应的上游和下游处理器

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_09.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=4631790090dc97b27a9a16ae0d13ff04" size="md" border alt="NiFi 画布，显示工作流中的 ExecuteSQL 处理器" width="768" height="316" data-path="images/integrations/data-ingestion/etl-tools/nifi_09.webp" />

    2. 在 `ExecuteSQL` 处理器的 "Properties" 部分中，填写以下值

       | Property | Value | Remark |
       | - | - | - |
       | Database Connection Pooling Service | ClickHouse JDBC | 选择为 ClickHouse 配置的 Controller Service |
       | SQL select query | SELECT \* FROM system.metrics | 在此输入查询 |

    3. 启动 `ExecuteSQL` 处理器

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_10.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=2df6c600b48abb81943d1b6e99c90a71" size="lg" border alt="已填写属性的 ExecuteSQL 处理器配置" width="858" height="220" data-path="images/integrations/data-ingestion/etl-tools/nifi_10.webp" />

    4. 要确认查询已成功处理，请检查输出队列中的一个 `FlowFile`

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_11.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=bbd9e56b5b183645aced66bc89313564" size="lg" border alt="队列列表对话框，显示可供检查的 FlowFile" width="1956" height="794" data-path="images/integrations/data-ingestion/etl-tools/nifi_11.webp" />

    5. 将视图切换为 "formatted"，查看输出 `FlowFile` 的结果

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_12.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=a44219b7ef11fd050aee76e4db718787" size="lg" border alt="FlowFile 内容查看器，以 formatted 视图显示查询结果" width="1762" height="1500" data-path="images/integrations/data-ingestion/etl-tools/nifi_12.webp" />
  </Step>

  <Step title={<>使用 <code>MergeRecord</code> 和 <code>PutDatabaseRecord</code> 处理器向表中写入数据</>} id="6-write-to-a-table-using-mergerecord-and-putdatabaserecord-processor">
    1. 要在一次插入中写入多行，首先需要将多条记录合并为一条记录。这可以通过 `MergeRecord` 处理器实现

    2. 在 `MergeRecord` 处理器的 "Properties" 部分中，填入以下值

       | Property | Value | Remark |
       | - | - | - |
       | Record Reader | `JSONTreeReader` | 选择合适的记录读取器 |
       | Record Writer | `JSONReadSetWriter` | 选择合适的记录写入器 |
       | Minimum Number of Records | 1000 | 将此值设大一些，以便至少合并这么多行来组成一条记录。默认值为 1 行 |
       | Maximum Number of Records | 10000 | 将此值设为高于 "Minimum Number of Records" 的数字。默认值为 1,000 行 |

    3. 要确认多条记录已合并为一条记录，请检查 `MergeRecord` 处理器的输入和输出。注意，输出是一个包含多条输入记录的数组

       输入

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_13.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=13d396219cb5b594ce60094ba0a6bdf3" size="sm" border alt="显示单条记录的 MergeRecord 处理器输入" width="624" height="306" data-path="images/integrations/data-ingestion/etl-tools/nifi_13.webp" />

       输出

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_14.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=7e5ee4a148e330925db8fe691f086109" size="sm" border alt="显示合并后记录数组的 MergeRecord 处理器输出" width="707" height="501" data-path="images/integrations/data-ingestion/etl-tools/nifi_14.webp" />

    4. 在 `PutDatabaseRecord` 处理器的 "Properties" 部分中，填入以下值

       | Property | Value | Remark |
       | - | - | - |
       | Record Reader | `JSONTreeReader` | 选择合适的记录读取器 |
       | Database Type | Generic | 保持默认值 |
       | Statement Type | INSERT | |
       | Database Connection Pooling Service | ClickHouse JDBC | 选择 ClickHouse 控制器服务 |
       | Table Name | tbl | 在此输入你的表名 |
       | Translate Field Names | false | 设为 "false"，这样插入的字段名必须与列名一致 |
       | Maximum Batch Size | 1000 | 每次 insert 的最大行数。该值不应低于 `MergeRecord` 处理器中 "Minimum Number of Records" 的值 |

    5. 要确认每次 insert 都包含多行，请检查表中的行数是否每次至少按 `MergeRecord` 中定义的 "Minimum Number of Records" 的值递增。

           <Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/lglfVuV91R2cebDB/images/integrations/data-ingestion/etl-tools/nifi_15.webp?fit=max&auto=format&n=lglfVuV91R2cebDB&q=85&s=5961e30c4f1f648564555c881053ad16" size="sm" border alt="显示目标端表中行数的查询结果" width="828" height="1306" data-path="images/integrations/data-ingestion/etl-tools/nifi_15.webp" />

    6. 恭喜——你已成功使用 Apache NiFi 将数据加载到 ClickHouse 中！
  </Step>
</Steps>
