环境
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
- [Doris](部署 Docker 集群 - Apache Doris):v1.12.1
- JDK: v1.8.x
- IDEA开发环境
一、 Docker部署
官方提供文档Deploy Docker cluster
但部署完以后发现集群无法识别BE节点,查看日志发现是因为没有设置vm.max_map_count
参数
避坑1: 需要设置sysctl -w vm.max_map_count=2000000
避坑2: 在启动容器时需要添加privileged: true
二、Flink 写入Doris
官方提供了文档Flink Doris Connector
这里选用的是RowData的方式写入到Doris,提前到Doris中创建表代码如下:
1 | CREATE DATABASE dwd; |
然后是使用Java代码:
1 | public static void main(String[] args) throws Exception { |
运行时发现网络不通问题,无法成功写入Dois,具体错误如图下图所示:
分析宿主节点和docker集群的关系
由架构图得知,是因为sink写入的时候通过外网地址的fe取到be地址是内网地址。
解决思路:
程序上传到FE运行,但是我属于本地开发环境,这种方式不适合
配置Docker network,使得在宿主节点能够访问容器 BE的IP。这块我也尝试搜索了很多资料,最终以失败告终。
- 尝试一: 在宿主节点修改路由表 sudo route add -net 172.20.80.0/24 172.20.80.1
- 尝试二: 以Host方式运行FE和BE
修改源代码: 找到涉及到“第二步:将BE内网IP返回给主程序”代码,并修改
其中我是用第三种方法,成功在本地开发环境摄入数据到Doris,在这里简单介绍一下快速修改源码的方法。
第一步: 先找到涉及到代码的相关方法,在该场景中对应的是org.apache.doris.flink.rest.RestService
类的randomBackend()
。
1 |
|
第二步:现在希望返回值并非BE的内网IP,因此我们需要将return
的内容写死return "localhost:8040";
第三步:在代码中我们创建与类相同的包,并将源码原封不动粘贴进去,如果报错,可以修改。紧接着修改return "localhost:8040";
即可
总结:
我这里是本地开发环境遇到的问题,并非生产环境;如果生产环境部署基于Doris的应用程序,则需要注意下下面几点:
- 运行的代码所在的机器,必须与Doris所在的网络保持通常。
- 基于RowData的摄入方式不太友好,现在仍要寻找一种更好的编码方式。