Spark Structured Streaming基于数据动态写入ES Index

Flink实时计算核心原理与工程实践:从Kafka到Elasticsearch全链路解析 实时计算是当前大数据处理的重要方向,流处理框架通过逐条处理数据实现毫秒级延迟,颠覆了传统批处理模式。Flink作为领先的流处理引擎,以状态管理、事件时间、水位线和checkpoint机制构建了完整的容错体系,支持Exactly-Once语义,适用于金融风控、实时数仓、用户行为分析等场景。在实际开发中,工程师常面临并行度设置、资源消耗控制、连接器异常排错等挑战。合理配置Flink SQL、合理使用CDC实现数据库变更实时捕获,并结合弹性扩缩容与状态TTL优化,能有效降低资源消耗。针对面试高频问题,理解JobM 阅读详情

        Spark structured streaming(注意和spark streaming的区别)写入ES的基本代码如下:

// df为需要写入es的Dataset<Row>
df.writeStream()
		.format("org.elasticsearch.spark.sql.checkpoint")
//		检查点地址,可不配置
		.option("checkpointLocation", CHECKPOINT_PATH)
//		ES节点
		.option("es.nodes", ES_HOST)
		.option("es.post", "9200")
		.option("es.net.http.auth.user", ES_USER)
		.option("es.net.http.auth.pass", ES_PASSWORD)
//		自动创建不存在的index
		.option("es.index.auto.create", "true")
//		es.nodes为域名而非节点时,该项必须为true
		.option("es.nodes.wan.only", "true")
//		mapping.id存在则覆盖,不存在则创建
		.option("es.write.operation", "upsert")
		.option("es.mapping.id", PRIMARY_KEY)
		.option("es.resource", INDEX_NAME)
		.outputMode(OutputMode.Append())
		.start();

        

        由于Spark streaming作业数据是连续不断,并且只会有一次启停,因此一般是将整个流的数据写入到ES指定的index中。但实际中可能会遇到各种场景,需要将连续的数据路由到不同的index中。比如根据业务、地域、时间等特性创建多个index,然后基于数据的一个或多个字段路由到所属的index中。

本文以最容易理解的场景为例:按天生成 ES index,spark streaming将处理后的数据根据业务时间写入所属index中。应该如何实现这个需求呢?

        

        最容易想到的一个方案(实际工作中确实遇到这么干的!)是写一个定时脚本,负责在每天0点的时候杀掉当前程序,然后重新启动程序以达到将数据写入具有新日期的index。这么做的缺点有很多:

  • 虽然可以通过checkpoint恢复作业防止数据丢失,但是0点附近早到和晚到数据会写入错误index,造成数据的准确性问题
  • 定时启停逻辑上将流程序切分开来,并且启停程序出现问题将直接影响流作业的准确性
  • 只适用这种时间域切分的index,不适用其它域上切分的index

总之,这种方式虽然简单,但是极不可靠而且很low!

通过实践,我总结了两种支持动态写入ES index的方式:

  1. 基于spark structured streaming特性的方式
  2. 基于spark ES配置的方式

 1. 基于spark structured streaming特性的方式

        这里用到的spark structured streaming的特性是foreachBatch Api。使用foreachBatch可以实现下面两个目标:

  • 重用数据源中的每批次数据 
  • 写入多个目标sink

        因此在foreachBatch中,可以将流数据以批的方式处理,根据字段拆分成不同域的数据集,然后写入对应域的index中,具体实现如下。

// df为需要写入es的Dataset<Row>
df.writeStream()
    .foreachBatch((Dataset<Row> dataset, Long batchId)-> {
        long currentTs = System.currentTimeMillis();
		String todayIndex = INDEX_PREFIX + DateUtil.parseTimestampToStr(currentTs, "yyyyMMdd");
		String yesterdayIndex = INDEX_PREFIX + DateUtil.parseTimestampToStr(currentTs-86400000, "yyyyMMdd");
		String tomorrowIndex = INDEX_PREFIX + DateUtil.parseTimestampToStr(currentTs+86400000, "yyyyMMdd");

		Dataset<Row> todayDs = dataset.filter("data_time>="+clock0Ts + " and data_time<"+clock24Ts);
		Dataset<Row> yesterdayDs = dataset.filter("data_time<"+clock0Ts);
		Dataset<Row> tomorrowDs = dataset.filter("data_time>="+clock24Ts);

//      写入es代码参考上文
		writeToEs(todayDs,todayIndex);
		writeToEs(yesterdayDs,yesterdayIndex);
		writeToEs(tomorrowDs,tomorrowIndex);
}.start();
		

 

 2.基于spark ES配置的方式

        使用foreachBatch的方式虽然解决了问题,但是稍显繁杂。在域划分很多的时候就要拆分出很多数据集。那么ES本身是否能支持根据指定字段,自动写入目标index中呢,答案当然是可以的!!

df.writeStream()
    .foreachBatch((Dataset<Row> dataset, Long batchId)-> {
        dataset.write()
            .format("org.elasticsearch.spark.sql")
            .option("checkpointLocation", CheckPointPath)
            .option("es.nodes", ES_HOST)
            .option("es.post", "9200")
            .option("es.net.http.auth.user", ES_USER)
            .option("es.net.http.auth.pass", ES_PASSWORD)
            .option("es.index.auto.create", "true")
            .option("es.nodes.wan.only", "true")
            .option("es.write.operation", "upsert")
            .option("es.mapping.id", PrimaryKey)
            .option("es.resource", IndexPrefix+"{date}")
            .mode(SaveMode.Append)
            .save();
    })
    .start();

        注意:这里的date就是df中数据的日期字段

基于Django与大数据的招聘可视化系统设计与实现 大数据处理与可视化技术在现代招聘系统中扮演着关键角色。通过分布式计算框架如Hadoop和Spark,系统能够高效处理海量招聘数据,实现实时分析与多维展示。Django作为Python的高效Web框架,结合RESTful API设计,为前后端分离架构提供了稳定支持。本系统创新性地整合了Scrapy爬虫、HBase存储和Spark Streaming实时计算,构建了完整的招聘数据处理流水线。在可视化层面,采用ECharts实现动态数据展示,包括热力地图、薪资分布和技能关联分析等功能。该系统不仅适用于毕业设计参考 阅读详情

相关推荐

大数据Pipeline增强实战:从故障救火到可信服务

数据Pipeline是现代数据平台的核心载体,其稳定性、延迟与准确性直接决定业务决策质量。理解Pipeline本质需超越ETL线性模型,深入数据熵值、业务容忍度与团队能力三角平衡;技术增强的关键在于问题驱动的精准归因——通过量化基线、火焰图分析、Kafka Lag诊断定位瓶颈,而非盲目替换Flink或Trino。Schema治理、状态TTL、资源精细化调度与四大黄金可观测指标(Freshness/Accuracy/Availability/Cost Efficiency)构成可持续增强的四大锚点。本文聚焦真

virusswb的专栏 423

spark es的新增索引值(地理空间坐标)

目录一、新建Mapping二、导入ES依赖三、程序实现1、创建spark入口、创建ES客户端2、读取数据,处理前几行头信息3、提取属性值4、将坐标拼成WKT文本5、将属性拼接成对象(1) XContentBuilder 形式(2)Gson的JsonObject 形式(3)fastJson的JSONObject 形式6、关闭资源 一、新建Mapping 可以在Kibana中建好mapping,也可以在api中写好,执行程序的时候创建。 这里在Kibana已经创建好 PUT /realweather {

IT_但丁的博客 954

工业级分析框架:分层流批融合架构设计与落地

现代数据分析已从单点报表演进为支撑企业决策的工程化系统。其核心在于构建具备可验证性、可审计性与可交接能力的分析底盘,而非堆砌实时技术组件。分层流批融合架构通过统一计算引擎(如Flink)与分级存储策略,在保障数据准确性与语义一致性的前提下,实现T+1批量分析与亚秒级实时响应的协同。该模式显著降低双栈维护成本,提升指标口径治理效率,并天然支持数据血缘追踪与GitOps变更管控。典型应用场景包括零售销量归因、物流轨迹分析、金融风控特征计算等需高可靠性与强合规性的工业级业务。本文聚焦真实500强项目中沉淀的架构逻

weixin_34268310的博客 378

使用python完成Kafka+sparkstreaming+elasticsearch

在网上找了很久python的Kafka+sparkstreaming+elasticsearch的代码找不到,基本都是scala或者java的(好像是spark自己本身提供了库给java和scala写入ES?然而并没有可以提供给python的????),所以自己写了一个,能正常运行,但是感觉这样写不太好,想发出来和大家交流一下。 from elasticsearch import Elasticsear...

pycrossover的博客 551

【Spark实战系列】sparkstreaming 实时写数据到 elasticsearch

简单的写了一个sparkstreaming入es的demo,直接看代码吧: package spark import kafka.{PropertiesScalaUtils, RedisKeysListUtils} import kafka.streamingRedisHive.{dbIndex, kafkaStreams} import org.apache.kafka.common.se...

JasonLee实时计算 6120

【信息科学与工程学】【数据科学】第一百二十二篇 大数据产品中的函数与算法01

它通常指。下面按照你给出的表格列💡 说明:下表中的"产品"以开源/主流商业组件为具象载体(Hadoop、Spark、Flink、Kafka、Hive、HBase、Iceberg、Atlas、Ranger、TensorFlow 等),它们共同构成一个完整的大数据产品家族;代码为实现示例,用于说明算法在工程系统中的落地方式。

weixin_49199313的博客 197

使用python批量写入ES索引数据(附代码)

并不能随心所欲地控制创建索引的内容、索引的结构和数据量,无法创建指定的测试数据集,或者直接投入生产使用。使用java或者spark则需编译使用,修改麻烦,人生苦短,我用python。本文介绍使用python脚本批量写ES数据,需要使用pip提前下载安装es依赖库。(注意,示例中大部分中文内容是为了增加存储使用量,否侧100万条数据仅85MB,当前百万数据占用665MB,可酌情减少字段)写入了2000万条数据约13GB,足以模拟大多数测试需求了,耗时6330秒。这是主要是为了安装python依赖。

大数据,大模型,服务器,技术、架构,方案 1026

【信息科学与工程学】【数据科学】数据科学领域 第十二篇 大数据主要算法07 任务工序(2)

工序类别工序名称工序描述处理时序输入输出控制点质量指标异常处理数据接入工序​流数据源连接连接到外部流数据源初始阶段流数据源配置流数据连接连接参数配置连接成功率重连机制,失败告警数据拉取从数据源拉取数据持续实时数据源连接原始数据流拉取频率,批大小数据延迟,吞吐量超时重试,流量控制反序列化将二进制数据反序列化数据到达时二进制数据结构化数据记录序列化格式反序列化成功率格式异常处理数据预处理工序​数据验证验证数据完整性和格式反序列化后原始数据记录验证后数据验证规则数据质量合格率丢弃无效数据,异常记录数据清洗清洗脏数

weixin_49199313的博客 781

使用 ES-Hadoop 将 Spark Streaming 流数据写入 ES

ES-Hadoop实现了Hadoop生态(Hive、Spark、Pig、Storm等)与ElasticSearch之间的数据交互,借助该组件可以将Hadoop生态的数据写入到ES中,然后借助ES对数据快速进行搜索、过滤、聚合等分析,进一步可以通过Kibana来实现数据的可视化。同时,也可以借助ES作为数据存储层(类似数仓的Stage层或者ODS层),然后借助Hadoop生态的数据处理工具(Hive、MR、Spark等)将处理后的数据写入到HDFS中。...

weixin_43813200的博客 1069

【信息科学与工程学】【数据中心】 第十五篇 智算中心DaaS数据消费场景02

智算中心DaaS数据共享场景的分级分类是一个复杂的系统工程,需要从技术、安全、合规、治理、运营等多个维度进行综合考虑。本分级分类体系为不同场景下的数据共享提供了详细的指导,包括安全分级、共享模式、技术架构、合规治理等方面。在实施数据共享平台时,应结合自身业务需求、技术能力和资源情况,选择适合的共享模式和实施路径。同时,要高度重视数据安全和隐私保护,采用先进的技术和管理手段,确保数据共享的安全可控。

weixin_49199313的博客 1万+

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1269

Spark Structured Streaming 动态写入 Elasticsearch Index 完整实践

在实时数仓建设中,数据从 Kafka 流入 Elasticsearch 是常见链路,而不同业务数据往往需要写入不同索引以实现生命周期管理与隔离。动态索引写入的本质是根据数据内容实时计算目标索引,这依赖 Spark Structured Streaming 的微批处理能力。通过 foreachBatch 机制,可以将流式处理转化为可控的批处理,结合路由解析、分区内聚、bulk 批量写入与索引模板,实现稳定高效的动态落库。该方案适用于日志分类存储、租户隔离、按时间滚动索引等真实业务场景,同时也需关注版本兼容、幂

weixin_33525298的博客 214

【信息科学与工程学】【数据科学】第五十一篇 数据仓库00 基础设计01

数据仓库设计的系统性解决方案,涵盖架构模式、分层设计、百万级访问支撑、海量数据配置及与数据库/数据湖的对接策略: ​​ODS(操作数据层)​​:原始数据镜像,保留历史快照 ​​DWD(明细数据层)​​:清洗、标准化、维度退化 ​​DWS(汇总数据层)​​:主题宽表、轻度聚合 ​​ADS(应用数据层)​​:高度聚合,面向报表/API ​​二、百万用户访问架构设计​​ ​​1. 核心架构组件​​ ​​2. 关键配置参数(以Snowflake为例)​​ ​​3. 性能优化措

weixin_49199313的博客 1202

2023五大开源数据目录深度对比:血缘、搜索、权限与实时性实战选型指南

数据目录是现代数据栈中实现元数据管理、血缘追踪与可信发现的核心基础设施,其本质是通过自动化采集结构层、语义层和行为层元数据,构建可搜索、可治理、可协作的数据资产图谱。随着Snowflake、Databricks、Delta Lake等现代数据平台普及,传统Hadoop-centric方案已难以满足跨源血缘解析、字段级权限控制与低延迟搜索等关键需求。本文聚焦开源数据目录的五大能力支柱——元数据采集广度、血缘解析精度、搜索响应性能、ABAC权限模型成熟度及API可扩展性,结合真实生产环境压测数据(如10万表规模

weixin_33749242的博客 383

Spark Streaming+ELK日志流式处理架构实战

日志实时处理是可观测性体系的核心能力,其本质是将原始日志流转化为可计算、可告警、可追溯的结构化信号。基于流式计算原理,需兼顾低延迟、状态一致性与乱序容错,技术价值在于突破传统批处理的时效瓶颈,实现毫秒级异常感知与根因定位。典型应用场景包括微服务故障预警、错误率动态监控、日志指纹聚类分析等。本文聚焦 Spark Streaming 与 ELK Stack 协同架构,详解高吞吐日志管道中背压控制、窗口聚合、嵌套 JSON 解析及 Elasticsearch 批量写入等关键工程实践,覆盖从 Kafka 消费到实时

weixin_33766168的博客 338

Spark Streaming增强ELK实时日志处理能力

日志实时处理是现代可观测性体系的核心能力,其本质是将原始日志流经清洗、解析、路由后高效写入存储与分析系统。传统ELK栈中Logstash在高吞吐(>5000 EPS)下易因单线程模型和JVM内存瓶颈导致丢数据与延迟升高;Spark Streaming凭借成熟的micro-batch流式计算能力、丰富的结构化处理API(DataFrame/SQL)及与Kafka、Elasticsearch的稳定生态集成,可作为ELK前置流式处理层,实现日志清洗、字段提取、多流关联与智能分流。该方案兼顾准实时性(3~10秒端到

weixin_33994429的博客 285

多维聚合前的数据变形:清洗、归一、折叠与衍生

多维聚合不是简单的GROUP BY加SUM,而是数据在进入计算前必须经历的形态重构过程。其核心在于解决高维原始数据(如日志、订单)与低维业务分析需求(如按省份+季度+设备统计UV)之间的结构性鸿沟。关键原理包括粒度对齐、语义归一、结构折叠和状态衍生——这些操作直接决定聚合结果的准确性与性能上限。技术价值体现在避免Shuffle倾斜、提升查询速度、保障指标一致性;典型应用场景覆盖电商用户分群、SaaS行为分析、金融客户画像等。本文聚焦‘聚合前’这一常被忽视的关键阶段,深入解析Data Manipulation

weixin_33795743的博客 408

钢铁行业大数据平台实战架构与落地指南

工业大数据平台是支撑制造业智能化升级的核心基础设施,其本质是将设备、工艺与质量数据转化为可计算、可追溯、可干预的决策依据。在钢铁这类强时序、多源异构、高实时性要求的流程工业中,平台需兼顾OT协议兼容性、流批一体处理能力及AI模型轻量化部署。关键技术包括边缘轻量采集(如Telegraf协议插件化)、混合存储分层(TimescaleDB+Delta Lake+Ceph)、Flink实时计算与知识蒸馏驱动的工艺大模型应用。本文聚焦真实产线场景,覆盖从PLC数据接入、热温冷数据治理,到质量预测与自动参数干预的完整闭

weixin_34356555的博客 362
上一篇: spark作业序列化问题解决方案
下一篇: spark写入es出现部分数据重复问题排查和解决
soaring0121
博客等级 码龄17年 2941粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值