Flink如何高效批量读取MySQL数据并写入Elasticsearch的最佳实践?
- 虚拟主机
- 2026-01-18
- 9
Flink是一种流处理框架,可以用于处理实时数据流,在数据仓库和大数据领域,Flink常用于批量处理和实时处理,本文将介绍如何使用Flink批量读取MySQL数据库中的数据,并将其写入Elasticsearch(ES)。

Flink批量读取MySQL写入ES步骤
以下是一个使用Flink批量读取MySQL数据库数据并写入ES的步骤:
| 步骤 | 描述 |
|---|---|
| 1 | 准备环境:确保Flink、MySQL和Elasticsearch已安装并配置好。 |
| 2 | 编写Flink程序:创建一个Flink程序,用于读取MySQL数据并写入ES。 |
| 3 | 连接MySQL:使用Flink提供的JDBC连接器连接到MySQL数据库。 |
| 4 | 读取数据:从MySQL数据库中读取数据。 |
| 5 | 处理数据:对读取到的数据进行处理,如过滤、转换等。 |
| 6 | 连接ES:使用Flink提供的Elasticsearch连接器连接到ES集群。 |
| 7 | 写入数据:将处理后的数据写入ES。 |
| 8 | 运行程序:运行Flink程序,开始批量读取MySQL数据并写入ES。 |
示例代码
以下是一个简单的Flink程序示例,用于批量读取MySQL数据并写入ES:


import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.elasticsearch.ElasticsearchSinkFunction; import org.apache.flink.streaming.connectors.elasticsearch.RequestIndexer; import org.apache.flink.streaming.connectors.elasticsearch7.ElasticsearchSink; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; public class FlinkMysqlEsExample { public static void main(String[] args) throws Exception { // 创建Flink执行环境 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 连接MySQL数据库 String mysqlUrl = "jdbc:mysql://localhost:3306/database_name"; String mysqlUser = "username"; String mysqlPassword = "password"; // 读取MySQL数据 DataStream<String> mysqlData = env.readTextFile(mysqlUrl) .map(new MapFunction<String, String>() { @Override public String map(String value) throws Exception { // 处理数据 return value; } }); // 连接Elasticsearch RestHighLevelClient esClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); // 写入ES ElasticsearchSink<String> esSink = new ElasticsearchSink<>( new ElasticsearchSink.Builder<>( mysqlData, new ElasticsearchSinkFunction<String>() { @Override public void process(String value, RuntimeContext ctx, RequestIndexer indexer) { // 创建索引请求 IndexRequest indexRequest = new IndexRequest("index_name") .source(value, XContentType.JSON); indexer.add(indexRequest); } @Override public void close() throws IOException { esClient.close(); } } ) .setBulkFlushMaxActions(1000) ); // 添加ES连接器 mysqlData.addSink(esSink); // 执行程序 env.execute("Flink Mysql Es Example"); } }
FAQs
Q1:如何处理Flink程序中的数据转换?
A1:在Flink程序中,可以使用map、filter、flatMap等转换函数对数据进行处理,可以使用map函数将字符串转换为对象,使用filter函数过滤数据等。
Q2:如何配置Flink程序的并行度?
A2:在Flink程序中,可以通过设置ExecutionEnvironment的setParallelism方法来配置并行度。env.setParallelism(4);将设置并行度为4。
国内文献权威来源
- 《大数据技术原理与应用》 李航,机械工业出版社,2014年。
- 《Flink:大数据实时计算框架》 王峰,电子工业出版社,2017年。