分布式计算框架
大数据 = 编程技巧 + 数据结构和算法 + 分析能力 + 数据库技能 + 数学 + 机器学习 + NLP + OS + 密码学 + 并行编程
Hadoop批处理框架
根据MapReduce,于是我们有了Hadoop;根据GFS,于是我们有了HDFS;根据BigTable,于是我们有了HBase。而在这三篇论文里都提及Google的一个lock service—Chubby,哦,于是我们有了Zookeeper。
数据处理流程
HDFS <0,hello you> <10,hello me>
Map <hello,1> <you,1> <hello,1> <me,1>
Shuffle <hello,{1,1}> <you,{1}> <me,{1}>
Reduce <hello,2> <you,1> <me,1>
HDFS <hello,2> <you,1> <me,1>
四大组件
HDFS分布式文件系统
HDFS是一个分布式文件系统 ,支持大规模数据存储。
主从架构(Master/Slava)
节点名 | 用途 | 负责 |
---|---|---|
主节点NameNode | 作为整个集群中的主服务器,存储文件文件被分成block存储在磁盘上为保证数据安全,文件会有多个副本 | 接收用户操作请求 维护文件系统的目录结构 管理文件与block之间关系,block与datanode之间关系 |
从节点DataNode | 作为数据的存储者与维护者,同时与NameNode保持心跳联系。接收用户操作请求维护文件系统的目录结构管理文件与block之间关系,block与datanode之间关系。 | 存储文件 文件被分成block存储在磁盘上 为保证数据安全,文件会有多个副本 |
MapReduce批处理计算
分布式程序运算框架。任务的分解与结果的汇总
优点:大规模批处理计算。
缺点:中间结果写入磁盘,不适合迭代运算。
MapReduce并行框架(离线处理)
两个处理阶段:
Map阶段:键值对数据–>相同键的键值集合
Reduce阶段:相同键的键值集合–>相同键的键值对数据
组成:
JobTracker:主节点
TaskTracker:从节点
YARN资源调度系统
Common底层支撑组件
主要提供基础工具包和 RPC 框架等
HBase
https://www.cnblogs.com/JamesXiao/p/6202372.html
https://www.cnblogs.com/nexiyi/p/hbase_shell.html
https://www.cnblogs.com/steven-note/p/7209398.html
1)特点
分布式面向列的数据库
横向扩展性好
随机读写
容错能力
伸缩性好
稀疏性
2)组成
HMaster服务器群:负责Region的分配及数据库的创建和删除等操作。
HRegioServer服务器群:负责数据的读写服务 。
ZooKeeper:作为HDFS的一部分 ,负责维护服务器集群的状态(某台服务器是否在线,服务器之间数据的同步操作及master的选举等)。
Client访问HBase上的数据并不需要HMaster参与,寻址访问ZooKeeper和HRegionServer,数据读写访问HRegionServer,
HMaster仅仅维护Table和Region的元数据信息,Table的元数据信息保存在ZooKeeper上,负载很低。HRegionServer存取一个子表时,会创建一个HRegion对象,然后对表的每个列簇创建一个Store对象,每个Store都会有一个MemStore和0或多个StoreFile与之对应,每个StoreFile都会对应一个HFile,HFile就是实际的存储文件。因此,一个HRegion有多少列簇就有多少个Store。
Table在行的方向上分割为多个HRegion,每个HRegion分散在不同的RegionServer中 ,但同一个HRegion是不会拆分到多个HRegionServer上的。HRegion按大小分割,每个表一般只有一个HRegion,随着数据不断插入表,HRegion不断增大,当HRegion的某个列簇达到一个阀值(默认256M)时就会分成两个新的HRegion。这个过程由HRegionServer管理,而HRegion的分配由HMaster管理。
每个HRegion由多个Store构成,每个Store由一个MemStore和0或多个的StoreFile组成,每个Store保存一个列簇
MemStore 是放在内存里的,保存修改的数据即keyValues。当MemStore的大小达到一个阀值(默认64MB)时,MemStore会被Flush到文件,即生成一个快照。
MemStore内存中的数据写到文件后就是StoreFile ,StoreFile底层是以HFile的格式保存。
3)模型
Region数据模型
定位数据:行键 ;
行键+时间戳 ;
行键+列族列 ;
Region物理存储模型
Pig
Hive
Spark迭代式计算框架
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。
内存计算引擎,提升计算速度,计算性能远优于Hadoop。
Spark主要功能
实时计算
批处理计算
即席查询
机器学习
图计算
Spark之所以在机器学习方面具有得天独厚的优势,有以下几点原因:
(1)机器学习算法一般都有很多个步骤迭代计算的过程,机器学习的计算需要在多次迭代后获得足够小的误差或者足够收敛才会停止,迭代时如果使用Hadoop的MapReduce计算框架,每次计算都要读/写磁盘以及任务的启动等工作,这回导致非常大的I/O和CPU消耗。而Spark基于内存的计算模型天生就擅长迭代计算,多个步骤计算直接在内存中完成,只有在必要时才会操作磁盘和网络,所以说Spark正是机器学习的理想的平台。
(2)从通信的角度讲,如果使用Hadoop的MapReduce计算框架,JobTracker和TaskTracker之间由于是通过heartbeat的方式来进行的通信和传递数据,会导致非常慢的执行速度,而Spark具有出色而高效的Akka和Netty通信系统,通信效率极高。
https://www.cnblogs.com/liuliliuli2017/p/6809094.html
Spark计算引擎
1)特点
内存计算引擎,对 Hadoop 的补充;拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
实时计算
批处理计算
即席查询
机器学习
图计算
- 运行速度快 => Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍。
- 适用场景广泛 => 大数据分析统计,实时数据处理,图计算及机器学习
- 易用性 => 编写简单,支持80种以上的高级算子,支持多种语言,数据源丰富,可部署在多种集群中
- 容错性高。Spark引进了弹性分布式数据集RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错。
2)运行流程
spark基础运行架构如下所示:
spark结合yarn集群背后的运行流程如下所示:
Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。
- Master作为整个集群的控制器,负责整个集群的正常运行;
- Worker相当于计算节点,接收主节点命令与进行状态汇报;
- Executor负责任务的执行;
- Client作为用户的客户端负责提交应用;
- Driver负责控制一个应用的执行。
Spark集群部署后,需要在主节点和从节点分别启动Master进程和Worker进程,对整个集群进行控制。在一个Spark应用的执行过程中,Driver和Worker是两个重要角色。Driver 程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发,而多个Worker用来管理计算节点和创建Executor并行处理任务。在执行阶段,Driver会将Task和Task所依赖的file和jar序列化后传递给对应的Worker机器,同时Executor对相应数据分区的任务进行处理。
- Excecutor /Task 每个程序自有,不同程序互相隔离,task多线程并行
- 集群对Spark透明,Spark只要能获取相关节点和进程
- Driver 与Executor保持通信,协作处理
三种集群模式:
1.Standalone 独立集群
2.Mesos, apache mesos
3.Yarn, hadoop yarn
基本概念:
- Application =>Spark的应用程序,包含一个Driver program和若干Executor
- SparkContext => Spark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor
- Driver Program => 运行Application的main()函数并且创建SparkContext
- Executor => 是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executor来处理任务
- Cluster Manager =>在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn)
- Worker Node => 集群中任何可以运行Application代码的节点,运行一个或多个Executor进程
- Task => 运行在Executor上的工作单元
- Job => SparkContext提交的具体Action操作,常和Action对应
- Stage => 每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet
- RDD => 是Resilient distributed datasets的简称,中文为弹性分布式数据集;是Spark最核心的模块和类
- DAGScheduler => 根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
- TaskScheduler => 将Taskset提交给Worker node集群运行并返回结果
- Transformations => 是Spark API的一种类型,Transformation返回值还是一个RDD,所有的Transformation采用的都是懒策略,如果只是将Transformation提交是不会执行计算的
- Action => 是Spark API的一种类型,Action返回值不是一个RDD,而是一个scala集合;计算只有在Action被提交的时候计算才被触发。
3)核心
一:RDD
二:Transformations / Actions
三:Jobs / Stage
四:Shuffle
五:Cache
4)用途
广告、报表、推荐系统
- 复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
- 基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间
- 基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间
5)Spark算子
操作类型 函数名 作用
map() 参数是函数,函数应用于RDD每一个元素,返回值是新的RDD
flatMap() 应用于RDD每一个元素,将元素数据进行拆分,变成迭代器,返回值是新的RDD
filter() 参数是函数,函数会过滤掉不符合条件的元素,返回值是新的RDD
转化操作 distinct() 没有参数,将RDD里的元素进行去重操作
transformation union() 参数是RDD,生成包含两个RDD所有元素的新RDD
intersection() 参数是RDD,求出两个RDD的共同元素
subtract() 参数是RDD,将原RDD里和参数RDD里相同的元素去掉
cartesian() 参数是RDD,求两个RDD的笛卡儿积
collect() 返回RDD所有元素
count() RDD里元素个数
countByValue() 各元素在RDD中出现次数
行动操作 reduce() 并行整合所有RDD数据,例如求和操作
action fold(0)(func) 和reduce功能一样,不过fold带有初始值
aggregate(0) 和reduce功能一样,但是返回的RDD数据类型和原RDD不一样
foreach(func) 对RDD每个元素都是使用特定函数
Spark Streaming高吞吐量实时处理流式计算框架
1)特点
多数据源输入
高吞吐量
支持更多的算子
自定义处理周期
计算结果可直接写入HDFS
2)运行原理
数据源 架构 输出
kafka
HDFS/S3 HDFS
Flume Spark Streaming Database
Kinesis Dashboards
Twitter
spark程序是使用一个spark应用实例一次性对一批历史数据进行处理,spark streaming是将持续不断输入的数据流转换成多个batch分片,使用一批spark应用实例进行处理。下图为Spark Streaming运行原理。
Spark 算子
操作类型 | 函数名 | 作用 |
---|---|---|
转化操作transformation | map() | 参数是函数,函数应用于RDD每一个元素,返回值是新的RDD |
flatMap() | 参数是函数,函数应用于RDD每一个元素,将元素数据进行拆分,变成迭代器,返回值是新的RDD | |
filter() | 参数是函数,函数会过滤掉不符合条件的元素,返回值是新的RDD | |
distinct() | 没有参数,将RDD里的元素进行去重操作 | |
union() | 参数是RDD,生成包含两个RDD所有元素的新RDD | |
intersection() | 参数是RDD,求出两个RDD的共同元素 | |
subtract() | 参数是RDD,将原RDD里和参数RDD里相同的元素去掉 | |
cartesian() | 参数是RDD,求两个RDD的笛卡儿积 | |
行动操作action | collect() | 返回RDD所有元素 |
count() | RDD里元素个数 | |
countByValue() | 各元素在RDD中出现次数 | |
reduce() | 并行整合所有RDD数据,例如求和操作 | |
fold(0)(func) | 和reduce功能一样,不过fold带有初始值 | |
aggregate(0) | 和reduce功能一样,但是返回的RDD数据类型和原RDD不一样 | |
foreach(func) | 对RDD每个元素都是使用特定函数 |
Spark MLlib机器学习
Data types
Basic statistics (基本统计)
summary statistics 概括统计
correlations 相关性
stratified sampling 分层取样
hypothesis testing 假设检验
random data generation 随机数生成
Classification and regression (分类一般针对离散型数据而言的,回归是针对连续型数据的。本质上是一样的)
linear models (SVMs, logistic regression, linear regression)线性模型(支持向量机,逻辑回归,线性回归)
naive Bayes 贝叶斯算法
decision trees 决策树
ensembles of trees (Random Forests and Gradient-Boosted Trees)
多种树(随机森林和梯度增强树)
Collaborative filtering 协同过滤
alternating least squares (ALS) (交替最小二乘法(ALS) )
Clustering 聚类
k-means k均值算法
Dimensionality reduction (降维)
singular value decomposition (SVD) 奇异值分解
principal component analysis (PCA) 主成分分析
Feature extraction and transformation 特征提取和转化
Optimization (developer) 优化部分
stochastic gradient descent 随机梯度下降
limited-memory BFGS (L-BFGS) 短时记忆的BFGS (拟牛顿法中的一种,解决非线性问题)
SparkSQL
1)语句组成(与关系型数据库sql语句类似)
Projection Data Source Filter
select a1,a2,a3 from table1 where condition
Storm实时处理流式计算框架
Hadoop:吞吐量大、自动容错。但是延迟大,响应缓慢,运维复杂,不擅长实时计算,因为它天然就是为批处理 而生的 。
Storm:实时计算,无数据丢失 。
一:两大组件
Nimbus:负责在集群里面发送代码,分配工作给机器,并且监控状态。全局只有一个。
Supervisor:监听分配给它那台机器的工作,根据需要启动/关闭工作进程Worker。每一个要运行Storm的机器上都要部署一个,并且,按照机器的配置设定上面分配的槽位数。
Zookeeper:Storm重点依赖的外部资源。Nimbus和Supervisor甚至实际运行的Worker都是把心跳保存在Zookeeper上的。Nimbus也是根据Zookeerper上的心跳和任务运行状况,进行调度和任务分配的。
二:原理
Storm提交运行的程序称为Topology。Topology处理的最小的消息单位是一个Tuple,也就是一个任意对象的数组。Topology由Spout和Bolt构成。Spout是发出Tuple的结点。Bolt可以随意订阅某个Spout或者Bolt发出的Tuple。Spout和Bolt都统称为component。下图是一个Topology设计的逻辑图的例子。
下图是Topology的提交流程图。
下图是Storm的数据交互图。可以看出两个模块Nimbus和Supervisor之间没有直接交互。状态都是保存在Zookeeper上。Worker之间通过ZeroMQ传送数据。
三:应用
实时分析,在线机器学习,持续计算、分布式远程调用等领域