Doris Stream Load 导入数据
背景
我们需要对游戏上报的打点事件进行分析处理,老版本系统是将log event 事件日志直接写入关系型数据库 mysql 中,这种方式不利于对后续做分析处理,现在准备采用 Doris 数据库来做数据查询分析。
最开始我们是收到事件日志后实时写入Doris,使用的是 insert into 语句直接写数据,这种方式是不被官方推荐的,我们就是没细读文档,才浪费时间在这种导入方式上测试,这种方式会提示错误如下:
failed to init delta writer. version count: 504, exceed limit: 500. tablet: 28970.1449237103.0c4ddb2afb4291b5-e24959d87fa48e98
这是因为导入数据过于频繁,数据版本太多了,所以不允许导入。
由于时间紧,不想对现有系统做过多改动,我们转换了导入方式,采用了Stream Load 方式导入数据。
测试过程
Doris 部署在 AWS 的 EC2 中,目前测试环境部署了三台 BE(2核4G),一台 FE(2核8G)。
实现思路主要是:服务端收到打点事件后直接写入 AWS 的 Kineses,lambda 再批量读取数据采用 Stream Load 的方式导入 Doris。
首先是本地测试,根据通过 curl 命令连接 FE 导入数据,FE 会返回一个重定向到 BE,连接 BE 才会真正导入数据,但是返回的 BE 的 ip 地址是ip内网,外部无法访问,所以提示连接会超时。
* Trying 34.214.***.**...
* TCP_NODELAY set
* Connected to 34.214.***.** (34.214.***.**) port 8030 (#0)
* Server auth using Basic with user 'root'
> PUT /api/Didabu/log_event/_stream_load HTTP/1.1
> Host: 34.214.***.**:8030
> Authorization: Basic cm9vdDpkb3Jpc19yb290
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Length: 144
> Expect: 100-continue
>
< HTTP/1.1 307 Temporary Redirect
< Date: Mon, 27 Dec 2021 05:37:00 GMT
< Vary: Origin
< Vary: Access-Control-Request-Method
< Vary: Access-Control-Request-Headers
< Content-Language: en-US
< Location: http://root:doris_root@172.31.***.**:8040/api/Didabu/log_event/_stream_load?
< Connection: close
<
* Closing connection 0
* Issue another request to this URL: 'http://root:doris_root@172.31.***.**:8040/api/Didabu/log_event/_stream_load?'
* Trying 172.31.***.**...
* TCP_NODELAY set
* connect to 172.31.***.** port 8040 failed: Timed out
* Failed to connect to 172.31.***.** port 8040: Timed out
* Closing connection 1
curl: (7) Failed to connect to 172.31.***.** port 8040: Timed out
这是因为我们是公有云部署,BE 注册到 FE 使用的是内网IP, FE 和 BE 是通过内网 IP 连接通信的,所以我们通过 curl 命令本地测试导入时,FE 返回的 BE 地址是内网 IP,本地无法连接。
我们尝试过将 BE 的 priority-network 绑定的 ip 改为它的公网 IP,但是没有成功,只能绑定本机网卡的 IP, 即 ip addr 命令看到的 IP;
不同于其他命令的提交方式,Stream Load 是通过 HTTP 协议与 Doris 进行连接交互的。
该方式中涉及 HOST:PORT 应为 HTTP 协议端口。
公有云用户必须使用 Compute Node(BE)的 HTTP 协议端口,默认为 8040。
私有化部署用户可以使用 Leader Node(FE)的 HTTP 协议端口,默认为 8030。但须保证客户端所在机器网络能够联通 Compute Node 所在机器。
我们本地测试只能直接连接 BE 的 8040测试,至于测试及生产环境导入实在 lambda 中完成,lambda 可以通过配置 VPC 访问 EC2 内网 IP,不存在访问不了的问题。
其他问题
1.be 日志大量出现:too many filtered rows
原因:推送的数据列数不符合或数据格式不对。