【大数据】如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?
1
Hadoop
只是一套工具的总称,它包含三部分:HDFS
,Yarn
,MapReduce
,功能分别是分布式文件存储
、资源调度
和计算
。
按理来说,这就足够了,就可以完成大数据分析了。
但第一个问题就是麻烦。这一套相当于用Yarn调度资源,读取HDFS文件内容进行MR计算
。要写Java代码,但做数据的最好的工具是什么
?SQL
!所以Hive
相当于这一套标准流程的SQL化。
Hive可以简单理解为,Hadoop之上添加了自己的SQL解析和优化器
,写一段SQL,解析为Java代码
,然后去执行MR
,底层数据还是在HDFS上
。
这看起来挺完美,但问题是程序员发现好慢啊。原因是MR,它需要频繁写读文件
。这时基于内存的Spark出现了
,Spark是替代MR
的,它会为SQL生成有向无环图,加上各种算子和宽窄依赖的优化,使得计算速度达到了新的高度
。
按理说这就完美解决了呀。但是,我们回头想想,这些数据怎么来的呢?我们是不是到目前为止都是在处理静态的数据呢?像比如线上支付校验这种需要实时返回结果的总不能等着Spark批量算吧。解决问题之前,我们回头再想想,数据怎么来的。
一般数据包含两种:业务数据
和日志数据
。业务数据就是数据库中的结构性的数据,规规整整。业务数据怎么到Hive呢?开源上一般通过Sqoop
进行导入,比如一张表,数据少每天我把表全部导入一遍
,这叫全量同步
;
数据特别大
,就只同步每天变化和新增的
,这是增量同步
。但这种同步比较滞后,都是在夜深人静集群的计算资源比较空闲的时候做的,对应的也是离线分析
。实时的数据产生了该怎么拿到呢?
2
实时怎么理解
?来一批处理一批
,再细一点儿,来一条,处理一条
。
比如,你买一件东西,平台数据库中会多一条订单数据,app会产生行为日志数据。订单数据插入数据库时一般会有binlog
,即记录插入、更新或删除的数据,我们只要能实时拿到这一条binlog,就相当于拿到了实时数据。
binlog怎么拿呢?这就要说道数据库的主从备份机制
,一般本身就是拿主库的binlog同步到备份库,刚好有一个叫canal
的工具可以把自己伪装成备份库
,来拉取主库的binlog
,再解析
、包装最后抛出
,就相当于实时拿到数据了
!
canal拿到了binlog就能直接处理了吗?可以,但有件事儿大家想一想。马上五一了,加入一下子超级多人下单消费,canal抛出的消息我们下游一下子消费不完咋办呢?比如快递员每天都只给你派送一件快递,你拿到之后钱货两清。然后突然一天快递员给你送一千件到你楼下,你下楼一件一件搬,快递员还得等你搬完才能回去,这得等到啥时候。
聪明的你马上想到了,放快递柜呀,你有时间慢慢搬不就行了,也不占用快递员的时间了。这就是消息队列
,Kafka
就是起这样的作用:异步
、解耦
、消峰
。canal的数据一般会抛到kafka或RocketMQ,可以保存一段时间。然后下游程序再去实时拉取消息来计算。
3
说了这么多下游,下游到底由谁来消费计算这些实时数据呢?还记得Spark吗,没错它又来了,Spark streaming就是处理实时流数据的好手。
Spark 是一整套组件的统称,比如你可以用 Java 写 Spark 任务,用 Spark SQL 去写 SQL,可以用 Spark MLib 完成机器学习的模型训练等等,Spark Streaming 就是用来微批地处理流式数据的。
具体而言,离线数据我们是等半夜数据都抽到 Hive 中再计算,**而 Spark Streaming 则是实时数据来一小批,它就处理一小批。**所以本质上讲,Spark Streaming 还是批处理,只不过是每一批数据很少,并且处理很及时,从而达到实时计算的目的。
Spark 本身的流行使得 Spark Streaming
也一直大范围使用。
这一套有什么逻辑缺陷吗?
我们可以想一想,实时数据和离线数据最大的差异,是时效性。离线数据像湖水,该多少就多少,就在那里;实时数据像水流,绵绵不绝。时间,便是非常重要的一个特质。当一条数据来的时候,我们需要知道这条数据是什么时候产生的,这便是业务时间
。但我们拿到这条数据时往往是业务时间之后的一小会,这边是处理时间
。真正世界里的实时数据肯定不是像 Spark Streaming 那样一批一批来的,而是一个一个的事件。对此,Flink 帮助我们解决了这些问题。
4
无论是业务数据还是日志数据,往往都有相应的时间标志字段,代表着这条消息的业务时间。你可以让 Flink 选择这个时间,这样,Flink 就知道当前处理到哪个时间点了。
Flink 不同于 Spark Streaming 的微批次处理,它是一条一条数据处理的。这样的数据一般是先来后到的,但难免会有些数据沿途受阻晚来了几秒钟,这就会导致两个问题:数据延迟和乱序数据。这也是做实时数据的非常关注的问题。如何防止数据延迟?如果是上游数据迟了,就加大上游资源;如果是数据突然激增,导致 Flink 处理不过来导致任务出现延迟,就加大 Flink 的资源,比如并发。
数据乱序呢?
同样的,我们一般也通过上游和 Flink 本身来分别保证。
我们上面提到了消息的快递柜 Kafka,Kafka 有分区的概念,就像是不同的通道,一条消息来了后,可以走 A,也可以走 B,也可以走 C。那么问题来了,现在面试官问你,业务数据抛入 Kafka,如何保证消息的顺序性呢?
顺序性一般有两方面需要保证。我们举一个小小的例子,一个用户下单的场景,有两个基本共识:
同一个用户的订单状态会先后变化
;不同用户的不同订单也有先后之分
。
所以我们解决数据的顺序性一般也是从这两方面考虑。如果你还记得大学高数里的多元函数求偏导,对于 x 和 y 两个变量,求 x 的偏导会假设 y 为常量,反之同理。我们考虑这个问题也一样,如果不能同时兼顾这两方面,那就一个一个去优化吧!这种思想也称为贪婪算法,在很多地方都有应用,这里暂时说到这里。
回到问题,那么如何保证同一用户的订单顺序呢?很简单,前面我们提到的链路是,数据库中插入或更新数据时,会实时产生该条数据的 binlog,canal 获取、解析、包装这条 binlog 并抛入 Kafka。
而 Kafka 由于有分区的存在,很可能同一个订单的消息会被发送到不同的分区中,这样的话,如果下游的 Flink 任务消费不同分区速率不同,就可能导致先到的数据反而被后消费,产生顺序误差。解决的办法即保证同一订单的消息进入 Kafka 的同一分区即可。Kafka 的每一条消息都会有 messageKey 和 message 两个结构,如果没有直接给消息指定分区,那么 messageKey 决定了消息进入哪个分区,在 canal 中,我们便可以设定消息如何进入 Kafka。数据库中的业务数据,会存在一张张的表中,表一般都会有主键,来唯一标识一条数据,我们一般也就是通过设定 canal 选择 binlog 所在表的主键来决定其进入 Kafka 的分区。这样,就基本解决了第一个问题。
但这只保证了同一订单数据的顺序性,并未保证不同订单之间的顺序性。聪明的你可能已经想到,如果 Kafka 只设定一个分区那不就保证了吗?但这其实算是本末倒置,Kafka 本身相当于快递柜,多个分区相当于多个柜子,能存储更多的数据,提高并发,如果为了顺序性而牺牲并发量,那就得不偿失了,而且一般本身数据的乱序无论是在概率和重要性方面都不如并发重要的。就比如我要统计每小时的订单数,即使数据乱序了,只要在窗口区间内计算结果也不怎么受影响。
但这并不是说我们就不考虑数据在全局的顺序性了。
我们如何去认识乱序或延迟数据呢?既然这种情况是偶发性的,那么一般可以这么做,在实时的流数据中,如果想要拿到 T 时刻的数据,只要等一小会儿比如 1s,就能保证在 T+1s 的时刻拿到 T 时刻的所有数据。
上面这句话其实理解起来也很简单,比如幼儿园老师组织小朋友们春游,约定了早上 8:00 集合发车,即 8:00 触发一个事件。但总有那么几个调皮捣蛋的学生会迟到几分钟,于是老师说好的 8 点发车实际上是8:05,大家觉得也没啥问题,回家就跟家长说,我们今天 8:00 发车春游啦。在
Flink 中,这种机制就叫做 watermark
。
上面我们说过,每一条数据一般都会自带一个时间字段,来标志这条数据的业务时间,即什么时候发生的。然后 Flink 提取这个时间字段,就知道了目前 Flink 任务进行到几点了。
那么既然要考虑乱序或迟到数据,我们一般也会让 Flink 当前的时间稍微迟几秒钟。比如我们认为大部分情况下乱序或迟到的数据都在 1s 以内,那么来一条数据,比如这条数据自带的时间是 08:00:01,那我们就认为 08:00:00 时刻的数据才刚到齐。但回过头来说,在大多数场景下,毕竟乱序或迟到数据算是占比很小了。
【大数据】如何用形象的比喻描述大数据的技术生态?Hadoop、Hive、Spark 之间是什么关系?相关推荐
- 如何用形象的比喻大数据的技术生态Hadoop、Hive、Spark 之间是什么关系?
最近我的同学给我发了一篇特别有意思的关于大数据的技术生态Hadoop.Hive.Spark 关系的解读文章.个人觉得非常有意思,通俗易懂,我转载到这里,希望大家一起学习. Luis 大数据 255 人 ...
- 大数据十年回顾(3):社区技术生态发展
在这篇文章里,我们沿大数据发展时间线,从产品.行业.技术多角度讨论其发展脉络,究其发展承其脉络大家可以学习.借鉴.并最终推测未来大致走向. 社区 Hadoop:开源大数据的基石 Hadoop 于 20 ...
- 大数据技术主要有哪些,之间是什么关系?
以最常使用的Hadoop为例: Hadoop是Apache公司开发的一个开源框架,它允许在整个集群使用简单编程模型计算机的分布式环境存储并处理大数据. 集群是指,2台或2台以上服务器构建节点,提供数据 ...
- matlab筛选excel数据统计,#excel筛选数据#如何用excel表格中的数据制图
如何将excel中的部分数据做成图表 数据透视表岂不更简单??? Excel表格作图中X轴的刻度怎么设置? 图表当中的X轴刻度也就是横坐(在2003版本里面叫分类轴)的刻度. 选图表X轴--右键--设 ...
- 怎么用计算机作图处理数据,如何用excel处理物理实验数据作图 怎样用excel处理物理实验数据作图...
今天给大家带来如何用excel处理物理实验数据作图,怎样用excel处理物理实验数据作图,让您轻松解决问题.座位一个理工科学生,做实验是我们必要的事情,处理数据是一个很基础的是请,选择科技那么发达,处 ...
- 大数据的技术生态?Hadoop、Hive、Spark之间是什么关系?
2019独角兽企业重金招聘Python工程师标准>>> 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作 ...
- 构建数据中台常用三把武器区别在哪?(Hadoop、Spark、Storm)
通过收集互联网相关资料,进行总结归纳,整理如下: 一. Storm的适用场景: 1)流数据处理 Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去. 2)分布式RPC.由于S ...
- 《大数据》第1期“专题”——大数据机器学习系统研究进展(上)
大数据机器学习系统研究进展 黄宜华1,2 1.南京大学计算机软件新技术国家重点实验室 南京 210023: 2.南京大学PASA大数据技术实验室 南京 210023 摘要:要实现高效的大数据机器学习, ...
- 大数据、人工智能、机器学习与深度学习是什么意思?之间有什么关系?
大数据.人工智能是目前大家谈论比较多的话题,它们的应用也越来越广泛.与我们的生活关系也越来越密切,影响也越来越深远,其中很多已进入寻常百姓家,来举个例子如:无人机.网约车.自动导航.智能家电.电商推荐 ...
最新文章
- 检测含有中文字符串的实际长度
- vscode折叠/展开所有区域代码快捷键
- PHP 表单和用户输入
- 5-(基础入门篇)学会刷Wi-Fi模块固件(刷LUA版本固件)
- log4j 2.x 架构(源码)
- 多线程场景下利用ThreadLocal是线程安全?
- CPU占用率过高和OOM场景下如何排查问题
- android手机安装python并写代码运行
- 内卷下,贷中监控对商户端如何规则
- thinkphp5 return 返回空_杨丞琳演唱会意外踩空,从两层楼高的舞台掉落,李荣浩心疼发文...
- oracle 如何查询某张表 历史相关操作_你的项目应该如何正确分层?
- java jco sap 重连_Java连接SAP,使用SAPJCO3.jar
- IPC$局域网入侵详解
- 研发人员分层及其工作内容划分
- 2019第十届蓝桥杯国赛C组C/C++第I题 胖子走迷宫
- Eclipse官网下载
- 新春送祝福,直接发红包。现金红包等你来拿~
- 佐治亚理工计算机科学,佐治亚理工学院计算机科学面试经验汇总
- 测绘专业计算机二级,测绘本科毕业,几年具有考二级注册结构师资格?
- node-Buffer(缓冲区)文件写入
热门文章
- Transformer也能生成图像,新型ViTGAN性能比肩基于CNN的GAN
- CVPR 2019 | STGAN: 人脸高精度属性编辑模型
- 机器阅读理解 / 知识库 / 深度学习 / 对话系统 / 神经机器翻译 | 本周值得读
- 专题解读 |「知识图谱」领域近期值得读的 6 篇顶会论文
- CVPR 2021 论文和开源项目合集(Papers with Code)
- ajax 入参为list_ajax传递给后台数组参数方式
- 01 | 基础架构:一条 SQL 查询语句是如何执行的
- Postman——导出测试接口集合的Collection文件
- Spring Boot + 微信小程序——登录凭证校验DEMO
- BugKuCTF 杂项 多种方法解决