1.实战解析Spark运行原理 
交互式查询(shell,sql) 
批处理(机器学习,图计算) 
首先,spark是基于内存的分布式高效计算框架,采用一栈式管理机制,同时支持流处理,实时交互式出,批处理三种方式,Spark特别支持迭代式计算,因此,他对机器学习,图计算具有较强的支持,为此他提供了机器学习和图计算接口。 
(1)分布式:Distributed Computation 
分布式多台机器运行 特征: 
整个Spark有个提交程序的客户端,提交给集群,集群中中有很多台机器,作业运行在分布式节点上的,Spark程序提交到集群运行,节点一般处理一部分数据,分布式作并行化, 
 
客户端->集群节点 
图书馆管理员查找图书,馆长Cluster manager,1000个人,分布式计算,每个书架总数多少,分布式用到并行计算
先有集群资源管理服务(Cluster Manager)和运行作业任务的结点(Worker Node),然后就是每个应用的任务控制结点Driver和每个机器节点上有具体任务的执行进程(Executor);Executor有二个优点:一个是多线程来执行具体的任务,而不是像MR那样采用进程模型,减少了任务的启动开稍。二个是Executor上会有一个BlockManager存储模块,类似于KV系统(内存和磁盘共同作为存储设备),当需要迭代多轮时,可以将中间过程的数据先放到这个存储系统上,下次需要时直接读该存储上数据,而不需要读写到hdfs等相关的文件系统里,或者在交互式查询场景下,事先将表Cache到该存储系统上,提高读写IO性能。另外Spark在做Shuffle时,在Groupby,Join等场景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二种模式,Spark还提供了更加丰富全面的运算操作如filter,groupby,join等。 
(2)基于内存 
Spark能有效利用内存 
300万条数据,1,2,3机器分别算100万条数据,数据首先考虑Memory,若只能放50万条,另外50万条磁盘,尽量放内存(速度很快)
(3) 擅长迭代式计算,是Spark的真正精髓 
第一个阶段计算-》第二个阶段计算-》第三个阶段计算 
计算之后可以把结果移到另一台机器——shuffle,从一个节点移到另一个节点。 
Hadoop Map+Reduce两阶段(每次都要读写磁盘) 
Spark可以在第一个阶段后还有很多阶段(迭代式)更加灵活(每次计算结果优先考虑放内存,下个阶段可以读内存中数据) 
Spark调度器DAG Schedule Lineage
为什么还是很多公司使用Java语言开发Spark? 
1. 人才问题 
2. 整合更加容易,J2EE做前端程序的很多 
3. 维护更加容易
Spark SQL只能取代Hive的计算引擎,不能取代Hive的数据存储 
在driver上驱动程序执行,执行在worker上 
处理数据来源:HDFS、HBase、Hive、DB、S3(Amazon S3,全名为亚马逊简易储存服务(Amazon Simple Storage Service),由亚马逊公司,利用他们的亚马逊网络服务系统所提供的网络线上储存服务) 
处理数据输出:HDFS、HBase、Hive、DB、S3,或返回driver(也就是程序本身)
2.RDD解密 
通用的分布式弹性数据集 
RDD是Spark的核心 
RDD代表要处理的数据,处理的时候是分布式的 
(1)一系列分片,在节点中存储,内存中,内存中放不下数据,将一部分数据放在磁盘上,自动在内存和磁盘中切换(弹性之一) 
(2)第900个出错,一共1000个任务,可以从第900个重新计算,无需从头开始进行计算,提高错误恢复速度 
(3)Task1000个计算步骤,第900个进行恢复,失败3-5次,默认4次 
(4)Task失败,整个阶段失败,再次提交Stage,1000000-5个不会提交,只提交失败的5个Task(默认3次) 
弹性之一:自动的进行内存和磁盘数据存储的切换 
弹性之二:基于Lineage的高校容错 
弹性之三:Task如果失败会自动进行特定次数的重试 
弹性之四:Stage如果失败会自动进行特定次数的重试 
缓存时机: 
1.计算任务特别耗时 
2.计算链条很长(计算代价)1000个,第900个恢复 
3.Shuffle之后,进行缓存,失败之后,不需要进行重新Shuffle(从其他地方抽取数据) 
4.CheckPoint把数据整个放入磁盘,CheckPoint之前步骤无需重新计算
RDD是一系列数据分片,数据分片分布在不同机器的不同节点上,按partition进行管理,partition就是一个数据集合 RDD包含函数的计算 
最常用的RDD在Hadoop上 
启动文件系统 
 
启动Spark 
 
 
 
集群唯一的接口:SparkContext ,SparkContext是一切工作都要经过的地方,SparkContext创建RDD
 
 
自动获取,是本地还是集群
spark一切操作皆RDD,每次操作都会产生RDD 
 
data.textFile 
是lazy的,transformation,不运行 
 
data.count 
是action,所以会运行
hdfs分片和spark rdd的分区有什么关系? 
spark读取数据时,RDD相当于HDFS的一个Block,Partion size=Block Size(128M)最后一条记录跨两个Block,128M左右
分区,可以进行hash,Range等等,不同分区策略
 
Reduce后进行shuffle 
 
传入HDFS 
Any shuffle后的数据 
Process _LOCAL 
Cloudera Manager 中Spark不是最新版本的,而且不能手动更新,(开发商提供,不推荐),不推荐使用(懒人) 
Spark+Tachyon+HDFS,将来是黄金组合
原文:http://blog.csdn.net/sundujing/article/details/51330170