Apache Doris 入门教程13:数据导入之Stream load

Stream load 是一个同步的导入方式,用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 同步执行导入并返回导入结果。用户可直接通过请求的返回体判断本次导入是否成功。

Stream load 主要适用于导入本地文件,或通过程序导入数据流中的数据。

基本原理

下图展示了 Stream load 的主要流程,省略了一些导入细节。

                         ^      +
                         |      |
                         |      | 1A. User submit load to FE
                         |      |
                         |   +--v-----------+
                         |   | FE           |
4. Return result to user |   +--+-----------+
                         |      |
                         |      | 2. Redirect to BE
                         |      |
                         |   +--v-----------+
                         +---+Coordinator BE| 1B. User submit load to BE
                             +-+-----+----+-+
                               |     |    |
                         +-----+     |    +-----+
                         |           |          | 3. Distrbute data
                         |           |          |
                       +-v-+       +-v-+      +-v-+
                       |BE |       |BE |      |BE |
                       +---+       +---+      +---+

Stream load 中,Doris 会选定一个节点作为 Coordinator 节点。该节点负责接数据并分发数据到其他数据节点。

用户通过 HTTP 协议提交导入命令。如果提交到 FE,则 FE 会通过 HTTP redirect 指令将请求转发给某一个 BE。用户也可以直接提交导入命令给某一指定 BE。

导入的最终结果由 Coordinator BE 返回给用户。

支持数据格式

目前 Stream Load 支持数据格式:CSV(文本)、JSON

1.2+ 支持PARQUET 和 ORC

基本操作

创建导入

Stream Load 通过 HTTP 协议提交和传输数据。这里通过 curl 命令展示如何提交导入。

用户也可以通过其他 HTTP client 进行操作。

curl --location-trusted -u user:passwd [-H ""...] -T data.file -XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load

# Header 中支持属性见下面的 ‘导入任务参数’ 说明
# 格式为: -H "key1:value1"

示例:

curl --location-trusted -u root -T date -H "label:123" http://abc.com:8030/api/test/date/_stream_load

创建导入的详细语法帮助执行 HELP STREAM LOAD 查看, 下面主要介绍创建 Stream Load 的部分参数意义。

签名参数

  • user/passwd

    Stream load 由于创建导入的协议使用的是 HTTP 协议,通过 Basic access authentication 进行签名。Doris 系统会根据签名验证用户身份和导入权限。

导入任务参数

Stream Load 由于使用的是 HTTP 协议,所以所有导入任务有关的参数均设置在 Header 中。下面主要介绍了 Stream Load 导入任务参数的部分参数意义。

  • label

    导入任务的标识。每个导入任务,都有一个在单 database 内部唯一的 label。label 是用户在导入命令中自定义的名称。通过这个 label,用户可以查看对应导入任务的执行情况。

    label 的另一个作用,是防止用户重复导入相同的数据。强烈推荐用户同一批次数据使用相同的 label。这样同一批次数据的重复请求只会被接受一次,保证了 At-Most-Once

    当 label 对应的导入作业状态为 CANCELLED 时,该 label 可以再次被使用。

  • column_separator

    用于指定导入文件中的列分隔符,默认为\t。如果是不可见字符,则需要加\x作为前缀,使用十六进制来表示分隔符。

    如hive文件的分隔符\x01,需要指定为-H "column_separator:\x01"。

    可以使用多个字符的组合作为列分隔符。

  • line_delimiter

    用于指定导入文件中的换行符,默认为\n。

    可以使用做多个字符的组合作为换行符。

  • max_filter_ratio

    导入任务的最大容忍率,默认为0容忍,取值范围是0~1。当导入的错误率超过该值,则导入失败。

    如果用户希望忽略错误的行,可以通过设置这个参数大于 0,来保证导入可以成功。

    计算公式为:

    (dpp.abnorm.ALL / (dpp.abnorm.ALL + dpp.norm.ALL ) ) > max_filter_ratio

    dpp.abnorm.ALL 表示数据质量不合格的行数。如类型不匹配,列数不匹配,长度不匹配等等。

    dpp.norm.ALL 指的是导入过程中正确数据的条数。可以通过 SHOW LOAD 命令查询导入任务的正确数据量。

    原始文件的行数 = dpp.abnorm.ALL + dpp.norm.ALL

  • where

    导入任务指定的过滤条件。Stream load 支持对原始数据指定 where 语句进行过滤。被过滤的数据将不会被导入,也不会参与 filter ratio 的计算,但会被计入num_rows_unselected

  • Partitions

    待导入表的 Partition 信息,如果待导入数据不属于指定的 Partition 则不会被导入。这些数据将计入 dpp.abnorm.ALL

  • columns

    待导入数据的函数变换配置,目前 Stream load 支持的函数变换方法包含列的顺序变化以及表达式变换,其中表达式变换的方法与查询语句的一致。

  • format

    指定导入数据格式,支持csv、json,默认是csv

    SinceVersion 1.2 format 1.2 支持csv_with_names(支持csv文件行首过滤)、csv_with_names_and_types(支持csv文件前两行过滤)、parquet、orc
    列顺序变换例子:原始数据有三列(src_c1,src_c2,src_c3), 目前doris表也有三列(dst_c1,dst_c2,dst_c3)
    
    如果原始表的src_c1列对应目标表dst_c1列,原始表的src_c2列对应目标表dst_c2列,原始表的src_c3列对应目标表dst_c3列,则写法如下:
    columns: dst_c1, dst_c2, dst_c3
    
    如果原始表的src_c1列对应目标表dst_c2列,原始表的src_c2列对应目标表dst_c3列,原始表的src_c3列对应目标表dst_c1列,则写法如下:
    columns: dst_c2, dst_c3, dst_c1
    
    表达式变换例子:原始文件有两列,目标表也有两列(c1,c2)但是原始文件的两列均需要经过函数变换才能对应目标表的两列,则写法如下:
    columns: tmp_c1, tmp_c2, c1 = year(tmp_c1), c2 = month(tmp_c2)
    其中 tmp_*是一个占位符,代表的是原始文件中的两个原始列。
    

  • exec_mem_limit

    导入内存限制。默认为 2GB,单位为字节。

  • strict_mode

    Stream Load 导入可以开启 strict mode 模式。开启方式为在 HEADER 中声明 strict_mode=true 。默认的 strict mode 为关闭。

    strict mode 模式的意思是:对于导入过程中的列类型转换进行严格过滤。严格过滤的策略如下:

    1. 对于列类型转换来说,如果 strict mode 为true,则错误的数据将被 filter。这里的错误数据是指:原始数据并不为空值,在参与列类型转换后结果为空值的这一类数据。
    2. 对于导入的某列由函数变换生成时,strict mode 对其不产生影响。
    3. 对于导入的某列类型包含范围限制的,如果原始数据能正常通过类型转换,但无法通过范围限制的,strict mode 对其也不产生影响。例如:如果类型是 decimal(1,0), 原始数据为 10,则属于可以通过类型转换但不在列声明的范围内。这种数据 strict 对其不产生影响。
  • merge_type 数据的合并类型,一共支持三种类型APPEND、DELETE、MERGE 其中,APPEND是默认值,表示这批数据全部需要追加到现有数据中,DELETE 表示删除与这批数据key相同的所有行,MERGE 语义 需要与delete 条件联合使用,表示满足delete 条件的数据按照DELETE 语义处理其余的按照APPEND 语义处理

  • two_phase_commit

    Stream load 导入可以开启两阶段事务提交模式:在Stream load过程中,数据写入完成即会返回信息给用户,此时数据不可见,事务状态为PRECOMMITTED,用户手动触发commit操作之后,数据才可见。

  • enable_profile

    SinceVersion 1.2.4

    当 enable_profile 为 true 时,Stream Load profile将会打印到日志中。否则不会打印。

    示例:

    1. 发起stream load预提交操作
    curl  --location-trusted -u user:passwd -H "two_phase_commit:true" -T test.txt http://fe_host:http_port/api/{db}/{table}/_stream_load
    {
        "TxnId": 18036,
        "Label": "55c8ffc9-1c40-4d51-b75e-f2265b3602ef",
        "TwoPhaseCommit": "true",
        "Status": "Success",
        "Message": "OK",
        "NumberTotalRows": 100,
        "NumberLoadedRows": 100,
        "NumberFilteredRows": 0,
        "NumberUnselectedRows": 0,
        "LoadBytes": 1031,
        "LoadTimeMs": 77,
        "BeginTxnTimeMs": 1,
        "StreamLoadPutTimeMs": 1,
        "ReadDataTimeMs": 0,
        "WriteDataTimeMs": 58,
        "CommitAndPublishTimeMs": 0
    }
    

    1. 对事务触发commit操作 注意1) 请求发往fe或be均可 注意2) commit 的时候可以省略 url 中的 {table}
    curl -X PUT --location-trusted -u user:passwd  -H "txn_id:18036" -H "txn_operation:commit"  http://fe_host:http_port/api/{db}/{table}/_stream_load_2pc
    {
        "status": "Success",
        "msg": "transaction [18036] commit successfully."
    }
    

    1. 对事务触发abort操作 注意1) 请求发往fe或be均可 注意2) abort 的时候可以省略 url 中的 {table}
    curl -X PUT --location-trusted -u user:passwd  -H "txn_id:18037" -H "txn_operation:abort"  http://fe_host:http_port/api/{db}/{table}/_stream_load_2pc
    {
        "status": "Success",
        "msg": "transaction [18037] abort successfully."
    }
    

返回结果

由于 Stream load 是一种同步的导入方式,所以导入的结果会通过创建导入的返回值直接返回给用户。

示例:

{
    "TxnId": 1003,
    "Label": "b6f3bc78-0d2c-45d9-9e4c-faa0a0149bee",
    "Status": "Success",
    "ExistingJobStatus": "FINISHED", // optional
    "Message": "OK",
    "NumberTotalRows": 1000000,
    "NumberLoadedRows": 1000000,
    "NumberFilteredRows": 1,
    "NumberUnselectedRows": 0,
    "LoadBytes": 40888898,
    "LoadTimeMs": 2144,
    "BeginTxnTimeMs": 1,
    "StreamLoadPutTimeMs": 2,
    "ReadDataTimeMs": 325,
    "WriteDataTimeMs": 1933,
    "CommitAndPublishTimeMs": 106,
    "ErrorURL": "http://192.168.1.1:8042/api/_load_error_log?file=__shard_0/error_log_insert_stmt_db18266d4d9b4ee5-abb00ddd64bdf005_db18266d4d9b4ee5_abb00ddd64bdf005"
}

下面主要解释了 Stream load 导入结果参数:

  • TxnId:导入的事务ID。用户可不感知。

  • Label:导入 Label。由用户指定或系统自动生成。

  • Status:导入完成状态。

    "Success":表示导入成功。

    "Publish Timeout":该状态也表示导入已经完成,只是数据可能会延迟可见,无需重试。

    "Label Already Exists":Label 重复,需更换 Label。

    "Fail":导入失败。

  • ExistingJobStatus:已存在的 Label 对应的导入作业的状态。

    这个字段只有在当 Status 为 "Label Already Exists" 时才会显示。用户可以通过这个状态,知晓已存在 Label 对应的导入作业的状态。"RUNNING" 表示作业还在执行,"FINISHED" 表示作业成功。

  • Message:导入错误信息。

  • NumberTotalRows:导入总处理的行数。

  • NumberLoadedRows:成功导入的行数。

  • NumberFilteredRows:数据质量不合格的行数。

  • NumberUnselectedRows:被 where 条件过滤的行数。

  • LoadBytes:导入的字节数。

  • LoadTimeMs:导入完成时间。单位毫秒。

  • BeginTxnTimeMs:向Fe请求开始一个事务所花费的时间,单位毫秒。

  • StreamLoadPutTimeMs:向Fe请求获取导入数据执行计划所花费的时间,单位毫秒。

  • ReadDataTimeMs:读取数据所花费的时间,单位毫秒。

  • WriteDataTimeMs:执行写入数据操作所花费的时间,单位毫秒。

  • CommitAndPublishTimeMs:向Fe请求提交并且发布事务所花费的时间,单位毫秒。

  • ErrorURL:如果有数据质量问题,通过访问这个 URL 查看具体错误行。

注意:由于 Stream load 是同步的导入方式,所以并不会在 Doris 系统中记录导入信息,用户无法异步的通过查看导入命令看到 Stream load。使用时需监听创建导入请求的返回值获取导入结果。

取消导入

用户无法手动取消 Stream Load,Stream Load 在超时或者导入错误后会被系统自动取消。

查看 Stream Load

用户可以通过 show stream load 来查看已经完成的 stream load 任务。

默认 BE 是不记录 Stream Load 的记录,如果你要查看需要在 BE 上启用记录,配置参数是:enable_stream_load_record=true ,具体怎么配置请参照 BE 配置项

相关系统配置

FE配置

  • stream_load_default_timeout_second

    导入任务的超时时间(以秒为单位),导入任务在设定的 timeout 时间内未完成则会被系统取消,变成 CANCELLED。

    默认的 timeout 时间为 600 秒。如果导入的源文件无法在规定时间内完成导入,用户可以在 stream load 请求中设置单独的超时时间。

    或者调整 FE 的参数stream_load_default_timeout_second 来设置全局的默认超时时间。

BE配置

  • streaming_load_max_mb

    Stream load 的最大导入大小,默认为 10G,单位是 MB。如果用户的原始文件超过这个值,则需要调整 BE 的参数 streaming_load_max_mb

最佳实践

应用场景

使用 Stream load 的最合适场景就是原始文件在内存中或者在磁盘中。其次,由于 Stream load 是一种同步的导入方式,所以用户如果希望用同步方式获取导入结果,也可以使用这种导入。

数据量

由于 Stream load 的原理是由 BE 发起的导入并分发数据,建议的导入数据量在 1G 到 10G 之间。由于默认的最大 Stream load 导入数据量为 10G,所以如果要导入超过 10G 的文件需要修改 BE 的配置 streaming_load_max_mb

比如:待导入文件大小为15G
修改 BE 配置 streaming_load_max_mb 为 16000 即可。

Stream load 的默认超时为 600秒,按照 Doris 目前最大的导入限速来看,约超过 3G 的文件就需要修改导入任务默认超时时间了。

导入任务超时时间 = 导入数据量 / 10M/s (具体的平均导入速度需要用户根据自己的集群情况计算)
例如:导入一个 10G 的文件
timeout = 1000s 等于 10G / 10M/s

完整例子

数据情况: 数据在发送导入请求端的本地磁盘路径 /home/store_sales 中,导入的数据量约为 15G,希望导入到数据库 bj_sales 的表 store_sales 中。

集群情况:Stream load 的并发数不受集群大小影响。

  • step1: 导入文件大小是否超过默认的最大导入大小10G

    修改 BE conf
    streaming_load_max_mb = 16000
    

  • step2: 计算大概的导入时间是否超过默认 timeout 值

    导入时间 ≈ 15000 / 10 = 1500s
    超过了默认的 timeout 时间,需要修改 FE 的配置
    stream_load_default_timeout_second = 1500
    

  • step3:创建导入任务

    curl --location-trusted -u user:password -T /home/store_sales -H "label:abc" http://abc.com:8030/api/bj_sales/store_sales/_stream_load
    

使用代码调用 StreamLoad

你可以使用任意代码发起 http 请求进行 Stream Load,在发起 http 请求前,需要设置几个必要的 Header:

Content-Type: text/plain; charset=UTF-8
Expect: 100-continue
Authorization: Basic <base64编码后的用户名密码>

其中,<base64编码后的用户名密码>是指 Doris 的username+:+password拼接成的字符串进行 base64 编码后得到的值。

另外,需要注意的是,如果你直接对 FE 发起 http 请求,由于 Doris 会重定向到 BE,在这个过程中,某些框架会把Authorization这个 http Header 移除掉,这个时候需要你进行手动处理。

Doris 提供了 JavaGoPython 三种语言的 StreamLoad Example 供参考。

常见问题

  • Label Already Exists

    Stream load 的 Label 重复排查步骤如下:

    1. 是否和其他导入方式已经存在的导入 Label 冲突:

      由于 Doris 系统中导入的 Label 不区分导入方式,所以存在其他导入方式使用了相同 Label 的问题。

      通过 SHOW LOAD WHERE LABEL = “xxx”,其中 xxx 为重复的 Label 字符串,查看是否已经存在一个 FINISHED 导入的 Label 和用户申请创建的 Label 相同。

    2. 是否 Stream load 同一个作业被重复提交了

      由于 Stream load 是 HTTP 协议提交创建导入任务,一般各个语言的 HTTP Client 均会自带请求重试逻辑。Doris 系统在接受到第一个请求后,已经开始操作 Stream load,但是由于没有及时返回给 Client 端结果, Client 端会发生再次重试创建请求的情况。这时候 Doris 系统由于已经在操作第一个请求,所以第二个请求已经就会被报 Label Already Exists 的情况。

      排查上述可能的方法:使用 Label 搜索 FE Master 的日志,看是否存在同一个 Label 出现了两次 redirect load action to destination= 的情况。如果有就说明,请求被 Client 端重复提交了。

      建议用户根据当前请求的数据量,计算出大致导入的时间,并根据导入超时时间,将Client 端的请求超时间改成大于导入超时时间的值,避免请求被 Client 端多次提交。

    3. Connection reset 异常

      在社区版 0.14.0 及之前的版本在启用Http V2之后出现connection reset异常,因为Web 容器内置的是tomcat,Tomcat 在 307 (Temporary Redirect) 是有坑的,对这个协议实现是有问题的,所有在使用Stream load 导入大数据量的情况下会出现connect reset异常,这个是因为tomcat在做307跳转之前就开始了数据传输,这样就造成了BE收到的数据请求的时候缺少了认证信息,之后将内置容器改成了Jetty解决了这个问题,如果你遇到这个问题,请升级你的Doris或者禁用Http V2(enable_http_server_v2=false)。

      升级以后同时升级你程序的http client 版本到 4.5.13,在你的pom.xml文件中引入下面的依赖

          <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
          </dependency>
      

  • 用户在开启 BE 上的 Stream Load 记录后,查询不到记录

    这是因为拉取速度慢造成的,可以尝试调整下面的参数:

    1. 调大 BE 配置 stream_load_record_batch_size,这个配置表示每次从 BE 上最多拉取多少条 Stream load 的记录数,默认值为50条,可以调大到500条。
    2. 调小 FE 的配置 fetch_stream_load_record_interval_second,这个配置表示获取 Stream load 记录间隔,默认每120秒拉取一次,可以调整到60秒。
    3. 如果要保存更多的 Stream load 记录(不建议,占用 FE 更多的资源)可以将 FE 的配置 max_stream_load_record_size 调大,默认是5000条。

更多帮助

关于 Stream Load 使用的更多详细语法及最佳实践,请参阅 Stream Load 命令手册,你也可以在 MySql 客户端命令行下输入 HELP STREAM LOAD 获取更多帮助信息。

<think>首先,用户的问题是关于在Doris数据库导入数据的。用户说:“我想将数据导入Doris数据库请问如何在Doris导入数据数据导入方法 Doris”。这看起来是用户的需求:如何导入数据Doris。 系统级指令:-所有行内数学表达式必须使用$...$格式。但在这个上下文中,可能不涉及数学表达式,所以我可以忽略,除非有相关部分。 -独立公式必须使用$$...$$并单独成段。同样,可能不适用。- LaTeX语法正确:确保在数学表达式中使用正确。 -使用中文回答:整个回答必须用中文。 -生成相关问题:在回答结束时生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。参考提供的引用:[^1],[^2],[^3]。这些是关于Doris数据导入的引用。 用户可见层指令:-回答结构清晰,帮助用户逐步解决问题。 -尽量保证回答真实可靠。 提供的引用内容: -[^1]:关于Broker Load方式导入数据。 -[^2]:关于RoutineLoad方式,使用Kafka导入数据。 -[^3]:关于JSON格式导入数据。 用户的问题是基于这些引用,但引用是站内的,我需要参考它们来回答问题。用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我应该专注于用户的问题:如何在Doris导入数据。用户的具体问题:如何在Doris导入数据数据导入方法。从引用中,我知道Doris提供了多种导入方式: -BrokerLoad- RoutineLoad-还有其他方式如StreamLoad等。 引用[1]提到Doris有6种不同的导入方式:Broker Load是其中之一。引用[2]是关于Routine Load,使用Kafka。引用[3]是关于JSON导入支持。 系统指令说:“请尽可能多的参考用户上一次的问题和你的回答。”但这是用户的第一个消息,所以没有上一次问题。用户说:“我想将数据导入Doris数据库”,这是初始查询。 我的回答结构: -结构清晰,逐步解决问题。 -先介绍Doris数据导入的概述。-然后描述不同的导入方式。 -提供示例或步骤。 -结束时生成相关问题。 步骤: 1. **介绍Doris数据导入**:简要解释Doris支持多种导入方式,以适应不同数据源和需求。 2. **列出导入方式**:基于引用,Doris有6种方式,但引用中提到了BrokerLoad、RoutineLoad,以及JSON支持。-常见的导入方式包括:-Stream Load:用于实时导入小量数据。-Broker Load:用于批量导入大数据,支持多种数据源如HDFS。-Routine Load:用于持续从消息队列如Kafka导入数据。-其他方式如INSERTINTO等。 3. **详细描述每种方式**:-对于每种方式,简要说明其适用场景和使用方法。-使用引用中的信息:例如,引用[2]有RoutineLoad的SQL示例。4.**提供示例**:如引用[2]中的Routine Load创建语句。5.**添加引用标识**:在引用段落末尾添加[^1],[^2],[^3]。 6. **生成相关问题**:在结束时,类似示例,列出相关问题。生成的相关问题:-例如:1.如何选择适合的Doris数据导入方式?2.Doris导入数据时如何优化性能?3.Doris支持哪些数据格式导入?4.如何处理导入过程中的错误? 确保回答真实可靠:基于提供的引用和一般知识。引用是可靠的,因为是站内引用。 最终回答用中文。</think>### Doris数据库数据导入方法详解 在Doris导入数据是将外部数据源(如文件、消息队列或数据库)加载到Doris表的过程,以便用户通过SQL查询和分析数据Doris提供了多种导入方式,适应不同场景(如批量导入、实时流式导入或特定格式支持)。以下我将基于Doris官方文档和实践经验,逐步介绍主要导入方法、使用步骤和示例。Doris支持6种核心导入方式,包括异步和同步模式,您可以根据数据源类型、数据量和性能需求选择合适的方法[^1]。 #### 1. **常见导入方式概述** - **Broker Load**:适用于批量导入大数据(如TB级),支持从HDFS、S3等分布式存储导入CSV、Parquet等格式。它是异步操作,适合离线数据迁移。 - **Routine Load**:用于持续流式导入,从消息队列(如Kafka)实时加载数据。支持CSV或JSON格式,通过后台任务自动消费消息。 - **Stream Load**:实时同步导入小批量数据(如MB级),通过HTTP协议直接上传文件或数据流。常用于API调用或实时ETL。 - **INSERT INTO**:通过SQL语句直接插入数据,适合小规模数据或测试场景。 - **其他方式**:如S3 TVF(从AWS S3导入)或HDFS TVF(从HDFS导入),支持JSON等特定格式[^3]。 选择建议: - 大数据量批量导入:优先使用Broker Load。 - 实时流数据:选择Routine Load(如Kafka源)。 - 小数据或测试:Stream Load或INSERT INTO更简便。 #### 2. **详细导入步骤与示例** 以下是常用方法的操作步骤,基于Doris语法和最佳实践。确保您已创建目标表(如`demo_db.demo_table`)。 **方法一:Broker Load(批量导入)** - **适用场景**:从HDFS、S3导入CSV/Parquet文件。 - **步骤**: 1. 准备数据文件(如`data.csv`),上传到HDFS或S3。 2. 执行SQL命令创建导入作业。示例: ```sql LOAD LABEL demo_db.label_example -- 定义作业标签 ( DATA INFILE("hdfs://path/to/data.csv") -- 数据源路径 INTO TABLE demo_table COLUMNS TERMINATED BY "," -- 列分隔符 FORMAT AS "CSV" ) WITH BROKER "broker_name" -- 指定Broker名称 PROPERTIES ( "timeout" = "3600" -- 超时时间(秒) ); ``` 3. 检查状态:`SHOW LOAD WHERE LABEL = 'label_example';`,状态为`FINISHED`表示成功。 - 优点:高效处理海量数据,支持错误容忍[^1]。 **方法二:Routine Load(Kafka流式导入)** - **适用场景**:持续从Kafka导入实时数据(如日志或事件流)。 - **步骤**: 1. 创建Routine Load作业,指定Kafka配置。示例(参考引用[2]): ```sql CREATE ROUTINE LOAD demo_db.kafka_demo_csv ON demo_table COLUMNS TERMINATED BY ",", -- 列分隔符 COLUMNS(id, name, age) -- 目标表列映射 PROPERTIES ( "desired_concurrent_number" = "10", -- 并发任务数 "strict_mode" = "true" -- 严格模式校验 ) FROM KAFKA ( "kafka_broker_list" = "Kafka实例IP:9092", -- Kafka地址 "kafka_topic" = "demo-topic", -- Topic名称 "property.group.id" = "demo-group", -- 消费者组 "property.kafka_default_offsets" = "OFFSET_BEGINNING" -- 从起始偏移量消费 ); ``` 2. 向Kafka发送数据(如使用Java生产者): ```java kafkaProducer.send("demo-topic", "1,张三,30"); // 发送CSV格式消息 ``` 3. 监控作业:`SHOW ROUTINE LOAD FOR kafka_demo_csv;`,查看任务状态和错误日志[^2]。 - 优点:自动容错,支持Exactly-Once语义。 **方法三:Stream Load(HTTP实时导入)** - **适用场景**:快速导入小文件或API数据。 - **步骤**: 1. 使用curl或编程语言发送HTTP请求。示例(导入CSV文件): ```bash curl --location-trusted -u user:password \ -H "label:stream_load_example" \ -H "column_separator:," \ -T /path/to/data.csv \ http://Doris_FE_IP:8030/api/demo_db/demo_table/_stream_load ``` 2. 响应中检查`Status: Success`表示导入完成。 - 优点:简单快捷,适合实时场景。 **方法四:JSON格式导入** - **适用场景**:导入JSON数据(如API响应或日志)。 - **支持方式**:Stream Load、Broker Load、Routine Load均兼容JSON[^3]。 - **示例(Stream Load导入JSON)**: ```bash curl --location-trusted -u user:password \ -H "format: json" \ -H "strip_outer_array: true" \ # 处理JSON数组 -T data.json \ http://Doris_FE_IP:8030/api/demo_db/demo_table/_stream_load ``` - 确保JSON格式匹配表结构。 #### 3. **通用注意事项** - **性能优化**:调整`desired_concurrent_number`(并发数)或`max_batch_interval`(批处理间隔)提升吞吐量[^2]。 - **错误处理**:使用`SHOW LOAD WARNINGS;`查看导入错误,并在PROPERTIES中设置`max_filter_ratio`容忍部分错误。 - **数据格式**:支持CSV、JSON、Parquet等;确保分隔符和编码一致。 - **监控**:通过Doris Web UI或SQL命令(如`SHOW LOAD;`)跟踪作业状态。 - **最佳实践**:测试环境验证后上线;大数据导入分批进行以避免资源竞争。 如果遇到问题,参考[Doris官方文档](https://doris.apache.org/zh-CN/docs/data-operate/import)或社区资源。导入成功后,即可用MySQL客户端查询数据验证[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunjian286

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值