1. Spark简介
- 2009年,Spark诞生于伯克利大学的AMPLab实验室。最出Spark只是一个实验性的项目,代码量非常少,属于轻量级的框架。
- 2010年,伯克利大学正式开源了Spark项目。
- 2013年6月,Spark成为了Apache基金会下的项目,进入高速发展期。第三方开发者贡献了大量的代码,活跃度非常高
- 2014年2月,Spark以飞快的速度称为了Apache的顶级项目,同时大数据公司Cloudera宣称加大Spark框架的投入来取代MapReduce
- 2014年4月,大数据公司MapR投入Spark阵营, Apache Mahout放弃MapReduce,将使用Spark作为计算引擎。
- 2014年5月,Spark 1.0.0 发布。
- 2015年~,Spark在国内IT行业变得愈发火爆,越来越多的公司开始重点部署或者使用Spark来替代MR2、Hive、Storm等传统的大数据并行计算框架
2. Spark是什么?
- Apache Spark™ is a unified analytics engine for large-scale data processing.
- 大规模数据集的统一分析引擎
- Spark是一个基于内存的通用并行计算框架,目的是让数据分析更加快速
-
Spark包含了大数据领域常见的各种计算框架
- spark core(离线计算)
- sparksql(交互式查询)
- spark streaming(实时计算)
- Spark MLlib (机器学习)
- Spark GraphX (图计算)
3. Spark能代替hadoop吗?
不完全对
因为我们只能使用spark core代替mr做离线计算,数据的存储还是要依赖hdfs
Spark+Hadoop的组合,才是未来大数据领域最热门的组合,也是最有前景的组合!
4. Spark的特点
-
速度
- 内存计算在速度上要比mr快100倍以上
- 磁盘计算在速度上要比mr快10倍以上
-
容易使用
- 提供了java scala python R语言的api接口
-
一站式解决方案
- spark core(离线计算)
- spark sql(交互式查询)
- spark streaming(实时计算)
- .....
-
可以运行在任意的平台
- yarn
- Mesos
- standalone
5. Spark的缺点
- JVM的内存overhead太大,1G的数据通常需要消耗5G的内存 (Project Tungsten 正试图解决这个问题 )
- 不同的spark app之间缺乏有效的共享内存机制(Project Tachyon 在试图引入分布式的内存管理,这样不同的spark app可以共享缓存的数据)
6. Spark vs MR
6.1 mr的局限性
- 抽象层次低,需要手工编写代码来完成,使用上难以上手
- 只提供两个操作,Map和Reduce,表达力欠缺
- 一个Job只有Map和Reduce两个阶段(Phase), 复杂的计算需要大量的Job完成,Job之间的依赖关系是由开发者自己管理的
- 中间结果 (reduce的输出结果) 也放在HDFS文件系统中
- 延迟高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够
- 对于迭代式数据处理性能比较差
6.2 Spark解决了mr中的那些问题?
-
抽象层次低,需要手工编写代码来完成,使用上难以上手
- 通过spark中的RDD(Resilient distributed datasets)来进行抽象
-
只提供两个操作,Map和Reduce,表达力欠缺
- 在spark中提供了多种算子
-
一个Job只有Map和Reduce两个阶段
- 在spark中可以有多个阶段(stage)
-
中间结果也放在HDFS文件系统中(速度慢)
- 中间结果放在内存中,内存放不下了会写入本地磁盘,而不是HDFS
-
延迟高,只适用Batch数据处理,对于交互式数据处理,实时数据处理的支持不够
- sparksql和sparkstreaming解决了上面问题
-
对于迭代式数据处理性能比较差
- 通过在内存中缓存数据,提高迭代式计算的性能
==因此,Hadoop MapReduce会被新一代的大数据处理平台替代是技术发展的趋势,而在新一代的大数据处理平台中,Spark目前得到了最广泛的认可和支持==
7. Spark的版本
- spark1.6.3 : scala的版本2.10.5
- spark2.2.0 : scala的版本2.11.8(新项目建议使用spark2.x的版本)
- hadoop2.7.5
8. Spark单机版的安装
-
准备安装包spark-2.2.0-bin-hadoop2.7.tgz
tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz -C /opt/ mv spark-2.2.0-bin-hadoop2.7/ spark
-
修改spark-env.sh
export JAVA_HOME=/opt/jdk export SPARK_MASTER_IP=uplooking01 export SPARK_MASTER_PORT=7077 export SPARK_WORKER_CORES=4 export SPARK_WORKER_INSTANCES=1 export SPARK_WORKER_MEMORY=2g export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
-
配置环境变量
#配置Spark的环境变量 export SPARK_HOME=/opt/spark export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
-
启动单机版spark
start-all-spark.sh
-
查看启动
http://uplooking01:8080
9. Spark分布式集群的安装
-
配置spark-env.sh
[root@uplooking01 /opt/spark/conf] export JAVA_HOME=/opt/jdk #配置master的主机 export SPARK_MASTER_IP=uplooking01 #配置master主机通信的端口 export SPARK_MASTER_PORT=7077 #配置spark在每个worker中使用的cpu核数 export SPARK_WORKER_CORES=4 #配置每个主机有一个worker export SPARK_WORKER_INSTANCES=1 #worker的使用内存是2gb export SPARK_WORKER_MEMORY=2g #hadoop的配置文件中的目录 export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop
-
配置slaves
[root@uplooking01 /opt/spark/conf] uplooking03 uplooking04 uplooking05
-
分发spark
[root@uplooking01 /opt/spark/conf] scp -r /opt/spark uplooking02:/opt/ scp -r /opt/spark uplooking03:/opt/ scp -r /opt/spark uplooking04:/opt/ scp -r /opt/spark uplooking05:/opt/
-
分发uplooking01上配置的环境变量
[root@uplooking01 /] scp -r /etc/profile uplooking02:/etc/ scp -r /etc/profile uplooking03:/etc/ scp -r /etc/profile uplooking04:/etc/ scp -r /etc/profile uplooking05:/etc/
-
启动spark
[root@uplooking01 /] start-all-spark.sh
10. Spark高可用集群
先停止正在运行的spark集群
-
修改spark-env.sh
#注释以下这两行内容 #export SPARK_MASTER_IP=uplooking01 #export SPARK_MASTER_PORT=7077
-
添加内容
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=uplooking03:2181,uplooking04:2181,uplooking05:2181 -Dspark.deploy.zookeeper.dir=/spark"
-
分发修改的[配置
scp /opt/spark/conf/spark-env.sh uplooking02:/opt/spark/conf scp /opt/spark/conf/spark-env.sh uplooking03:/opt/spark/conf scp /opt/spark/conf/spark-env.sh uplooking04:/opt/spark/conf scp /opt/spark/conf/spark-env.sh uplooking05:/opt/spark/conf
-
启动集群
[root@uplooking01 /] start-all-spark.sh
[root@uplooking02 /] start-master.sh
11. 第一个Spark-Shell程序
spark-shell --master spark://uplooking01:7077
#spark-shell可以在启动时指定spark-shell这个application使用的资源(总核数,每个work上使用的内存)
spark-shell --master spark://uplooking01:7077 --total-executor-cores 6 --executor-memory 1g
#如果不指定 默认使用每个worker上全部的核数,和每个worker上的1g内存
sc.textFile("hdfs://ns1/sparktest/").flatMap(_.split(",")).map((_,1)).reduceByKey(_+_).collect
12. Spark中的角色
-
Master
- 负责接收提交的作业的请求
- master负责调度资源(在woker中启动CoarseGrainedExecutorBackend)
-
Worker
- worker中的executor负责执行task
-
Spark-Submitter ===> Driver
- 提交spark应用程序给master
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。