flink如何写入es

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

Flink sink 流数据写入到es5和es7的简单示例。


一、写入到Elasticsearch5

  • pom maven依赖
xml 复制代码
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-elasticsearch5_2.11</artifactId>
            <version>${flink.version}</version>
        </dependency>
  • 代码如下(示例):
java 复制代码
public class Es5SinkDemo {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        Row row=Row.of("张三","001",getTimestamp("2016-10-24 21:59:06"));
        Row row2=Row.of("张三","002",getTimestamp("2016-10-24 21:50:06"));
        Row row3=Row.of("张三","002",getTimestamp("2016-10-24 21:51:06"));
        Row row4=Row.of("李四","003",getTimestamp("2016-10-24 21:50:56"));
        Row row5=Row.of("李四","004",getTimestamp("2016-10-24 00:48:36"));
        Row row6=Row.of("王五","005",getTimestamp("2016-10-24 00:48:36"));
        DataStreamSource<Row> source =env.fromElements(row,row2,row3,row4,row5,row6);

        Map<String, String> config = new HashMap<>();
//        config.put("cluster.name", "my-cluster-name");
//        config.put("bulk.flush.max.actions", "1");

        List<InetSocketAddress> transportAddresses = new ArrayList<>();

        transportAddresses.add(new InetSocketAddress(InetAddress.getByName("10.68.8.60"), 9300));
        //Sink操作
        DataStreamSink<Row> rowDataStreamSink = source.addSink(new ElasticsearchSink<>(config, transportAddresses, new ElasticsearchSinkFunction<Row>() {
            public IndexRequest createIndexRequest(Row element) {
                Map<String, Object> json = new HashMap<>();
                json.put("name22", element.getField(0).toString());
                json.put("no22", element.getField(1));
                json.put("age", 34);
                json.put("create_time", element.getField(2));

                return Requests.indexRequest()
                        .index("cc")
                        .type("mtype")
                        .id(element.getField(1).toString())
                        .source(json);
            }

            @Override
            public void process(Row element, RuntimeContext ctx, RequestIndexer indexer) {
                //利用requestIndexer进行发送请求,写入数据
                indexer.add(createIndexRequest(element));
            }
        }));
        env.execute("es demo");
    }
    private static java.sql.Timestamp getTimestamp(String str) throws Exception {
//		String string = "2016-10-24 21:59:06";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        java.util.Date date=sdf.parse(str);
        java.sql.Timestamp s = new java.sql.Timestamp(date.getTime());
        return s;
    }

二、写入到Elasticsearch7

  • pom maven依赖
xml 复制代码
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-elasticsearch7_2.11</artifactId>
            <version>${flink.version}</version>
            <scope>provided</scope>
        </dependency>
  • 代码如下(示例):
java 复制代码
import org.apache.flink.api.common.functions.RuntimeContext;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
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.apache.flink.types.Row;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.Requests;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EsSinkDemo {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        Row row=Row.of("张三","001",getTimestamp("2016-10-24 21:59:06"));
        Row row2=Row.of("张三","002",getTimestamp("2016-10-24 21:50:06"));
        Row row3=Row.of("张三","002",getTimestamp("2016-10-24 21:51:06"));
        Row row4=Row.of("李四","003",getTimestamp("2016-10-24 21:50:56"));
        Row row5=Row.of("李四","004",getTimestamp("2016-10-24 00:48:36"));
        Row row6=Row.of("王五","005",getTimestamp("2016-10-24 00:48:36"));
        DataStreamSource<Row> source =env.fromElements(row,row2,row3,row4,row5,row6);

        Map<String, String> config = new HashMap<>();
//        config.put("cluster.name", "my-cluster-name");
// This instructs the sink to emit after every element, otherwise they would be buffered
//        config.put("bulk.flush.max.actions", "1");

        List<HttpHost> hosts = new ArrayList<>();
        hosts.add(new HttpHost("10.68.8.69",9200,"http"));

        ElasticsearchSink.Builder<Row> esSinkBuilder = new ElasticsearchSink.Builder<Row>(hosts,new ElasticsearchSinkFunction<Row>() {
            public IndexRequest createIndexRequest(Row element) {
                Map<String, Object> json = new HashMap<>();
                json.put("name22", element.getField(0).toString());
                json.put("no22", element.getField(1));
                json.put("age", 34);
//                json.put("create_time", element.getField(2));

                return Requests.indexRequest()
                        .index("cc")
                        .id(element.getField(1).toString())
                        .source(json);
            }

            @Override
            public void process(Row element, RuntimeContext ctx, RequestIndexer indexer) {
                //利用requestIndexer进行发送请求,写入数据
                indexer.add(createIndexRequest(element));
            }
        });
        esSinkBuilder.setBulkFlushMaxActions(100);
        //Sink操作
        source.addSink(esSinkBuilder.build());

        env.execute("es demo");
    }

    private static java.sql.Timestamp getTimestamp(String str) throws Exception {
//		String string = "2016-10-24 21:59:06";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        java.util.Date date=sdf.parse(str);
        java.sql.Timestamp s = new java.sql.Timestamp(date.getTime());
        return s;
    }
}

总结

flink写入es5和es7 的区别是引入不同的flink-connector-elasticsearch,es7已没有type的概念故无需再设置type。

相关推荐
wafrdggh7 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
大大大大晴天9 小时前
OLTP、OLAP、数据湖、数据集市、湖仓一体到底是什么关系?
大数据
正在走向自律12 小时前
AI Agent 落地这一年:从“能跑起来”到“敢放出去”
大数据·人工智能·ai agent·智能体·mcp·a2a
freejackman13 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
goujunwe14 小时前
GEO 内容的“可摘录性”打磨技巧:段落、表格、小标题怎么写,方便大模型提取独立答案块
大数据·人工智能
小田学Python14 小时前
DeepSeek Harness 完整上手指南:安装部署 + 必装插件 + 用一周就回不去的功能
大数据·大模型·agent·ai工具·deepseek
成都蜀味缘餐饮技术培训学校18 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
roman_日积跬步-终至千里18 小时前
AI 能让一个人成为团队吗?从数据中台到 OPC,重新理解软件工程能力
大数据·人工智能·软件工程
且从容.19 小时前
ubuntu安装flink
linux·ubuntu·flink
演艺大赏20 小时前
NiFi 数据流实战:FTP→HDFS 与 CSV→Parquet,附坏数据、漏文件与双写
大数据