如果未来是面向 AI 编程的,希望软件工程师不要把 AI 当作什么万能的东西。当机器学习结果出现问题的时候,我们既不要陷入某种不可知的“玄学”之中,也不要无谓的抱怨什么“人工智障”,而是应该积极参与到问题的讨论、分析和解决中去。这也是我的观点,即使自己不做大数据与机器学习相关的开发,每个程序员也应该懂大数据和机器学习。 |
书名:《从0开始学大数据》
作者:李智慧
脑图绘制者:WilliamLi
脑图绘制者微信号:kk375044771
GitHub:https://github.com/WilliamLizk/FastReading)
预习
为什么说每个软件工程师都应该懂大数据技术?
软件编程技术核心价值
把现实世界的业务操作搬到计算机上,通过计算机软件和网络进行业务和数据处理。(成千上百倍提高效率)
在未来,软件开发将是“面向AI编程”,软件的核心业务逻辑和价值将围绕机器学习的结果也就是AI展开,软件工程师的工作就是考虑如何将机器学习的结果更好地呈现出来,如何更好地实现人和AI的交互。
大数据技术发展史:大数据的前世今生
Google三驾马车(2004年)
分布式文件系统(GFS)
大数据分布式计算框架(MapReduce)
NoSQL数据库系统(BigTable)
天才程序员:Doug Cutting(Lucene开源项目的创始人)
开发开源搜索引擎(Nutch)
从Nutch中分离出Hadoop
分布式文件系统(HDFS)
大数据计算引擎(MapReduce)
Yahoo使用Hadoop
开发Pig简化大数据编程
Facebook发布了Hive
把SQL语句转化成MapReduce的计算程序
早期的MapReduce包括执行引擎和资源调度
分离出资源调度发展为Yam
AMP实验室发现MapReduce进行机器学习性能非常差
推出Spark
大数据实时计算(流计算框架)
Storm
Flink(同时支持流式计算和批处理计算)
Spark Streaming
大数据发展史:从搜索引擎到人工智能
把全部的历史数据都收集起来,统计其规律,进而预测正在发生的事情,这就是机器学习。
有意义是人类智能的源泉
大数据最经典、最主流的技术和产品
大数据应用领域:数据驱动一切
医学影像智能识别
病历大数据智能诊疗
外语老师
智能解题
舆情分析
大数据风控
无人店
无人驾驶技术
移动计算比移动数据更划算
传统的软件计算处理模型
输入
计算
输出
大数据技术
1.将待处理的大规模数据存储在服务器集群的所有服务器上。
2.大数据引擎根据集群里不同服务器的技术能力,在每台服务器上启动若干分布式任务执行进程,这些进程会等待给它们分配执行任务。
3.使用大数据计算框架支持的编程模型进行编程。
4.用Hadoop或者Spark的启动命令执行这个应用程序的JAR包。
5.任务执行进程收到分配任务后,通过反射的方式加载程序(如果没有则下载)。
6. 加载程序后,任务执行进程根据分配的数据片的文件地址和数据在文件内的偏移量读取数据,并把数据输入给应用程序相应的方法执行。
从磁盘阵列(RAID)看垂直伸缩到水平伸缩的演化
大规模数据存储需要解决的核心问题
1.数据存储容量问题。
2.数据读写速度的问题。
3.数据可靠性的问题。
RAID技术(垂直伸缩)
RAID0
并发写入N块磁盘
RAID1
数据同时排队写入两块磁盘
RAID10
数据并发写入N/2块磁盘,并同时写入另一份N/2块磁盘
RAID5
数据写入N-1块磁盘,校验数据螺旋式写入第N块磁盘。
RAID6
数据写入N-2块磁盘,并螺旋式地在两块磁盘中写入校验信息。
分布式与大数据技术(水平伸缩)
新技术层出不穷,HDFS依然是存储的王者
整个大数据体系里面,最宝贵、最难以代替的资产就是数据,大数据所有的一切都要围绕数据展开。
HDFS也许不是最好的大数据存储技术,但依然是最重要的大数据存储技术。
HDFS关键组件
DataNode
负责文件数据的存储和读写操作
NameNode
负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名、数据库的Id,存储位置等。
为了保证数据的高可用,会将一个数据库复制为多份并存储在不同的服务器上。
HDFS高可用设计
数据存储故障容错
计算并存储校验和(CheckSum),读取数据时从新计算校验和,不正确则抛出异常,从其他DataNode中读取备份数据。
磁盘故障容错
检测到磁盘损坏,则报告BlockId给NameNode,NameNode检查其他DataNode的备份数据并复制到其他服务器,以保证数据块的备份数足够。
DataNode故障容错
如果NameNode超时未收到DataNode的心跳,则认为DataNode以及宕机失效,NameNode检查其他DataNode的备份数据并复制到其他服务器,以保证数据块的备份数足够,即使再出现服务器宕机,也不会丢失数据。
NameNode 故障容错
采用主从热备的方式提供高可用服务
为什么说MapReduce既是编程模型又是计算框架?
MapReduce既是一种非常简单又非常强大的编程模型
Map(Map(k1,v1) → list(k2,v2),天生具备了并行计算的能力)
行成<Key,Value集合>
Reduce(Reduce(k2, list(v2)) → list(v3))
计算输出零个或多个<Key,Value>
MapReduce也是计算框架
MapReduce计算框架为每个数据块分配一个map函数去计算,从而实现大数据的分布计算
MapReduce如何让数据完成一次旅行?
两个关键问题
如何为每个数据块分配一个 Map 计算任务,也就是代码是如何发送到数据块所在服务器的,发送后是如何启动的,启动以后如何知道自己需要计算的数据在文件什么位置(BlockID 是什么)。
处于不同服务器的 map 输出的 <Key, Value> ,如何把相同的 Key 聚合在一起发送给 Reduce 任务进行处理。
MapReduce作业启动和运行机制
三类关键进程
1.大数据应用进程。
这类进程是启动 MapReduce 程序的主入口,主要是指定 Map 和 Reduce 类、输入输出文件路径等,并提交作业给 Hadoop 集群,也就是下面提到的 JobTracker 进程。这是由用户启动的 MapReduce 程序进程,比如我们上期提到的 WordCount 程序。
2.JobTracker 进程。
这类进程根据要处理的输入数据量,命令下面提到的 TaskTracker 进程启动相应数量的 Map 和 Reduce 进程任务,并管理整个作业生命周期的任务调度和监控。这是 Hadoop 集群的常驻进程,需要注意的是,JobTracker 进程在整个 Hadoop 集群全局唯一。
3.TaskTracker 进程
这个进程负责启动和管理 Map 进程以及 Reduce 进程。因为需要每个数据块都有对应的 map 函数,TaskTracker 进程通常和 HDFS 的 DataNode 进程启动在同一个服务器。也就是说,Hadoop 集群中绝大多数服务器同时运行 DataNode 进程和 TaskTacker 进程。
JobTracker 进程和TaskTracker 进程是主从关系;主服务器通常只有一台运行(主备),从服务器可能有几百上千台,所有的从服务器听从主服务器的控制和调度安排。主服务器负责为应用程序分配服务器资源以及作业执行的调度,而具体的计算操作则在从服务器上完成。
MapReduce作业启动和计算过程
1. 应用进程 JobClient 将用户作业 JAR 包存储在 HDFS 中,将来这些 JAR 包会分发给 Hadoop 集群中的服务器执行 MapReduce 计算。
2. 应用程序提交 job 作业给 JobTracker。
3.JobTacker 根据作业调度策略创建 JobInProcess 树,每个作业都会有一个自己的 JobInProcess 树。
4.JobInProcess 根据输入数据分片数目(通常情况就是数据块的数目)和设置的 Reduce 数目创建相应数量的 TaskInProcess。
5.TaskTracker 进程和 JobTracker 进程进行定时通信。
6. 如果 TaskTracker 有空闲的计算资源(有空闲 CPU 核心),JobTracker 就会给它分配任务。分配任务的时候会根据 TaskTracker 的服务器名字匹配在同一台机器上的数据块计算任务给它,使启动的计算任务正好处理本机上的数据,以实现我们一开始就提到的“移动计算比移动数据更划算”。
7.TaskTracker 收到任务后根据任务类型(是 Map 还是 Reduce)和任务参数(作业 JAR 包路径、输入数据文件路径、要处理的数据在文件中的起始位置和偏移量、数据块多个备份的 DataNode 主机名等),启动相应的 Map 或者 Reduce 进程。
8.Map 或者 Reduce 进程启动后,检查本地是否有要执行任务的 JAR 包文件,如果没有,就去 HDFS 上下载,然后加载 Map 或者 Reduce 代码开始执行。
9. 如果是 Map 进程,从 HDFS 读取数据(通常要读取的数据块正好存储在本机);如果是 Reduce 进程,将结果数据写出到 HDFS。
MapReduce数据合并与连接机制
Shuffle过程
每个 Map 任务的计算结果都会写入到本地文件系统,等 Map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在 Map 任务进程调用一个 Partitioner 接口,对 Map 产生的每个 <Key, Value> 进行 Reduce 分区选择,然后通过 HTTP 通信发送给对应的 Reduce 进程。这样不管 Map 位于哪个服务器节点,相同的 Key 一定会被发送给相同的 Reduce 进程。Reduce 任务进程对收到的 <Key, Value> 进行排序和合并,相同的 Key 放在一起,组成一个 <Key, Value 集合 > 传递给 Reduce 执行。
map 输出的 <Key, Value>shuffle 到哪个 Reduce 进程是这里的关键,它是由 Partitioner 来实现,MapReduce 框架默认的 Partitioner 用 Key 的哈希值对 Reduce 任务数量取模,相同的 Key 一定会落在相同的 Reduce 任务 ID 上。
为什么我们管Yarn叫作资源调度框架
Yarn:Yet Another Resource Negotiator
包括资源管理器(Resource Manager)
负责整个集群的资源调度管理;
通常部署在独立的服务器上;
包含两个组件
调度器
资源分配算法
分配容器
应用程序管理器(ApplicationMaster)
负责应用程序的提交
监控应用程序运行状态
包括节点管理器(Node Manager)
负责具体服务器上的资源和任务管理;
在集群的每一台计算服务器上都会启动,基本上跟HDFS的DataNode进程一起出现;
早期Hadoop(Hadoop1)的缺点
服务器集群资源调度管理和MapReduce执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如Spark或者Storm,就无法统一使用集群中的资源了。
Hadoop2:将Yarn从MapReduce中分离出来,成为一个独立的资源调度框架。
Yarn 的整个工作流程
1. 我们向 Yarn 提交应用程序,包括 MapReduce ApplicationMaster、我们的 MapReduce 程序,以及 MapReduce Application 启动命令。
MapReduce Application 启动命令:
hadoop jar /var/lib/hadoop-hdfs/codejar/flash_format_testip.jar com.js.dataclean.hm2_hour.Hm2_hour_Driver /data/hm2 /data/offline/hm2_output_2022-07-01 -D mapreduce.job.priority=VERY_HIGH -D mapreduce.map.memory.mb=4096 -D mapreduce.reduce.memory.mb=4096
2.ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster。
3.MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。
4.MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。
5.Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster 通信,汇报自己的运行状态,如果运行结束,MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源。
Yarn遵循:依赖倒转原则
高层模块不能依赖低层模块,它们应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块是实现。
Hive是如何让MapReduce实现SQL操作的
MapReduce实现SQL的原理
Hive的架构
数据定义语言(DDL)
Hive通过执行引擎Driver将数据表的信息记录在Metastore元数据组件中
数据查询语句(DQL)
Driver会将该语句提交给自己的编译器Compiler;
Compiler进行语法分析、语法解析、语法优化等操作;
生成一个MapReduce执行计划;
生成一个MapReduce的作业;
Hive如何实现join操作
几乎所有的大数据SQL引擎都不支持嵌套查询
将两种技术嫁接到一起,却是极具创新性的
我们并没有觉得MapReduce速度慢,直到Spark出现
靠事后分析的因果规律常常是错误的,往往把结果当作了原因;
我们常常意识不到问题的存在,直到有人解决了这些问题;
Spark和MapReduce相比
执行速度更快;
下图是 Spark 和 MapReduce 进行逻辑回归机器学习的性能比较,Spark 比 MapReduce 快 100 多倍。
编程模型更简单易用;
MapReduce可以理解成面向过程的大数据计算;
Spark可以理解成是面向对象的大数据计算;
Spark编程模型RDD
两种函数
转换函数
map(func),filter(func),union(otherDataset),reduceByKey(func,[numPartitions]),join(otherDataset,[numPartitions]),groupByKey([numPartitions])
分为两种
转换操作产生的RDD不会出现新的分片(例如:map,filter)【惰性计算】
转换操作产生的RDD产生新的分片
执行函数(action)
例如:count,collect,saveAsTestFile,saveAsSequenceFile,reduce,take,first,foreach等
不返回RDD
Spark生态体系
如何做到既不自以为是,又能逐渐摆脱平庸?
不要直接提出你的问题和方案;
迂回曲折地提出问题,一起思考问题背后的规律,才能逐渐发现问题的本质。
你觉得前一个版本最有意思(最有价值)的功能是什么?
你觉得我们这个版本应该优先关注哪个方面?
你觉得为什么有些用户在下单以后没有支付?
同样的本质,为何Spark可以更高效?
Spark也遵循移动计算比移动数据更划算这一大数据计算基本原则。
Spark的计算阶段
Spark可以根据应用的复杂程度,分割成更多的计算阶段,这些计算阶段组成一个有向无环图(DAG),Spark任务调度器可以根据DAG的依赖关系执行计算阶段。
Spark运行DAG的不同阶段的例子
从图上看,整个应用被切分成 3 个阶段,阶段 3 需需要依赖阶段 1 和阶段 2,阶段 1 和阶段 2 互不依赖。
Spark 在执行调度的时候,先执行阶段 1 和阶段 2,完成以后,再执行阶段 3。如果有更多的阶段,Spark 的策略也是一样的。只要根据程序初始化好 DAG,就建立了依赖关系,然后根据依赖关系顺序执行各个计算阶段,Spark 大数据应用的计算就完成了。
Spark 划分计算阶段的依据是什么呢?
当 RDD 之间的转换连接线呈现多对多交叉连接的时候,,就会产生新的阶段。
因此每次shuffle都产生新的计算阶段。
计算阶段划分的依据是shuffle,不是转换函数的类型。
依赖类型
窄依赖
不需要进行shuffle的依赖;
宽依赖
需要进行shuffle的依赖;
Spark将前一个的Reduce和后一个的Map连接起来,当作一个阶段持续计算,形成一个更加优雅、高效地计算模型。
减少对HDFS的访问;
减少作业的调度执行次数;
Spark优先使用内存进行数据存储,包括RDD数据。
Spark的作业管理
Spark的DAGScheduler在遇到shuffle的时候,会生成一个计算阶段(含多个计算任务),在遇到action函数的时候,会生成一个作业(job)。
作业、计算阶段、任务的依赖和时间先后关系
图中横轴方向是时间,纵轴方向是任务。两条粗黑线之间是一个作业,两条细线之间是一个计算阶段。一个作业至少包含一个计算阶段。水平方向红色的线是任务,每个阶段由很多个任务组成,这些任务组成一个任务集合。
Spark的执行过程
Spark 的运行流程
首先,Spark 应用程序启动在自己的 JVM 进程里,即 Driver 进程,启动后调用 SparkContext启动 DAGScheduler 构造执行的 DAG 图,切分成最小的执行单位也就是计算任务。
Spark Context 初始化的时候会生成两个比较重要的对象DAGSchedule 和 TaskSchedule, TaskSchedule 会进行任务资源的申请,因为我们这里是用 Yarn 作为资源调度器, 所以 TaskSchedule 会向 ResourceManager(RM) 进行资源申请。
然后 Driver 向 Cluster Manager 请求计算资源,用于 DAG 的分布式计算。Cluster Manager 收到请求以后,将 Driver 的主机地址等信息通知给集群的所有计算节点 Worker。
Worker 收到信息以后,根据 Driver 的主机地址,跟 Driver 通信并注册,然后根据自己的空闲资源向 Driver 通报自己可以领用的任务数。Driver 根据 DAG 图开始向注册的 Worker 分配任务。
Worker 收到任务后,启动 Executor 进程开始执行任务。Executor 先检查自己是否有 Driver 的执行代码,如果没有,从 Driver 下载执行代码,通过 Java 反射加载后开始执行。
Spark的三个主要特性
RDD的编程模型更简单;
DAG切分的多阶段计算过程更快速;(有些阶段可以并行)
使用内存存储中间计算结果更高效;
Spark的Cluster 和 Client 模式的对比
1、Client 模式因为 Driver 是在提交的机器上面启动的, 而我们也知道,Driver 在 Spark 任务运行中是承当着 任务调度 和 任务监控的 任务的。 也就是说 Spark 在运行过程中的所有信息都会向Driver 端进行汇报, 这也就造成了:
1、当在Client 端提交的任务过多,会导致 Client 这台机器的负载变大, 主要还是网卡容易成为瓶颈,一旦出现这种问题,就会导致Driver 超时, 而Driver超时会使得任务直接就失败。所以生产环境是不建议这么玩的。
2、同样因为Driver的存在,其监控Spark 任务的全过程, 其绝大部分日志信息都会向Driver汇总,很方便我们进行调试。 所以如果你的程序还在测试阶段,那么果断用 Client模式吧,会方便很多。
2、Client 模式 因为是Driver 的宿主,所以整个任务过程 Client的不能关闭的, 但是Cluster模式不一样,当任务提交后,其实Client在不在已经不影响任务的正常运行了。
BigTable的开源实现:HBase
先设计数据库然后设计程序,从而导致关系模型绑架对象模型,并由此引申出旷日持久的业务对象贫血模型与充血模型之争。
关系数据库难以克服的缺陷
糟糕的海量数据处理能力
僵硬的设计约束
HBase可伸缩架构
HBase的伸缩性主要依赖其可分裂的HRegion
HRegion是HBase负责数据存储的主要进程。
应用程序对数据的读写操作都是通过和HRegion通信完成。
HRegionServer是物理服务器,每个HRegionServer上可以启动多个HRegion实例。
当一个 HRegion 中写入的数据太多,达到配置的阈值时,一个 HRegion 会分裂成两个 HRegion,并将 HRegion 在整个集群中进行迁移,以使 HRegionServer 的负载均衡。
应用程序通过ZooKeeper调用HRegion时序图
每个HRegion中存储一段Key值区间[key1,key2)的数据。
以及可伸缩的分布式文件系统HDFS
HBase可扩展数据模型
NOSQL数据库使用的列族(ColumnFamily)设计可以做到可扩展的数据结构。
HBase 这种列族的数据结构设计,实际上是把字段的名称和字段的值,以 Key-Value 的方式一起存储在 HBase 中。实际写入的时候,可以随意指定字段名称,即使有几百万个字段也能轻松应对。
HBase的高性能存储
传统的机械式磁盘的访问特性是:
连续读写很快
随机读写很慢
HBase使用LSM(Log Structed Merge Tree)树的数据结构进行数据存储。
LSM(Log Structed Merge Tree)树
哈希存储引擎
是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。
复杂度都是O(1)
B树存储引擎
B树不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(Mysql等)。
复杂度都是O(n)
LSM树的设计思想
将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。
基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。
LSM树原理
把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。
流式计算的代表:Storm、Flink、Spark Streaming
Storm
早期的大数据实时处理:消息队列
图中的消息队列负责完成数据的流转;处理逻辑既是消费者也是生产者,也就是既消费前面消息队列的数据,也为下个消息队列产生数据。
Storm 算是一个比较早期的大数据流计算框架。上面的例子如果用 Storm 来实现,过程就变得简单一些了。
Stom架构(主从架构)
Spark Streaming
下图这张图描述了 Spark Streaming 将数据分段、分批的过程。
Spark Streaming 巧妙地利用了 Spark 的分片和快速计算的特性,将实时传输进来的数据按照时间进行分段,把一段时间传输进来的数据合并在一起,当作一批数据,再去交给 Spark 去处理。
Flink
Flink 一开始就是按照流处理计算去设计的。
当把从文件系统(HDFS)中读入的数据也当做数据流看待,他就变成批处理系统了。
为什么Flink既可以流处理又可以批处理?
如果要进行流计算,Flink 会初始化一个流执行环境 StreamExecutionEnvironment,然后利用这个执行环境构建数据流 DataStream。
Flink 处理实时数据流的方式跟 Spark Streaming 也很相似,也是将流数据分段后,一小批一小批地处理。
Flink 对流处理的支持也更加完善,它可以对数据流执行 window 操作,将数据流切分到一个一个的 window 里,进而进行计算。
如果要进行批处理计算,Flink 会初始化一个批处理执行环境 ExecutionEnvironment,然后利用这个环境构建数据集 DataSet。
Flink架构(和Hadoop1或者Yarn看起来很像)
JobManager 是 Flink 集群的管理者,Flink 程序提交给 JobManager 后,JobManager 检查集群中所有 TaskManager 的资源利用状况,如果有空闲 TaskSlot(任务槽),就将计算任务分配给它执行。
ZooKeeper是如何保证数据一致性的
ZooKeeper专门用来保证数据一致性的高可用系统;
Paxos算法
多台服务器通过内部的投票表决机制决定一个数据的更新与写入;
基本思路
应用程序连接到任意一台服务器后提起状态修改请求(也可以是获得某个状态锁的请求),从图上看也就是服务器 1,会将这个请求发送给集群中其他服务器进行表决。如果某个服务器同时收到了另一个应用程序同样的修改请求,它可能会拒绝服务器 1 的表决,并且自己也发起一个同样的表决请求,那么其他服务器就会根据时间戳和服务器排序规则进行表决。
表决结果会发送给其他所有服务器,最终发起表决的服务器也就是服务器 1,会根据收到的表决结果决定该修改请求是否可以执行,从而在收到请求的时候就保证了数据的一致性。
只考虑服务器都是可信的情况(不存在恶意服务器)。【解决办法:区块链】
ZooKeeper实现方式
ZAB(ZooKeeper Atomic Broadcast)原子消息广播协议
ZooKeeper系统中所有服务器都存储相同的数据,也就是数据没有分片存储;
ZooKeeper通过一种树状结构记录数据
ZooKeeper集群的性能会随着服务器数量的增加而下降。
模块答疑:我们能从Hadoop学到什么?
识别机会、把握机会
虽然大数据技术已经成熟,但是和各种应用场景的结合正方兴未艾,如果你能看到大数据和你所在的领域结合的机会,也许你就找到了一次出人头地的机会。
大数据领域的一个架构模式
集中管理,分布存储与计算
5-20-2法则
5分钟的时间了解这个新知识的特点、应用场景、要解决的问题;
用20分钟理解它的主要设计原理、核心思想和思路;
再花2个小时看关键设计细节,尝试使用或者做一个demo;
互联网请求的处理过程
模块答疑:这么多技术,到底都能用在什么场景?
大数据资源管理
Yarn
大数据存储
大数据文件系统
HDFS
NoSQL
HBase
大数据计算
大数据批计算
MapReduce
Spark
大数据流计算
Storm
Spark Streaming
Flink
大数据仓库
Hive
Spark SQL
模块答疑:我能从大厂的大数据开发实践中学到什么?
学习技术的方法
1.直接读原始论文
掌握核心设计原理
2.官网看官方文档
3.读源码
大数据实践的层次
第一个层次:练习实践
第二个层次:应用实践
第三个层次:开发实践
大数据开发的实践
如何自己开发一个大数据SQL引擎
Hive 的主要处理过程
Panthera 的设计思路是保留 Hive 语义分析器不动,替换 Hive 语法解析器,使其将标准 SQL 语句转换成 Hive 语义分析器能够处理的 Hive 抽象语法树。用图形来表示的话,是用红框内的部分代替黑框内原来 Hive 的部分。
1. 将输入的 Hive QL 经过语法解析器转换成 Hive 抽象语法树(Hive AST)。
2. 将 Hive AST 经过语义分析器转换成 MapReduce 执行计划。
3. 将生成的 MapReduce 执行计划和 Hive 执行函数代码提交到 Hadoop 上执行。
标准 SQL 和 Hive QL 的差别
一个是语法表达方式,Hive QL 语法和标准 SQL 语法略有不同;
另一个是 Hive QL 支持的语法元素比标准 SQL 要少很多;
比如,数据仓库领域主要的测试集TPC-H所有的 SQL 语句 Hive 都不支持。尤其是是 Hive 不支持复杂的嵌套子查询,而对于数据仓库分析而言,嵌套子查询几乎是无处不在的。
开发支持标准 SQL 语法的 SQL 引擎的难点
将复杂的嵌套子查询消除掉,也就是 where 条件里不包含 select
SQL 的理论基础是关系代数5种操作:并、差、积、选择、投影
一个嵌套子查询可以等价转换成一个连接(join)操作。
标准 SQL 语法集的语法点非常多,经过近两年的努力,依然没有全部适配所有的标准 SQL 语法。
语法树
Spark的性能优化方案案例分析
软件性能优化
你不能优化一个没有经过性能测试的软件。
你不能优化一个你不了解其架构设计的软件。
性能指标
响应时间
完成一次任务(请求)花费的时间。
并发数
同时处理的任务数(请求数)。
吞吐量
单位时间完成的任务数(请求数、事务数、查询数...)
性能计数器
System Load,线程数,进程数,CPU,内存,磁盘,网络使用率等。
性能优化过程
1.做性能测试,分析性能状况和瓶颈点。
2.针对软件架构设计进行分析,寻找导致性能问题的原因。
3.修改相关代码和架构,进行性能优化。
4.做性能测试,对比是否提升性能,并寻找下一个性能瓶颈。
大数据软件性能优化
1.SQL语句优化。
Hive的MapJoin语法join一张小表,在Map阶段完成,无需shuffle。
2.数据倾斜处理。
数据倾斜是指当两张表进行 join 的时候,其中一张表 join 的某个字段值对应的数据行数特别多,那么在 shuffle 的时候,这个字段值(Key)对应的所有记录都会被 partition 到同一个 Reduce 任务,导致这个任务长时间无法完成。
3.MapReduce、Spark代码优化。
4.配置参数优化。
根据公司数据特点,为部署的大数据产品以及运行的作业选择合适的配置参数,是公司大数据平台性能优化最主要的手段,也是大数据运维工程师的主要职责。
5.大数据开源软件代码优化。
Spark性能优化案例
案例1:Spark 任务文件初始化调优
同一台服务器上的多个 Executor 进程不必每个都通过网络下载应用程序,只需要一个进程下载到本地后,其他进程将这个文件 copy 到自己的工作路径就可以了。
案例2:Spark任务调度优化
从图中看到,在第一个 job 的第二个阶段,第三台机器的 CPU 使用率和其他机器明显不同,也就是说计算资源利用不均衡,这种有忙有闲的资源分配方式通常会引起性能问题。
进一步分析日志,发现 Worker 节点向 Driver 注册有先有后,先注册的 Worker 开始领取任务,如果需要执行的任务数小于 Worker 提供的计算单元数,就会出现一个 Worker 领走所有任务的情况。
而第一个 job 的第二个 stage 刚好是这样的情况,demo 数据量不大,按照 HDFS 默认的 Block 大小,只有 17 个 Block,第二个 stage 就是加载这 17 个 Block 进行初始迭代计算,只需要 17 个计算任务就能完成,所以当第三台服务器先于其他三台服务器向 Driver 注册的时候,触发 Driver 的任务分配,领走了所有 17 个任务。
同时,为了避免这种一个 Worker 先注册先领走全部任务的情况,我们考虑的一个优化策略是增加一个配置项,只有注册的计算资源数达到一定比例才开始分配任务,默认值是 0.8。
spark.scheduler.minRegisteredResourcesRatio = 0.8
为了避免注册计算资源达不到期望资源比例而无法开始分配任务,在启动任务执行时,又增加了一个配置项,也就是最小等待时间,超过最小等待时间(秒),不管是否达到注册比例,都开始分配任务。
spark.scheduler.maxRegisteredResourcesWaitin
案例3:Spark应用配置优化
看案例 2 的几张 CPU 利用率的图,我们还发现所有 4 个 Worker 服务器的 CPU 利用率最大只能达到 60% 多一点。例如下图,绿色部分就是 CPU 空闲。
这种资源利用瓶颈的分析无需分析 Spark 日志和源代码,根据 Spark 的工作原理,稍加思考就可以发现,当时使用的这些服务器的 CPU 的核心数是 48 核,而应用配置的最大 Executor 数目是 120,每台服务器 30 个任务,虽然 30 个任务在每个 CPU 核上都 100% 运行,但是总的 CPU 使用率仍只有 60% 多。
具体优化也很简单,设置应用启动参数的 Executor 数为 48×4=192 即可。
案例4:操作系统配置优化
在性能测试过程中发现,当使用不同服务器的时候,CPU 资源利用情况也不同,某些服务器的 CPU 处于 sys 态,即系统态运行的占比非常高,如下图所示。
图中紫色为 CPU 处于 sys 态,某些时候 sys 态占了 CPU 总使用率的近 80%,这个比例显然是不合理的,表示虽然 CPU 很忙,但是没有执行用户计算,而是在执行操作系统的计算。
那么,操作系统究竟在忙什么,占用了这么多 CPU 时间?通过跟踪 Linux 内核执行指令,发现这些 sys 态的执行指令和 Linux 的配置参数 transparent huge pages 有关。
案例5:硬件优化
分析网卡的资源消耗,发现网络通信是性能的瓶颈,对整个应用的影响非常明显。比如在第二个、第三个 job,网络通信消耗长达 50 秒的时间,网络读写通信都达到了网卡的最大吞吐能力,整个集群都在等待网络传输。
我们知道千兆网卡的最大传输速率是每秒 125MB,这样的速率和 CPU 内存固然没法比,而虽然比单个磁盘快一些,但是服务器磁盘是 8 块磁盘组成的阵列,总的磁盘吞吐量依然碾压千兆网卡,因此网卡传输速率的瓶颈就成为整个系统的性能瓶颈。
从阿里内部产品看海量数据处理系统的设计
当你想做一个新东西,它必须要能解决当前的问题,这是人类社会的基本运行规律。
这个世界不可能没有问题,重要的是你要能发现问题。
技术只是手段,技术不落在正确的问题上一点用也没有,而落在错误的问题上甚至会搬起石头砸了自己的脚。
阿里技术产品:Doris
整体结构
Doris 是一种支持 Key、Value 数据结构的分布式存储系统,核心要解决的问题是分布式路由、分布式集群伸缩、分布式数据冗余与失效转移。所以 Doris 把分布式存储系统很重要的一块,也就是数据存储部分转移出去,使用第三方软件完成,当时选择 Berkeley DB 作为 Doris 的底层存储 Store,Doris 自己专注于分布式技术实现。
Doris 的主要访问模型是,应用程序 KV Client 启动后,连接控制中心 Administration,从控制中心获得整个 Doris 集群的服务器部署信息及路由算法,Client 使用 Key 作为参数进行路由计算,计算得到集群中某些服务器作为当前 Key、Value 数据存储的服务器节点;然后 KV Client 使用自定义的通信协议将数据和命令传输给服务器上的 Data Server 组件,DataServer 再调用本地的 Berkeley DB 将数据存储到本地磁盘。
创新性
分区路由算法
Doris 采用一种基于虚拟节点的分区路由算法,Key 使用余数 Hash 算法计算得到虚拟节点下标。
虚拟节点下标 = hash(md5(key)) mod 虚拟节点个数
虚拟节点和物理服务器节点之间计算建立一个映射关系,通过映射关系查找实际要访问的物理服务器 IP 地址。
路由算法在初始化的时候就预先设立一个较大的数字,比如 100000,当存储服务器集群需要伸缩的时候,要增加一个服务器,虚拟节点和下标计算算法不变,仅仅调整虚拟节点和物理服务器节点的映射关系就可以了,如 PPT 中图 2 所示。
这种基于虚拟节点的分区路由算法相对于传统的一致性 Hash 路由算法,可以获得更好的数据负载均衡,即数据在各个服务器上的存储分布更加均衡。在集群伸缩、增加服务器的时候可以做到更少迁移数据。在实践中,这种算法的一个更大优势是,如果将物理存储的文件系统和虚拟节点关联,即一个虚拟节点对应一个物理存储文件,那么当集群扩容,进行数据迁移的时候,就可以以文件为单位进行数据拷贝,这样迁移速度和运维成本都非常低。
这个基于虚拟节点的分区路由算法的关键难点是,如何计算虚拟节点与物理节点的映射关系,特别是在增加服务器的时候,如何重新计算这个映射关系,使新的映射关系依然处于负载均衡的状态,也就是每个物理节点映射的虚拟节点个数差不太多相同。
失效转移策略
冗余备份实现方式
Doris 将存储服务器集群分成多个 group(默认情况下为 2 个 group),数据写操作的时候,根据分区路由算法,在每个 group 里计算一个服务器地址,异步并发同时向多个 group 的服务器上写入数据,以此保证数据有多个备份。
1.对等Node访问;
2.双写保护可用性(W=2,R=1);
3.基于分区算法查找两个Node;
4.数据恢复和数据同步;
3种失效情况
当 KV Client 访问某台服务器失败的时候,Doris 会启动失效转移策略。具体来说,Doris 将失效分为三种情况:瞬时失效、临时失效、永久失效,不同情况采用不同的失效转移策略。
瞬时失效
当第一次不能访问服务器的时候,Doris 认为这是瞬时失效,会进行访问重试,如果三次重试后仍然失败,就会把失败信息提交给控制中心。控制中心检测该服务器心跳是否正常,并进行尝试访问,如果访问失败,就将该服务器标记为临时失效,并通知所有 KV Client 应用程序。
临时失效
KV Client 应用程序收到服务器失效通知的时候,启动临时失效策略,将原本需要写入到失效节点(图中的物理节点 2)的数据写入临时日志节点(图中的物理节点 X),而读操作则只访问正常的物理节点 1。
当临时失效节点 2 恢复正常运行,系统会将失效期间写入临时日志节点 X 的数据合并恢复到物理节点 2,这段时间物理节点 2 只提供写服务,不提供读服务。当所有数据恢复完毕,集群访问恢复正常。
永久失效
而对于永久失效的节点,需要添加新的服务器以代替下线的服务器,基本策略就是将另一个 group 正常使用的服务器数据拷贝到新添加的服务器上即可。
集群伸缩设计方案
具体过程为:
1. 向集群中一个分组 group 添加新的物理服务器,部署并启动 Doris 服务器进程。
2. 将这个 group 的所有服务器设置为临时失效。
3. 使用路由算法重新计算加入服务器后的虚拟节点分布,并把需要迁移的虚拟节点对应的物理文件拷贝到新服务器上。
4. 设置 group 所有服务器临时失效恢复,将扩容期间的数据更新写回到这些服务器。
大数据基准测试可以带来什么好处?
大数据基准测试的应用
经过对比测试以后,我发现情况并不乐观。Impala 性能有优势的地方在于聚合查询,也就是用 group by 查询的 SQL 语句;而对于连接查询,也就是用 join 查询的 SQL 语句性能表现很差。我进一步阅读 Impala 的源代码,对设计原理和架构进行分析后,得出了自己的看法,我认为适合 Impala 的应用场景有两类:
一类是简单统计查询,对单表数据进行聚合查询,查看数据分布规律。
一类是预查询,在进行全量数据的 SQL 查询之前,对抽样数据进行快速交互查询,验证数据分析师对数据的判断,方便数据分析师后续设计全量数据的查询 SQL,而全量数据的 SQL 还是要运行在 Hive 上。
这样 Impala 就有点尴尬了,它的定位似乎只是 Hive 的附属品。这就好比 Impala 是餐前开胃菜和餐后甜点,而正餐依然是 Hive。
好的工作不光是对公司有利,对员工也是有利的。工作不是公司在压榨员工的过程,而是公司创造价值,同时员工实现自我价值的过程。
大数据基准测试工具HiBench
主要的大数据计算程序
Sort
WordCount
TeraSort
Bayes分类
k-means分类
逻辑回归
SQL
PageRank
使用步骤
1. 配置,配置要测试的数据量、大数据运行环境和路径信息等基本参数。
2. 初始化数据,生成准备要计算的数据,比如要测试 1TB 数据的排序,那么就生成 1TB 数据。
3. 执行测试,运行对应的大数据计算程序。
从大数据性能测试工具Dew看如何快速开发大数据系统
Dew设计与开发
Dew的部署模型
从图中看,Dew 的核心进程有两种,一种是 Dew Master 进程 Herse,另一种是管理集群中每台服务器的 Dew Agent 进程 DewDrop,Dew Agent 监控整个 Hadoop 集群的每台服务器。Herse 独立部署一台服务器,而 DewDrop 则和 HDFS 的 DataNode、Yarn 的 NodeManager 部署在大数据集群的其他所有服务器上,也就是每台服务器都同时运行 DataNode、NodeManager、DewDrop 进程。
启动和注册时序图
Akka原理和应用
响应式编程
全部消息都是异步,通过异步消息完成业务处理的编程方式
Actor 编程就是响应式编程的一种。
异步消息实现原理
Akka 实现异步消息的主要原理是,Actor 之间的消息传输是通过一个收件箱 Mailbox 完成的,发送者 Actor 的消息发到接收者 Actor 的收件箱,接收者 Actor 一个接一个地串行从收件箱取消息调用自己的 receive 方法进行处理。这个过程请看下面的图。
所有的不确定都是机会——智慧写给你的新年寄语
所有的一切都是不确定,而不确定的一切都是机会。
确定的领域
不重要
努力
重要
资源
关系
等级
资历
蛋糕以及做好
不确定的领域
重要
努力
聪明
野心
欲望
运气
有可能做出新的蛋糕
模块答疑:为什么大数据平台至关重要
技术不同于科学,科学拓展人类的认知边界,而技术是人们改造世界的工具,科学的成果可以转化为技术;而技术真正能够改造世界,需要技术落地,真正应用到生产过程中。
大数据平台不但对应用至关重要,对各种大数据技术产品也至关重要。事实上,大数据平台对大数据工程师的技术进阶也非常重要。
软件架构师就是对软件各个组成部分及其关系进行设计和描述的那个人。
从按照需求进行业务功能开发的程序员进阶到软件架构师,并不是随着经验积累、工作年限的增加就能自动能完成的。
模块答疑:为什么说数据驱动运营?
大数据的核心就是数据本身;
中国互联网三巨头 BAT(百度、阿里巴巴、腾讯)的企业组织与管理
百度是技术驱动的
阿里巴巴是运营驱动的
腾讯是产品驱动的
一般的互联网企业
组织方式
工作模式
问题
至少 80% 的业务需求没有实现最初期望的价值,相当一部分功能甚至完全没有起任何作用。
解决办法
业务数据监控
数据驱动
我们学大数据,手里用的是技术,眼里要看到数据,要让数据为你所用。数据才是核心才是不可代替的,技术并不是。
用好数据,方能洞悉真相
模块答疑:软件工程师如何进入人工智能领域
数学基础
机器学习算法
大数据技术与机器学习框架
人工智能应用
具有发展前景的人工智能技术
人工智能管理
根据人工智能模型和数据管理企业,包括决策权的划分、组织结构、绩效管理等。
通用人工智能
目前的人工智能仅仅在相对封闭、重复的场景中适用,稍稍扩大应用范围,特别是和人类交互的时候,经常表现得非常“弱智”。但是放到更长远来看,通用人工智能,即强人工智能还是值得期待的。
知识图谱
将具有各种关联关系的信息通过图的方式组织在一起,自动发现各种信息、数据、资产、商品、人、知识等各种关系并加以利用。
神经形态硬件
按照神经网络神经元形态构造硬件,即“芯片大脑”。
自然语言生成
根据语境语义自动生成自然语言,既可以生成各种有格式化的报告,也可以生成诗词歌赋等文艺作品。
过热人工智能技术
人工智能平台即服务
深度神经网络专用芯片
智能机器人
语音交互
智能应用
图形分析
目标分析
深度学习
自然语言处理
虚拟助理
进入冷静期的人工智能技术
计算机视觉
预测分析
自动驾驶
增强现实 AR
大数据平台与系统集成
互联网产品+大数据产品=大数据平台
互联网大数据平台架构
在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使用开源大数据产品或者自己开发相关大数据组件。
数据采集
将应用程序产生的数据和日志等同步到大数据系统中,由于数据源不同,这里的数据同步系统实际上是多个相关系统的组合。
工具
Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导入到Hadoop的HDFS中,也可以将HDFS的数据导入到关系型数据库中。
Flume
日志收集系统;
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
Kafka
Kafka 是一种高吞吐量 的分布式发布订阅消息系统;
特性
数据处理
这部分是大数据存储与计算的核心,数据同步系统导入的数据存储在 HDFS。
工具
离线计算
MapReduce
Hive
Spark
流式计算
Storm
Spark Steaming
数据输出与展示
大数据计算产生的数据还是写入到 HDFS 中,但应用程序不可能到 HDFS 中读取数据,所以必须要将 HDFS 中的数据导出到数据库中。
工具
Sqoop
作业调度管理系统
开源工具
Oozie
Lambda架构
1. 数据(new data)同时写入到批处理大数据层(batch layer)和流处理大数据层(speed layer)。
2. 批处理大数据层是数据主要存储与计算的地方,所有的数据最终都会存储到批处理大数据层,并在这里被定期计算处理。
3. 批处理大数据层的计算结果输出到服务层(serving layer),供应用使用者查询访问。
4. 由于批处理的计算速度比较慢,数据只能被定期处理计算(比如每天),因此延迟也比较长(只能查询到截止前一天的数据,即数据输出需要 T+1)。所以对于实时性要求比较高的查询,会交给流处理大数据层(speed layer),在这里进行即时计算,快速得到结果。
5. 流处理计算速度快,但是得到的只是最近一段时间的数据计算结果(比如当天的);批处理会有延迟,但是有全部的数据计算结果。所以查询访问会将批处理计算的结果和流处理计算的结果合并起来,作为最终的数据视图呈现。
大数据从哪里来?
从数据库导入
目标对象
关系型数据库
工具
Sqoop
Canal(实时)
基于数据库增量日志解析,提供增量数据订阅和消费;
从日志导入
目标对象
依据这些日志数据,可以分析程序执行状况,比如应用程序抛出的异常;也可以统计关键业务指标,比如每天的 PV、UV、浏览数 Top N 的商品等。
工具
Flume
从图上看,Flume 收集日志的核心组件是 Flume Agent,负责将日志从数据源收集起来并保存到大数据存储设备。
Agent Source 负责收集日志数据,支持从 Kafka、本地日志文件、Socket 通信端口、Unix 标准输出、Thrift 等各种数据源获取日志数据。
Source 收集到数据后,将数据封装成 event 事件,发送给 Channel。Channel 是一个队列,有内存、磁盘、数据库等几种实现方式,主要用来对 event 事件消息排队,然后发送给 Sink。
Sink 收到数据后,将数据输出保存到大数据存储设备,比如 HDFS、HBase 等。Sink 的输出可以作为 Source 的输入,这样 Agent 就可以级联起来,依据具体需求,组成各种处理结构,比如下图的结构。
这是一个日志顺序处理的多级 Agent 结构,也可以将多个 Agent 输出汇聚到一个 Agent,还可以将一个 Agent 输出路由分发到多个 Agent,根据实际需求灵活组合。
前端埋点采集
谓前端埋点,就是应用前端为了进行数据统计和分析而采集数据。
方式
手工埋点
手工埋点就是前端开发者手动编程将需要采集的前端数据发送到后端的数据采集系统。
自动化埋点
自动化埋点则是通过一个前端程序 SDK,自动收集全部用户操作事件,然后全量上传到后端服器。
优点
开发工作量小,数据规范统一。
缺点
采集的数据量大,很多数据采集来也不知道有什么用,白白浪费了计算资源,特别是对于流量敏感的移动端用户而言,因为自动化埋点采集上传花费了大量的流量,可能因此成为卸载应用的理由,这样就得不偿失了。
在实践中,有时候只是针对部分用户做自动埋点,抽样一部分数据做统计分析。
可视化埋点
通过可视化的方式配置哪些前端操作需要埋点,根据配置采集数据。可视化埋点实际上是可以人工干预的自动化埋点。
爬虫系统
通过网络爬虫获取外部数据也是公司大数据的重要来源之一。有些数据分析需要行业数据支撑,有些管理和决策需要竞争对手的数据做对比,这些数据都可以通过爬虫获取。
知名大厂如何搭建大数据平台
淘宝大数据平台
第一部分(上面):数据源与数据同步
数据源
在 Hadoop 中的计算任务会通过天网调度系统,根据集群资源和作业优先级,调度作业的提交和执行。计算结果写入到 HDFS,再经过 DataExchange 同步到 MySQL 和 Oracle 数据库。处于平台下方的数据魔方、推荐系统等从数据库中读取数据,就可以实时响应用户的操作请求。
Oracle
MySQL
日志
爬虫系统
第二部分(中间):是云梯 1,也就是淘宝的 Hadoop 大数据集群
第三部分(下面):是大数据的应用,使用大数据集群的计算结果。
核心
天网调度系统
淘宝大数据平台的核心是位于架构图左侧的天网调度系统,提交到 Hadoop 集群上的任务需要按序按优先级调度执行,Hadoop 集群上已经定义好的任务也需要调度执行,何时从数据库、日志、爬虫系统导入数据也需要调度执行,何时将 Hadoop 执行结果导出到应用系统的数据库,也需要调度执行。可以说,整个大数据平台都是在天网调度系统的统一规划和安排下进行运作的。
美团大数据平台
美团大数据平台的数据源来自 MySQL 数据库和日志,数据库通过 Canal 获得 MySQL 的 binlog,输出给消息队列 Kafka,日志通过 Flume 也输出到 Kafka。
Kafka 的数据会被流式计算和批处理计算两个引擎分别消费。流处理使用 Storm 进行计算,结果输出到 HBase 或者数据库。批处理计算使用 Hive 进行分析计算,结果输出到查询系统和 BI(商业智能)平台。
数据分析师可以通过 BI 产品平台进行交互式的数据查询访问,也可以通过可视化的报表工具查看已经处理好的常用分析指标。公司高管也是通过这个平台上的天机系统查看公司主要业务指标和报表。
美团大数据平台的整个过程管理通过调度平台进行管理。公司内部开发者使用数据开发平台访问大数据平台,进行 ETL(数据提取、转换、装载)开发,提交任务作业并进行数据管理。
数据源
MySQL
日志
滴滴大数据平台
流式计算平台
实时计算平台架构如下。数据采集以后输出到 Kafka 消息队列,消费通道有两个,一个是数据 ETL,使用 Spark Streaming 或者 Flink 将数据进行清洗、转换、处理后记录到 HDFS 中,供后续批处理计算。另一个通道是 Druid,计算实时监控指标,将结果输出到报警系统和实时图表系统 DashBoard。
数据ETL
计算实时监控指标(Druid)
离线计算平台
离线计算平台架构如下。滴滴的离线大数据平台是基于 Hadoo 2(HDFS、Yarn、MapReduce)和 Spark 以及 Hive 构建,在此基础上开发了自己的调度系统和开发系统。调度系统和前面其他系统一样,调度大数据作业的优先级和执行顺序。开发平台是一个可视化的 SQL 编辑器,可以方便地查询表结构、开发 SQL,并发布到大数据集群上。
Hadoo2(HDFS,Yarn,MapReduce)
Spark
Hive
HBase平台
来自于实时计算平台和离线计算平台的计算结果被保存到 HBase 中,然后应用程序通过 Phoenix 访问 HBase。而 Phoenix 是一个构建在 HBase 上的 SQL 引擎,可以通过 SQL 方式访问 HBase 上的数据。
腾讯大数据架构
一个解决方案可以解决重复出现的同类问题,这种解决方案就叫作模式。
盘点可供中小企业参考的商业大数据平台
大数据解决方案提供商
Cloudera商业大数据服务的公司
大数据集成平台(CDH)
系统集成
数据库导入导出用 Sqoop
日志导入导出用 Flume
其他实时数据导入导出用 Kafka
大数据存储
文件系统用 HDFS
结构化数据用 Kudu
NoSQL 存储用 HBase
其他还有对象存储
统一服务
资源管理用 Yarn
安全管理用 Sentry 和 RecordService 细粒度地管理不同用户数据的访问权限。
过程、分析与计算
批处理计算用 MapReduce、Spark、Hive、Pig
流计算用 Spark Streaming
快速 SQL 分析用 Impala
搜索服务用 Solr
HortonWorks
于2018年10月和Cloudera合并
星环科技(国内)
主要是为政府和传统企业向大数据转型过程中提供技术支持服务。
核心产品
CDH
TDH
大数据云计算服务商
把大数据服务当作基础设施(基础设施即服务,IaaS)和平台(平台即服务,PaaS)
阿里云
阿里云的数加:
1.数据集成
提供大数据同步服务,通过提供 reader 和 writer 插件,可以将不同数据源(文本、数据库、网络端口)的数据导入、导出。
2.E-MapReduce
集成了 Hadoop、Spark、Hive 等主要大数据产品,用户可以直接将自己的 MapReduce、Spark 程序或者 Hive QL 提交到 E-MapReduce 上执行。
3. 分析性数据库 AnalyticDB
提供快速低延迟的数据分析服务,类似 Cloudera 的 Impala。
4. 实时计算
基于 Flink 构建的流计算系统。
大数据SaaS服务商
把大数据服务当作软件提供给企业(软件即服务,SaaS)
友盟
神策
百度统计
大数据开发平台
这类平台并不为用户提供典型的数据处理服务,它自身就有大量的数据。比如各类政府和公共事业机构、各类金融和商业机构,它们自己存储着大量的公共数据,比如中国气象局有海量的历史天气数据、中国人民银行有大量的客户征信数据、阿里巴巴有海量的电子商务数据。
还有一种风控大数据开放平台,结合用户数据和自身数据进行大数据计算。金融借贷机构将借款人信息输入风控大数据平台,大数据平台根据自己的风控模型和历史数据进行风险分析,给出风险指数。
当大数据遇上物联网
未来 20 年最有发展潜力的三项技术分别是:区块链、人工智能、物联网。
物联网应用场景分析
智能家居
小米
车联网
物联网平台架构
终端传感器实时采集数据,利用移动数据网络将数据上传给智能网关,智能网关进行初步的数据处理,根据规则和机器学习模型进行计算,再将计算结果通过移动数据网络下发给可控制的终端智能设备。
由于传感器可能部署在很多相距较远的地方,而且数量庞大,所以不可能将传感器数据直接接入云端服务器,而且也不是所有的传感器数据都需要实时上传云端。所以,需要有一个在传感器现场的前置服务器进行现场管理。智能网关就是距离现场传感器最近的一个计算机。
物联网主要是将各种传感器和智能设备连接起来,将数据上传云端,根据规则和机器学习模型进行远程控制,并通过物联网应用程序进行监控管理。
边缘计算
处于整个云计算的边缘,所以在智能网关上的计算
科技巨头们为了在争夺市场份额,不断抛出新的科技名词,企图主导科技的话语权,进而获得经济利益。而大众也会审美疲劳,需要市场上不断有新鲜的东西问世。
大数据技术在物联网中的应用
物联网大数据平台架构
1. 智能网关通过消息队列将数据上传到物联网大数据平台,Storm 等流式计算引擎从消息队列获取数据,对数据的处理
数据进行清理转换后写入到大数据存储系统。
调用规则和机器学习模型,对上传数据进行计算,如果触发了某种执行规则,就将控制信息通过设备管理服务器下发给智能网关,并进一步控制终端智能设备。
将实时统计信息和应用程序监听的数据发送给应用程序设备,供使用者查看管理。
2.Spark 等离线计算引擎定时对写入存储系统的数据进行批量计算处理,进行全量统计分析和机器学习,并更新机器学习模型。
3. 应用程序也可以通过设备管理服务器直接发送控制指令给智能网关,控制终端智能设备。
函数即服务 FaaS
在应用程序或者云控制台上编写函数,分发到智能网关执行
Serverless 的一种实现
大数据分析与运营
互联网运营数据指标与可视化监控
从公司角度看,运营数据是公司运行发展的管理基础,既可以通过运营数据了解公司目前发展的状况,又可以通过调节这些指标对公司进行管理,即数据驱动运营
明确问题
1.用户(指标给谁看)
2.核心指标是什么?
3.上线时间点
互联网运营常用数据指标
1.新增用户数
新增用户数是网站增长性的关键指标,指新增加的访问网站的用户数(或者新下载 App 的用户数)
新增用户数有日新增用户数、周新增用户数、月新增用户数等几种统计口径。
2.用户留存率
网站把经过一段时间依然没有流失的用户称作留存用户,留存用户数比当期新增用户数就是用户留存率。
用户留存率 = 留存用户数 / 当期新增用户数
计算留存有时间窗口:3日留存,5日留存,7日留存等
用户流失率 = 1 - 用户留存率
3.活跃用户数
活跃用户数表示打开使用产品的用户数
根据统计口径不同,有日活跃用户数、月活跃用户数等
4.PV
用户每次点击,每个页面跳转,被称为一个 PV(Page View)
5.GMV
GMV 即成交总金额(Gross Merchandise Volume)
订单量(用户下单总量)
客单价(单个订单的平均价格)
6.转化率
转化率是指在电商网站产生购买行为的用户与访问用户之比。
转化率 = 有购买行为的用户数 / 总访问用户数
数据可视化图表与数据监控
1.折线图
2.散点图
3.热力图
4.漏斗图
一个电商网站订单下降的数据
数据分析案例
订单量异常
新增用户量
订单活跃转化率
搜索打开转化率 = 搜索用户数 / 打开用户数
...
数据分析方法
金字塔分析方法(思维导图)
订单量下降
外部原因
竞争对手搞活动
出现关于公司的负面新闻报道
内部原因
商品缺货
商品价格异常
大数据技术
大数据产品
大数据存储
大数据文件系统
HDFS
NoSQL
HBase
大数据计算
大数据批计算
MapReduce
Spark
大数据流计算
Storm
Spark Streaming
Flink
大数据仓库
Hive
Spark SQL
Impala
大数据资源管理
Yarn
大数据平台
大数据平台架构
商业大数据平台
大数据应用
大数据分析
报表统计
运营分析
AB测试
大数据机器学习
回归
分类
贝叶斯
决策树
关联规则
神经网络
A/B测试与灰度发布必知必会
A/B测试过程
A/B 测试将每一次测试当作一个实验。
通过 A/B 测试系统的配置,将用户随机分成两组(或者多组),每组用户访问不同版本的页面或者执行不同的处理逻辑,即运行实验。
通常将原来产品特性当作一组,即原始组;
新开发的产品特性当作另一组,即测试组。
A/B测试的系统架构
A/B 测试系统最重要的是能够根据用户 ID(或者设备 ID)将实验配置参数分发给应用程序,应用程序根据配置参数决定给用户展示的界面和执行的业务逻辑,如下图。
在实验管理模块里进行用户分组,比如测试组、原始组,并指定每个分组用户占总用户的百分比;
流量分配模块根据某种 Hash 算法将用户(设备)分配到某个实验组中;
一个实验可以有多个参数,每个组有不同的参数值;
灰度发布
灰度发布:即不是一次将新版本发布给全部用户,而是一批一批逐渐发布给用户;
灰度发布系统可以用 A/B 测试系统来承担,创建一个名叫灰度发布的实验即可,这个实验包含这次要发布的所有特性的参数,然后逐步增加测试组的用户数量,直到占比达到总用户量的 100%,即为灰度发布完成。
也可以利用应用市场实现灰度发布。即在发布产品新版本的时候,不是一次在所有应用市场同时发布,而是有选择地逐个市场发布。
灰度发布的过程也叫作灰度放量,灰度放量是一种谨慎的产品运营手段。
如何利用大数据成为“增长黑客”
增长黑客是近几年颇为流行的一个词汇,它是指利用数据、技术、产品等一系列手段为互联网产品获得快速用户增长的人。
Hotmail的增长黑客故事
AARRR用户增长模型
获取用户(Acquisition)
通过各种推广手段,使产品触达用户并吸引用户,让用户访问我们的产品。
提高活跃度(Activation)
需要结合产品内容、运营活动各种手段吸引用户,提升产品的活跃度。
提高留存率(Retention)
留住一个老用户的成本远低于获取一个新用户,而真正为产品带来营收利润的通常是老用户,因此需要提高留存率。
常用手段
针对老用户推出各种优惠和活动;
建立会员等级体系,注册时间越长等级越高;
对于一段时间没有访问的疑似流失用户进行消息短信推送以实现用户挽回等。
获取收入(Revenue)
用户付费
广告收入
自传播(Refer)
让用户利用利用自己的社交网络进行产品推广就是自传播,几乎所有的互联网产品都有“分享到”这样一个功能按钮,促进用户社交传播。
利用大数据增长用户数量
利用用户画像进行精准广告获客;
通过用户分析挽回用户;
A/B测试决定产品功能;
大数据反欺诈、反羊毛;
用户生命周期管理;
一个互联网产品的用户会经历获取、提升、成熟、衰退、离网几个阶段;
互联网进入下半场,以前那种产品 OK、团队给力,就可以野蛮、快速增长的时代已经过去了。现在用户增长的各个环节都需要进行精细化运营,才能在竞争中获得优势,而精细化运营则必须依赖海量的用户、商品、行为数据才能完成,这都是大数据技术的用武之地。
大数据算法
如何对数据进行分类和预测
分类是人们认识事物的重要手段,如果你能将某个事物分类得足够细,你实际上就已经认识了这个事物;
KNN分类算法
数据的距离
欧氏距离
余弦夹角距离
文本的特征值
关键词
TF-IDF
文章的特征向量
贝叶斯分类
如何发掘数据之间的联系
挖掘数据的典型应用场景
搜索排序
PageRank的算法
关联分析
购物篮分析
频繁模式
支持度
置信度
Apriori算法
第 1 步:设置最小支持度阈值。
第 2 步:寻找满足最小支持度的单件商品,也就是单件商品出现在所有订单中的概率不低于最小支持度。
第 3 步:从第 2 步找到的所有满足最小支持度的单件商品中,进行两两组合,寻找满足最小支持度的两件商品组合,也就是两件商品出现在同一个订单中概率不低于最小支持度。
第 4 步:从第 3 步找到的所有满足最小支持度的两件商品,以及第 2 步找到的满足最小支持度的单件商品进行组合,寻找满足最小支持度的三件商品组合。
第 5 步:以此类推,找到所有满足最小支持度的商品组合。
聚类
如何预测用户的喜好
常用的推荐算法
基于人口统计的推荐
基于商品属性的推荐
基于用户的协同过滤推荐
通过关系得出用户相似性,然后推荐相似用户已购产品
基于商品的协同过滤推荐
通过关系得出商品相似性,然后进行推荐
机器学习的数学原理是什么
机器学习系统三大关键要素
样本
模型
算法
各种有样本的机器学习算法基本上都是在各种模型的假设空间上求解结构风险最小值的过程
从感知机到神经网络算法
感知机
1. 选择初始值 w0,b0w0,b0。
2. 在样本集合中选择样本数据 xi,yixi,yi。
3. 如果 yi(w⋅xi+b)<0yi(w⋅xi+b)<0,表示 yiyi 为误分类点,那么 w=w+ηyixiw=w+ηyixi、b=b+ηyib=b+ηyi,在梯度方向校正 ww 和 bb。其中 ηη 为步长,步长选择要适当,步长太长会导致每次计算调整太大出现震荡;步长太短又会导致收敛速度慢、计算时间长。
4. 跳转回 2,直到样本集合中没有误分类点, 即全部样本数据 yi(w⋅xi+b)≥0yi(w⋅xi+b)≥0。
神经网络
人脑神经元可以通过感知机进行模拟,每个感知机相当于一个神经元,使用 signsignsign 函数的感知机输出也是只有两个值,跟人脑神经元一样。
将感知机组成一层或者多层网络状结构,就构成了机器学习神经网络。下图就是一个两层神经网络。