Doris 数据导入失败排查思路

1. 报错信息

Caused by: java.io.IOException: Failed to flush data to Doris. {"BeginTxnTimeMs":0,"Comment":"","CommitAndPublishTimeMs":0,"ErrorURL":"http://**.**.**.**:**/api/_load_error_log?file=__shard_892/error_log_insert_stmt_bf4eb57df3756f49-c5e794564529e398_bf4eb57df3756f49_c5e794564529e398","Label":"datax_doris_writer_c0b81541-2986-4e36-9daa-94531c7a1301","LoadBytes":10027,"LoadTimeMs":20,"Message":"[INTERNAL_ERROR]too many filtered rows\n\n\t0# std::_Function_handler<void (doris::RuntimeState*, doris::Status*), doris::StreamLoadExecutor::execute_plan_fragment(std::shared_ptr<doris::StreamLoadContext>)::$_0>::_M_invoke(std::_Any_data const&, doris::RuntimeState*&&, doris::Status*&&)\n\t1# doris::FragmentMgr::_exec_actual(std::shared_ptr<doris::FragmentExecState>, std::function<void (doris::RuntimeState*, doris::Status*)> const&)\n\t2# std::_Function_handler<void (), doris::FragmentMgr::exec_plan_fragment(doris::TExecPlanFragmentParams const&, std::function<void (doris::RuntimeState*, doris::Status*)> const&)::$_0>::_M_invoke(std::_Any_data const&)\n\t3# doris::ThreadPool::dispatch_thread()\n\t4# doris::Thread::supervise_thread(void*)\n\t5# start_thread\n\t6# clone\n","NumberFilteredRows":3,"NumberLoadedRows":0,"NumberTotalRows":3,"NumberUnselectedRows":0,"ReadDataTimeMs":0,"Status":"Fail","StreamLoadPutTimeMs":4,"TwoPhaseCommit":"false","TxnId":4531902,"WriteDataTimeMs":15} at com.alibaba.datax.plugin.writer.doriswriter.DorisStreamLoadObserver.streamLoad(DorisStreamLoadObserver.java:65) at com.alibaba.datax.plugin.writer.doriswriter.DorisWriterManager.asyncFlush(DorisWriterManager.java:165) ... 3 more

2. 排查步骤

1. 获取异常详情url

根据错误信息可以获取到详情url

"ErrorURL":"http://**.**.**.**:**/api/_load_error_log?file=__shard_892/error_log_insert_stmt_bf4eb57df3756f49-c5e794564529e398_bf4eb57df3756f49_c5e794564529e398","Label":"datax_doris_writer_c0b81541-2986-4e36-9daa-94531c7a1301"

⚠️如果报错信息中无详情url时,可以通过下面语句获取到

show stream load 

2. 获取导入失败详情

  • 登录doris数据管理平台,输入命令可以查看具体的导入失败的原因

  • show load WARNINGS on 'http://**.**.**.**:**/api/_load_error_log?file=__shard_892/error_log_insert_stmt_bf4eb57df3756f49-c5e794564529e398_bf4eb57df3756f49_c5e794564529e398'

    详情如下:

  • Reason: no partition for this tuple. tuple=+-------------------------------

根据报错信息看出,写入无分区的数据。

3. 总结

数据写入常见的错误如下:

  • 写入分区表时,写入不存在分区数据

  • 数据类型与doris数据类型不一致

  • 采用csv表格数据导入,原数据中存在字符串,字符串中可能存在制表符 \t或换行符\n在数据分割的时候,会将数据切割错误,会报数据类型不符错误,故需要设置自定义新的分隔符。

    PROPERTIES
    (
    "column_separator": "&*&", --导出文件的列分隔符
    "line_delimiter": "@@@@" --导出文件的行分隔符
    )

    doris官网:Stream Load - Apache Doris

### 将ORC格式的数据导入Doris数据库的方法 #### 使用DataX工具进行数据迁移 对于将ORC格式文件中的数据迁移到Doris数据库的任务,可以借助阿里巴巴开源的大规模离线数据同步工具——DataX来实现。通过编写特定配置文件并执行Python脚本来启动此过程[^1]。 ```bash python gen_import_config.py -d doris_database_name -t target_table_name ``` 上述命令用于生成针对目标表的导入配置模板;其中`-d`参数指定目的端所在的数据库名称而`-t`则指明具体要写入哪张表格内。不过需要注意的是,在实际操作前还需进一步调整该配置文档以适应源ORC文件路径以及字段映射关系等细节情况。 #### 配置JSON设置项解析 为了使DataX能够识别来自HDFS上的ORC文件作为输入插件(reader),并且正确无误地把记录送至Apache Doris(即Palo)接收方(writer), 用户应当精心准备一份描述详尽的JSON格式设定档。下面给出了一部分关键性的选项说明: - **job.content[0].reader.name**: 应当被设为`hdfssync`, 表示采用适用于读取分布式文件系统的组件。 - **job.content[0].reader.parameter.path**: 此处需填写待处理ORC文件于Hadoop集群里的绝对地址,支持通配符匹配多个分区下的对象集合。 - **job.content[0].writer.name**: 设置成`dorissync`表明选用专门面向Doris的服务接口完成最终的数据落地工作。 - **job.content[0].writer.parameter.tableName**: 明确指出远程SQL引擎内部的目标逻辑结构体标识符(即Schema名加表名组合)。 - **job.content[0].column[]**: 列出所有参与传输列的名字及其对应类型转换规则,确保两端之间的一致性和兼容性。 #### Apache Flink的角色补充说明 尽管Flink主要服务于流计算场景,但在某些情况下也可以利用其批模式作业能力配合Table API来进行ETL流程开发。如果项目环境中已经部署有较为成熟的Flink生态,则不妨考虑将其纳入考量范围之内。特别是那些体积庞大、复杂度高的半结构化存储介质向关系型仓库转化的需求场合下,Flink凭借强大的表达能力和灵活多变的操作语义或许能提供额外的价值主张[^2]。 然而就单纯解决本次提出的关于Orc转储进入Doris的问题而言,优先推荐基于DataX构建解决方案会更加直接有效一些。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值