Spark笔记

spark 是使用scala语言实现的


spark生态圈也称作BDAS(伯克利数分析栈),是伯克利APM实验室开发的,力图在算法、机器、人之间通过大规模集成来展现大数据应用的一个平台。伯克利AMPLab运用大数据、云计算、通信等各种资源以及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为有用的信息,以供人们更好的理解世界。该生态圈已经涉及到机器学习、数据挖掘、数据库、信息检索、自然语言处理和语音识别等多个领域。


spark生态圈是以Spark core为核心,从HDFS、Amazon s3和Hbase等持久层读取数据,以MESS、YARN和自身携带的Standalone为资源管理器调度Job完成Spark应用程序的计算。 这些应用程序可以来自于不同的组件,如Spark Shell/Spark Submit的批处理、Spark Streaming的实时处理应用、Spark SQL的即席查询、BlinkDB的权衡查询、MLlib/MLbase的机器学习、GraphX的图处理和SparkR的数学计算等等。


spark 运行基本流程:
1、构建spark application 的运行环境(启动sparkContext),SparkContext向资源管理器注册并申请Executor资源;
2、资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;
3、SparkContext构建成DAG图,将DAG图(有向无环图)分解成Stage,并把Taskset发送给Task Scheduler(任务调度器);Executor向SparkCOntext申请Task,Task Scheduler将Task发放给Executor运行,同时SparkContext将应用程序代码发放给Executor。
4、Task在Executor上运行,运行完毕释放所有资源。

spark运行架构特点:
1、每个application获取专属的executor进程,该进程在application期间一直驻留,并以多线程形式运行tasks。这种application隔离机制有其优势,无论是从调度角度看(每个driver调度它自己的任务),还是从运行角度看(来自不同的application的task运行在不同的JVM中),当然,这也意味着spark application不能跨应用共享数据,除非将数据写入外部存储系统中。
2、Spark与资源管理无关,只要能够获取executor进程,并能够保持相互通信就行
3、提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好是在同一个Rack里,因为Spark  Application 运行过程中 SparkContext 和 Executor 之间有大量的信息交换; 如果想在远程集群中运行, 最好使用 RPC 将 SparkContext 提交给集群, 不要远离Worker运行SparkContext。
4、Task采用了数据本地性和推测执行的优化机制。

sparkSQL 运行框架:
类似于关系型数据库,SparkSQL的语句也是由projection(a1)、data source(table)、Filter(condition)组成(select a1 from table where condition)
执行SparkSQL语句的顺序为:
1、对读入的SQL语句进行解析,分辨出SQL语句中哪些是关键字(select、from、where),哪些是表达式、哪些是Projection、哪些是data source,从而判断SQL语句是否规范
2、将SQL语句和数据库的数据字典(列、表、视图等)进行绑定,如果相关的projection、Data source等都存在的话,就表示这个SQL语句可以执行
3、一般的数据库都会提供几个执行计划,这些计划都有运行统计数据,数据库会选在这些计划中一个最有计划(Optimize)
4、计划执行(Execute),按照Operation->Data source->Result的次序来进行的,在执行过程有时候甚至不需要读取物理表就可以返回结果,比如重新运行刚运行过的SQL语句,可能直接从数据库的缓冲池中获取返回结果

SparkSQL对SQL语句的处理和关系型数据库对SQL语句的处理采用了类似的方法,首先会将SQL语句进行解析(parse),然后形成一个Tree,在后续的如绑定、优化等处理都是对Tree的操作,操作的方法采用Rule,通过模式匹配,对不同类型的节点采用不同的操作;在整个sql语句的处理过程中,Tree和Rule相互配合,完成了解析、绑定、优化、物理计划等过程,最终生成可执行的物理计划。

SparkSQL有两个分支,sqlContext 和 hiveContext , sqlContext 现在只支持SQL语法解析器; hiveContext 现在支持SQL语法解析器和 hiveSQL 语法解析器,默认为 hiveSQL 语法解析器, 用户可以通过配置切换成SQL语法解析器,来运行 hiveSQL 不支持的语法。

SparkSQL1.1总体上由四个模块组成:core、catalyst、hive、hive-Thriftserver
1、core处理数据的输入输出,从不同的数据源获取数据(RDD、Parquet、json等),将查询结果输出成schemaRDD;
2、catalyst处理查询语句的整体处理过程,包括解析、绑定、优化、物理计划等,说其是优化器,还不如说是查询引擎
3、hive对hive数据的处理
4、hive-ThriftServer提供CLI和JDBC/ODBC接口
其中catalyst是最核心的部分

catalyst主要实现的组建有:
1、sqlParse,完成sql语句的语法解析功能,目前值提供了一个简单的sql解析器
2、Analyzer,主要完成绑定工作,将不同来源的Unresolved logicalPlan和数据元数据进行绑定,生成resolved LogicalPlan;
3、optimizer对resolved logicalPlan进行优化,生成optimized logicalPlan
4、Planner将logicalPlan 转换成PhysicalPlan
5、CostModel,主要根据过去的性能统计数据,选择最佳的物理执行计划

SparkSQL CLI:
CLI(Command-Line Interface 命令行界面)是指可在用户提示符下键入可执行指令的界面,他通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后予以执行;Spark CLI指的是使用命令界面直接输入SQL命令,然后发送到Spark集群进行执行,在界面中显示运行过程和最终的结果


SparkSQL调优:
Spark是一个快速的内存计算框架,同时是一个并行运算的框架,在计算性能调优的时候,除了要考虑广为人知的木桶原理外,还要考虑平行运算的Amdahl定理

Amdahl定理:他代表了处理器平行运算之后效率提升的能力,并行计算中的加速比是用并行前的执行速度和并行后的执行速度之比来表示的,他表示了在并行化之后的效率提升情况,阿姆达尔定律是固定负载时的量化标准,
1、并行性
SparkSQL的查询并行度主要和集群的core数量相关,合理配置每个节点的core可以提高集群的并行度,提高查询的效率
2、高效的数据格式
高效的数据格式,一方面是加快了数据的读入速度,另一方面可以减少内存的消耗。高效的数据格式包括多个方面:
(1)数据本地性
分布式计算系统的精粹在于移动计算而非移动数据,但是在实际的计算过程中,总存在着移动数据的情况,除非是在集群的所有节点上都保存数据的副本。移动数据,将数据从一个节点移动到另一个节点进行计算, 不但消耗了网络IO,也消耗了磁盘IO,降低了整个计算的效率。为了提高数据的本地性,除了优化算法(也就是修改spark内存,难度有点高),就是合理设置数据的副本。设置数据的副本,这需要通过配置参数并长期观察运行状态才能获取的一个经验值。

(2)合适的数据类型
对于一个tinyint可以使用的数据列,不需要为了方便定义成int类型,一个tinyint的数据占用了1个byte,而int占用了4个byte,所以在SparkSQL里,定义合适的数据类型可以节省有限的内存资源
(3)合适的数据列
在查询数据时,要尽量写出要查询的列名,这样不但可以减少磁盘IO,也减少缓存时消耗的内存
(4)优的数据存储格式
在查询的时候,最终还是要读取存储在文件系统中的文件,采用更优的数据存储格式,将有利于数据的读取速度。
3、内存的使用
对频繁使用的表或者查询才进行缓存,对于只使用一次的表不需要缓存
对join操作,有限缓存较小的表
4、合适的Task
对于SparkSQL,还有一个比较重要的参数,就是shuffle时候的Task数量,通过spark.sql.shuffle.partitions来调节,调节的基础是spark集群的处理能力和要处理的数据量,spark的默认值是200,Task过多,会产生很多的任务启动开销,Task过少,每个Task的处理时间过长,容易straggle

其他建议:
1、要想获取更好的表达式查询速度,可以将spark.sql.codegen设置为True
2、对于大数据集的计算结果,不要使用collect(),collect()把结果返回给driver,很容易撑爆driver的内存;一般直接输出到分布式文件系统中
3、对于worker倾斜,设置spark.speculation=true将持续不给力的节点去掉
4、对于数据倾斜,采用加入不分中间步骤,如聚合后cache
5、适当的使用序化方案以及压缩方案
6、善于利用集群监控系统,将集群的运行状况维持在一个合理的、平稳的状态
7、善于解决重点矛盾,多观察Stage中的Task,查看最耗时的Task,查找原因并改善


启动spark shell
1、环境配置
打开/etc/profile文件
设置如下参数:
export SPARK_HOME=、app/hadoop/spark-1.1.0
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
 
export HIVE_HOME=/app/hadoop/hive-0.13.1
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:$HIVE_HOME/bin
2、启动HDFS
$cd /app/hadoop/hadoop-2.2.0/sbin
$./start-dfs.sh
3、启动Spark集群
$cd /app/hadoop/spark-1.1.0/sbin
$./start-all.sh
4、启动Spark-shell
$cd /app/hadoop/spark-1.1.0/bin
$./spark-shell --master spark://hadoop1:7077 --executor-memory 1g


Spark Streaming是Spark的核心API的一个扩展,可以实现高吞吐量的、具备容错机智的实时流数据的处理,可以对多种数据源(如 kafka ,Flume, Twitter, Zero 和 TCP 套接字)进行类似 Map、 Reduce 和 join 等复杂操作, 并将结果保存到外部文件系统、 数据库或者应用到实时仪表盘。
Spark streaming的内部处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过spark Engine处理这些批数据,最终得到处理的一批批结果数据。

Storm 和 Spark Streaming 比较
1、处理模型以及延迟
虽然两框架都提供了可扩展性和可容错性,但是它们的处理模型从根本上说是不一样的,Storm可以实现亚秒级时延的处理,而每次只处理一条event,而Spark Streaming可以在一个短暂的时间窗口里面处理多条Event,所以Storm可以实现亚秒级时延的处理,而Spark streaming则有一定的时延。
2、容错和数据保证
Spark streaming的容错为有状态的计算提供了更好的支持,Storm 每条记录在系统的移动过程中都需要被标记跟踪,所以Storm只能保证每条记录最少被处理一次,但是允许从错误状态恢复时被处理多次,这就意味着可变更的状态可能被更新两次从而导致结果不正确;而spark streaming仅仅需要在批处理级别对记录进行追踪,所以他能保证每一个批处理记录仅仅被处理一次,
3、实现和编程API
Storm主要是由Clojure语言实现,Spark streaming是由Scala实现;Storm提供了java API 同时也支持其他语言的API,Spark Streaming 支持Scala和java语言(其实也支持Python)
4、批处理框架集成
Spark Streaming的一个很棒的特性就是它是在Spark框架上运行的。这样你就可以像使用其他批处理代码一样来写Spark Streaming程序,或者是在Spark中交互查询。这就减少了单独编写流批量处理程序和历史数据处理程序。


运行原理
Streaming架构:
1、计算流程:Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark Core,也就是把Spark streaming的输入数据按照 batch size 分成一段一段的数据, 每一段数据都转换成 Spark 中的 RDD,然后将 Spark Streaming 中对DStream(离散流discretized stream)的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。
2、容错性:对于流式计算来说,容错性至关重要,每一个RDD都有一个不可变的分布式可重算的数据集,其记录着确定性的操作继承关系,所以只要输入数据是可容错的,那么任意一个RDD的分区出错或者不可用,都是可以利用原始输入数据通过转换操作而重新计算。
3、实时性:spark streaming将流式计算分解成多个spark job,对于每一段数据的处理都会经过spark DAG图分解以及spark的任务集的调度过程,对于目前版本而言,最小的batch size 的选取在0.5~2秒之间,所以spark streaming能够满足除对实时性要求非常高之外的所有流式准实时计算场景
4、扩展性与吞吐量:Spark目前在EC2上已能够线性扩展到100个节点(每个节点4Core),可以以数秒的延迟处理6GB/s的数据量(60M records/s),其吞吐量也比流行的Storm高2~5倍。

编程模型:DStream作为spark streaming的基础抽象,它代表持续性的数据流


spark streaming使用
1、创建StreamingContext对象,和spark初始化需创建sparkContext对象一样,使用spark Streaming就需要创建StreamingContext对象,创建StreamingContext对象所需的参数与SparkContext基本一致,需要注意的是参数 Seconds,spark streaming需要指定处理数据的时间间隔
2、创建InputDStream,Spark streaming需要指明数据源,它支持多种不同的数据源,包括kafka、Flume、HDFS/S3、Kinesis和Twitter等数据源
3、操作DStream,对于从数据源得到的DStream,用户可以在其基础上进行各种操作
4、启动Spark Streaming,之前所做的所有步骤只是创建执行流程,程序没有真正连接上数据源,也没有对数据进行任何操作,只是设定好了所有的执行计划,当ssc.start()启动后程序才真正进行所有预期的操作

DStream的输入源
1、基础来源:在StreamingContext API中直接可用的来源,如文件系统,Socket套接字
2、高级来源:如Kafka、Flume等
DStream的操作:可分为三类:普通的转换操作、窗口转换操作和输出操作


机器学习及SparkMLlib
机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能。

机器学习的分类:
1、监督学习:是从给定的训练数据集中学习一个函数(模型),当新的数据到来时,可以根据这个函数(模型)预测结果;监督学习的训练集要求包括输入和输出,也可以说是特征和目标
2、非监督学习:无监督学习的训练集没有人为标注的结果,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构;目标是我们不告诉计算机怎么做,而是让计算机自己去学习怎么做一些事情。
3、半监督学习:是介于监督学习和非监督学习之间的一种机器学习方式,它主要考虑如何利用少量的标注样本和大量的未标注样本进行训练和分类的问题;
主要算法有五类:基于概率的算法;在现有监督算法基础上进行修改的方法;直接依赖于聚类假设的方法等
4、强化学习:通过观察来学习动作的完成,每个动作都会对环境有所影响,学习对象根据观察到的周围环境的反馈来做出判断;输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈大哦模型,模型必须对此立刻作出调整。


机器学习的常用算法
1、构造条件概率:回归分析和统计分类
2、人工神经网络
3、决策树
4、高斯过程回归
5、线性判别分析
6、最近邻居法
7、感知器
8、径向基函数核
9、支持向量机
10、通过再生模型构造概率密度函数
11、最大期望算法
12、graphical model:包括贝叶斯网和markov随机场
13、GeneratIve Topographic Mapping
14、近似推断技术
15、马尔科夫链蒙特卡罗方法
16、变分法
17、最优化:以上大多数方法,直接或者间接使用最优化算法



回归算法:是试图采用对误差的衡量来探索变量之间的关系的一类算法;常见的回归算法有:最小二乘法(ordinary least square),逻辑回归(logistic regression),逐步式回归(stepwise regression),多元自适应回归样条(Multivarate adaptive regression splines)以及本地散点平滑估计(locally estimated scatterplot smoothing)

基于实例的算法:基于实例的算法常常用来对决策问题建立模型,这样的模型常常先取一批样本数据,然后根据某些近似性把新数据和样本数据进行比较,通过这样的方式寻找最佳的匹配;常见的算法包括:k-nearest Neighbor(KNN),学习矢量量化以及自组织映射算法


正则化方法:是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整,正则化方法通常对简单模型予以奖励而对复杂算法予以惩罚。


决策树学习:是根据数据的属性采用树状结构建立决策模型,决策树模型常常用来解决分类和回归问题。常见的算法包括:分类及回归树、ID3、Decision stump 、random forest、多元自适应回归样条(MARS)以及梯度推进机(Gradient Boosting Machine,GBM)


贝叶斯学习:贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题;常见算法包括:朴素贝叶斯算法、平均单依赖估计(Averaged One-Dependence Estimators, AODE)以及 Bayesian Belief Network(BBN)

基于核的算法:最著名的是支持向量机(SVM);基于核的算法把输入数据映射到一个高阶的向量空间,在这些高阶向量空间里,有些分类或者回归问题能够更容易解决;常见的包括:支持向量机、径向基函数以及线性判别分析等


聚类算法:通常按照中心点或者分层的方式对输入数据进行归并;常见的有:k-Means算法以及期望最大化算法。


关联规则学习:通过寻找最能够解释数据变量之间,来找出大量多元数据集中有用的关联规则。常见算法包括 Apriori 算法和 Eclat 算法等。


人工神经网络算法:是模拟生物神经网络,一类模式匹配算法,通常用于解决分类和回归问题;包括:感知器神经网络(Perceptron Neural Network)、反向传递(back Propagation)、Hopfield网络、自组织映射(self-organizing map,SOM)、学习矢量量化(learning vector quantization,LVQ)


深度学习算法:常见的深度学习算法有:受限玻尔兹曼机(Restricted Boltzmann Machine,RBN)、Deep Belief NetWorks(DBN)、卷积网络(Convolutional NetWork)、堆栈式自动编码器(Stacked Auto-encoders)


降低维度算法:降低维度算法试图分析数据的内在结构,它是非监督学习的方式,试图利用较少的信息来归纳或者解释数据;常用算法包括:主成份分析、偏最小二乘回归、Sammon映射、多维尺度、投影追踪等。


集成算法:用一些相对较弱的学习模型独立的对同样的样本进行训练,然后把结果整合起来进行整体预测;常见的算法包括:Boosting、Bootstrapped Aggregation(Bagging)、AdaBoost、堆叠泛化(Stacked Generalization, Blending)、梯度推进机(Gradient Boosting Machine, GBM)、随机森林(Random Forest)。




Spark MLLib 是 Spark 对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器;MLlib目前支持四中常见的机器学习问题:分类、回归、聚类和协同过滤;


MLlib 是MLBase的一部分;其中MLBase分为四部分:MLlib、MLI、ML Optimizer和MLRuntime
ML Optimizer会选择它认为最适合的已经在内部实现的机器学习算法和相关参数,来处理用户输入的数据,并返回模型或者别的帮助分析的结果;
MLI 是一个进行特征抽取和高级 ML 编程抽象的算法实现的 API或者平台
MLlib是Spark实现一些常见机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维以及底层优化,该算法可以进行可扩充
MLRuntime 基于Spark计算框架,将Spark的分布式计算应用到机器学习领域

Spark MLlib架构解析:从架构图看MLlib主要包含三个部分
1、底层基础:包括spark的运行库、矩阵库和向量库
2、算法库:包含广义线性模型、推荐系统、聚类、决策树和评估的算法
3、实用程序:包括测试数据的生成、外部数据的读入等功能

MLlib的底层基础解析:主要包括向量接口和矩阵接口;它支持本地的密集向量和稀疏向量,并支持标量向量;同时支持本地矩阵和分布式矩阵

MLlib算法库分析:
常用的有:
1、分类算法:属于监督学习,使用类标签已知的样本建立一个分类函数或者分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类;目前MLlib支持的分类算法有:逻辑回归、支持向量机、朴素贝叶斯 和 决策树;
2、回归算法:属于监督学习,每个个体都有一个与之相关联的实数标签,并且我们希望在给出用于表示这些实体的数值特征后,所预测出的标签值可以尽可能接近实际值;MLlib目前支持的回归算法有: 线性回归、 岭回归、 Lasso、决策树;
3、聚类算法:属于非监督学习,通常被用于探索性的分析,是根据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并对每个这样的簇进行描述的过程,它的目的是使得属于同一簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似;MLlib目前支持广泛使用的K-Means聚类算法;
4、协同过滤:常被用于推荐系统,这些技术旨在补充用户-商品关联矩阵中所缺失的部分;MLlib当前支持基于模型的协同过滤,其中用户和商品通过一小组隐语义因子进行表达,并且这些因子也用于预测缺失的元素

GraphX介绍:
Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口;
图的分布式或者并行处理其实是把图拆分成很多的子图,然后分别对这些子图进行计算,计算的时候可以分别迭代进行分阶段的计算,即对图进行并行计算。

GraphX的核心抽象是一种点和边都带属性的有向多重图。

图的分布式存储用点分隔模式,而且使用PartitionBy方法,由用户指定不同的划分策略。划分策略会将边分配到各个EdgePartition,顶点Master分配到各个VertexPartition,EdgePartition也会缓存本地边关联点的Ghost副本。

存储模式:
1、图存储模式:巨型图的存储中提上有边分隔和点分隔两种存储方式;
边分隔(Edge-cut):每个顶点都存储一次,但有的边会被打断到两台机器上;这样好处是节省存储空间,坏处是对图进行基于边的计算时,对于一条两个顶点被分到不同机器上的边来说,要跨机器通信传输数据,内网通信流量大。
点分隔(vertex-cut):每条边只存储一次,都只会出现在一台机器上,邻居多的点会被复制到多台机器上,增加了存储开销,同时会引发数据同步问题,好处是可以大幅减少内网通信量。

虽然两种方法互有利弊,但现在是点分割占上风,各种分布式图计算框架都将自己底层的存储形式变成了点分割。主要原因有以下两个。
1.磁盘价格下降,存储空间不再是问题,而内网的通信资源没有突破性进展,集群计算时内网带宽是宝贵的,时间比磁盘更珍贵。这点就类似于常见的空间换时间的策略。
2.在当前的应用场景中,绝大多数网络都是“无尺度网络”,遵循幂律分布,不同点的邻居数量相差非常悬殊。而边分割会使那些多邻居的点所相连的边大多数被分到不同的机器上,这样的数据分布会使得内网带宽更加捉襟见肘,于是边分割存储方式被渐渐抛弃了。
2、GraphX存储模式:
使用的是点分隔(vertex-cut)方式存储图,用三个RDD存储图数据信息
1、VertexTable(id, data):id为vertex id,data为Edge data
2、EdgeTable(pid, src, dst, data):pid 为 partion id,src为原顶点id,dst为目的顶点id
3、RoutingTable(id, pid):id 为 Vertex id,pid 为 Partion id
计算模式
1、图计算模式:
目前基于图的并行计算框架已经有很多,比如来自Google的Pregel、来自Apache开源的图计算框架Giraph/HAMA以及最为著名的GraphLab,其中Pregel、HAMA和Giraph都是非常类似的,都是基于BSP(Bulk Synchronous Parallell)模式。
Bulk Synchronous    Parallell,即整体同步并行, 它将计算分成一系列的超步(superstep)的迭代(iteration)。从纵向上看,它是一个串行模式,而从横向上看, 它是一个并行的模式, 每两个superstep 之间设置一个栅栏(barrier), 即整体同步点,确定所有并行的计算都完成后再启动下一轮superstep

每一个超步(superstep)包含三部分内容:
1、计算compute:每一个processor利用上一个superstep传过来的消息和本地的数据进行本地计算;
2、消息传递:每一个processor计算完毕后,将消息传递给与之关联的其他processors
3、整体同步点:用于整体同步,确定所有的计算和消息传递都进行完毕后,进入下一个superstep。
2、GraphX计算模式:

Tachyon介绍
tachyon 是架构在最底层的分布式文件存储和上层的各种计算框架之间的一种中间件,其主要职责是将那些不需要落地到DFS里的文件落地到分布式内存文件系统中来达到共享内存,从而提高效率;
Tachyon允许文件以内存的速度在集群框架中进行可靠地共享。

Tachyon系统架构:在Spark平台的部署:总的来说,Tachyon有三个主要部件:Master、client与worker,在每一个SPark Worker节点上,都部署了一个Tachyon Worker,Spark Worker通过Tachyon Client 访问 Tachyon 进行数据读写;所有的Tachyon worker 都被tachyon Master 所管理,Tachyon Master通过 Tachyon Worker定时发出的心跳来判断 Worker 是否已经崩溃以及每个 Worker 剩余的内存空间量。

Tachyon Master 的结构其主要功能如下:首先,Tachyon Master是个主管理器,处理从各个Client发出的请求,这一系列的工作由Service Handler来完成。这些请求包括:获取Worker的信息,读取File的Block信息,创建File等等;其次,Tachyon Master是个Name Node,存放着所有文件的信息,每个文件的信息都被封装成一个Inode,每个Inode都记录着属于这个文件的所有Block信息。在Tachyon中,Block是文件系统存储的最小单位,假设每个Block是256MB,如果有一个文件的大小是1GB,那么这个文件会被切为4个Block。每个Block可能存在多个副本,被存储在多个Tachyon Worker中,因此Master里面也必须记录每个Block被存储的Worker地址;第三,Tachyon Master同时管理着所有的Worker,Worker会定时向Master发送心跳通知本次活跃状态以及剩余存储空间。Master是通过Master Worker Info去记录每个Worker的上次心跳时间,已使用的内存空间,以及总存储空间等信息。

Tachyon Worker 主要负责存储管理:首先,Tachyon Worker的Service Handler处理来自Client发来的请求,这些请求包括:读取某个Block的信息,缓存某个Block,锁住某个Block,向本地内存存储要求空间等等。第二,Tachyon Worker的主要部件是Worker Storage,其作用是管理Local Data(本地的内存文件系统)以及 Under File System (Tachyon以下的磁盘文件系统,比如HDFS)。第三,Tachyon Worker 还有个Data Server以便处理其他的Client对其发起的数据读写请求。当由请求达到时,Tachyon会先在本地的内存存储找数据,如果没有找到则会尝试去其他的Tachyon Worker的内存存储中进行查找。如果数据完全不在Tachyon里,则需要通过Under File System的接口去磁盘文件系统(HDFS)中读取。

Tachyon Client 主要功能是向用户抽象一个文件系统接口以屏蔽掉底层实现细节。首先,Tachyon Client会通过Master Client部件跟Tachyon Master交互,比如可以向Tachyon Master查询某个文件的某个Block在哪里。Tachyon Client也会通过Worker Client部件跟Tachyon Worker交互, 比如向某个Tachyon Worker请求存储空间。在Tachyon Client实现中最主要的是Tachyon File这个部件。在Tachyon File下实现了Block Out Stream,其主要用于写本地内存文件;实现了Block In Stream主要负责读内存文件。在Block In Stream内包含了两个不同的实现:Local Block In Stream主要是用来读本地的内存文件,而Remote Block In Stream主要是读非本地的内存文件。请注意,非本地可以是在其它的Tachyon Worker的内存文件里,也可以是在Under File System的文件里



HDFS(Hadoop Distributed File System)是一个分布式文件系统。HDFS具有高容错性(fault-tolerant)特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了POSIX的要求,这样可以实现以流的形式访问(streaming access)文件系统中的数据。


HDFS采用Master/Slave架构。HDFS集群是由一个Namenode和一定数目的Datanode组成的。Namenode是一台中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求,在Namenode的统一调度下对数据块进行创建、删除和复制。


对比HDFS和Tachyon
1、首先从两者的存储结构来看,HDFS设计为用来存储海量文件的分布式系统,Tachyon设计为用来缓存常用数据的分布式内存文件系统。从这点来看,Tachyon可以认为是操作系统层面上的Cache,HDFS可以认为是磁盘。
2、在可靠性方面,HDFS采用副本技术来保证出现系统宕机等意外情况时文件访问的一致性以及可靠性;而Tachyon是依赖于底层文件系统的可靠性来实现自身文件的可靠性的。由于相对于磁盘资源来说,内存是非常宝贵的,所以Tachyon通过在其underfs(一般使用HDFS)上写入CheckPoint日志信息来实现对文件系统的可恢复性。
3、 从文件的读取以及写入方式来看,Tachyon可以更好地利用本地模式来读取文件信息,当文件读取客户端和文件所在的Worker位于一台机器上时,客户端会直接绕过Worker直接读取对应的物理文件,减少了本机的数据交互。而 HDFS 在遇到这样的情况时,会通过本地Socket进行数据交换,这也会有一定的系统资源开销。在写入文件时,HDFS只能写入磁盘,而Tachyon却提供了5种数据写入模式用以满足不同需求。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值