热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面试大数据再也不怕没项目可说了

小李:老王,早上又吃鸡蛋灌饼不加肠啊!老王:是啊,我的肠又被捐出去了!小李,看你脸色,这又是昨天加班了。小李:可别提了,昨天logstash机器又顶不住了,还被运维给鄙视了一番

小李:老王,早上又吃鸡蛋灌饼不加肠啊!
老王:是啊,我的肠又被捐出去了!小李,看你脸色,这又是昨天加班了。
小李:可别提了,昨天logstash机器又顶不住了,还被运维给鄙视了一番,看来我得学习学习你那牛叉的数据接入系统了,上线以来都没出过问题。
老王:好啊,我给你讲一讲,巴拉巴拉....
周围的人:这人不是有什么大病吧....
老王:我还是抓紧吃完去公司给你讲吧
小李:好吧!图片

    一提到把kafka数据落地到hdfs,大家最先想到的一定是logstash,由于logstash很笨重,当数据量很大时,我们经常会遇到资源不够用的问题,也没办法精确控制hdfs生成文件的大小。为了不影响后续hive分析的性能,我们经常还需要把一些小文件进行合并(小文件是hdfs中不得不面对的问题),这不仅拉长了链路,也会造成不必要的资源浪费。
图片

    为了避免资源浪费,降低数据接入链路,我们实现了一个数据接入系统。主要优点如下所示。

    1.通过配置文件可以快速实现数据接入需求(针对kafka->hdfs的场景)。

    2.实现精确消费一次(Exactly-once),即保证数据不丢不重复。

    3.可以手动配置生成文件的大小。

    整体架构如下图所示。  

图片

   我们使用目前很火的flink消费kafka(关于flink和spark的优缺点大家自行百度),然后定时的更新offset到hbase中,以满足精确消费一次的场景。我们的flink任务也很简单,主要有两个算子组成kafkasource和parquetsink,如图所示。

图片

1.kafkasource

    这里的kafkasource主要是用来消费kafka的数据,不过这里有一点需要注意,我们在消费kafka的时候,需要从hbase读取相应的offset信息,如果没读到offset信息,表明这个任务是第一次启动,我们从该消费组的位置读。如果读到了offset信息,为了避免重复消费,我们需要从该offset位置开始读(因为该offset之前的数据已经成功落地到hdfs上了)。  这里为了实现这个功能,我们需要重新实现flink自带的FlinkKafkaConsumerBase类,我们需要在内部添加从hbase读取offset的逻辑。

long offset = offsetManager.getPartitionOffset(seedPartition.getTopic(), seedPartition.getPartition());
if (offset != -1) {
    subscribedPartitionsToStartOffsets.put(seedPartition, offset);
} else {
    subscribedPartitionsToStartOffsets.put(seedPartition, startupMode.getStateSentinel());
}

image.png

    这样我们就可以实现在flink checkpoint失败时,从hbase中读取offset信息,来控制kafka从哪个位置开始消费。这里还有一点需要注意,我们在任务启动时,也需要添加这块代码逻辑。你可以自己思考一下。

2.parquetsink

   parquetsink这里主要是实现往hdfs写入数据,我们从parquet源码里可以把写数据成parquet文件的逻辑copy出来,自己实现往hdfs写parquet文件。这里就不重点强调了,这里主要看一下和hbase的交互流程。

   我们这里主要是重写CheckpointedFunction里的snapshotState方法,该方法每次在checkpoint的时候,都会被调用。所以我们在该方法里实现文件的生成和更新hbase中offset的工作。这里首先会判断生成文件的大小是否已经满足我们设置的大小,如果没有满足,我们就不做处理。如果满足我们设置的文件大小,我们会把这个临时文件上线,然后更新hbase中offset的信息。关键代码逻辑如下图所示。

val isSuccess = commitPendingToStable(writerState.getParentPath, writerState.getFileName)
if (isSuccess) {
    offsetManager.saveOffset(partitionInfo.getTopic, partitionInfo.getPartition, writerState.getEndOffset + 1)
}

     到目前为止,我们已经把关键点都聊完了。我们来总结一下。看一下整体的执行流程。

    在任务执行中,flink定时执行checkpoint,假设为10s,然后就会调用 snapshotState方法去检测文件大小是否满足我们配置的大小,如果不满足,不做处理。如果满足,我们把文件上线,然后提交offset到hbase。这就代表着hbase中存储的offset表示我们已经成功落地的数据。如果checkpoint失败或者任务挂掉,由于我们重启或者checkpoint失败恢复任务时,我们是从hbase中读取offset信息,因此可以保证精确一次消费,保证落地的数据不丢失不重复。

   今天我们就聊到这里,更多有趣知识,欢迎关注公众号[程序员学长]。如果对本文有什么疑问点,欢迎留言讨论。

 

 

 


推荐阅读
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • Storm集成Kakfa
    一、整合说明Storm官方对Kafka的整合分为两个版本,官方说明文档分别如下:StormKafkaIntegratio ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 一、MATLAB常用的基本数学函数abs(x):纯量的绝对值或向量的长度angle(z):复数z的相角(Phaseangle)sqrt(x)࿱ ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
  • 在第二课中,我们将深入探讨Scala的面向对象编程核心概念及其在Spark源码中的应用。首先,通过详细的实战案例,全面解析Scala中的类和对象。作为一门纯面向对象的语言,Scala的类设计和对象使用是理解其面向对象特性的关键。此外,我们还将介绍如何通过阅读Spark源码来进一步巩固对这些概念的理解。这不仅有助于提升编程技能,还能为后续的高级应用开发打下坚实的基础。 ... [详细]
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • 自定义窗口实现同时按照计数和时间(processing-time)触发计算 TriggersA Trigger determineswhenawindow(asformedbyth ... [详细]
author-avatar
静净精时
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有