目录
Spark简介
Spark是加州大学伯克利分校AMP实验室开发的大数据处理框架。Spark生态系统也被成为BDAS,力图在算法、机器、人三者之间通过大规模数据集成来展现大数据应用的一个开源平台。Spark在2013年6月进入Apache成为孵化项目,8个月或就成为Apache的顶级项目,围绕Spark推出了Spark SQL、Spark Streaming、MLlib、GraphX、SparkR等组件。(看起来想直接取代Hadoop的地位)。
Spark使用Scala语言实现。具有运行速度快、易用性好(支持多种语言)、通用性强(拥有各种组件)和随处运行(适应Hadoop、Cassandra、Hbase、S3和Tachyon)等特点。
拥有四种运行模式
- local模式
- standalone,使用spark自带的资源调度框架。
- yarn,最流行的方式,使用yarn调度
- mesos,国外用的多。
Spark比MapReduce快的原因
- spark基于内存迭代,MapReduce基于磁盘迭代。
- DAG计算模型在迭代计算上比MR有效率。
- Spark是粗粒度的资源调度,MR是细粒度的资源调度。
DAG在spark中任务调度详解
一般而言DAG会比MR在大多数情况下减少shuffle次数。如果不涉及与其他节点的数据交换,spark可以在内存中一次完成操作,也就是中间不需要落盘,减少的IO操作。
但是,如果计算中涉及到了数据交换,spark也会把shuffer的数据写进磁盘。大部分人认为spark是基于内存的计算,所以快。其实这不是主要原因。涉及到计算必然会加载数据进内存。Hadoop也如此。只不过Spark支持将反复计算的数据给Cache到内存中,减少加载耗时。所以对于需要类似迭代的算法比较在行。当然spark基于磁盘预算也比Hadoop快。因为DAG的关系,spark天生适合做批处理任务。
Spark生态系统:
Spark生态系统以Spark Core为核心,能读取各种类型的文件,利用Standalone、YARN和Mesos等资源调度管理。Spark shell和Spark submit交互式批处理、Spark Streaming实时流处理应用、Spark SQL的即时查询、采样近似查询引擎BlinkDB的权衡查询、MLbase/MLlib的机器学习、GraphX的图处理、SparkR的数学计算等等。
Spark安装部署:
配置伪分布模式:
1、上传spark安装包到虚拟机-Linux
2、解压、配置软连接
[hadoop@master tmp]$ tar -zxvf spark-2.1.2-bin-hadoop2.7.tgz -C /diyhome/
[hadoop@master ~]$ ln -s /diyhome/spark-2.1.2- bin-hadoop2.7/ ~/spark
3、配置环境变量
1、进去看一看spark目录
因为spark的sbin目录下也有start-all.sh脚本,因此尽量不要配sbin进path
2、配置spark的环境变量
[hadoop@master ~]$ vi ~/.bashrc
Path:$SPARK_HOME/bin
export SPARK_HOME=~/spark
[hadoop@master ~]$ source ~/.bashrc
4、修改配置文件
配置路径:$SPARK_HOME/conf
[hadoop@master conf]$ cp spark-env.sh.template spark-env.sh
vi spark-env.sh 添加
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
export JAVA_HOME=~/jdk
export SCALA_HOME=~/scala
export HADOOP_HOME=~/hadoop
export HADOOP_CONF_DIR=~/hadoop/etc/hadoop/
[hadoop@master conf]$ cp slaves.template slaves
添加
master(你自己的主机名)
5、启动spark
命令
$SPARK_HOME/sbin
[hadoop@master sbin]$ ./start-master.sh
[hadoop@master sbin]$ ./start-slaves.sh
6、测试webui
http://192.168.0.199:8080/ Master
http://192.168.0.199:8081/ Worker
[hadoop@master sbin]$ spark-shell --master spark://master:7077
配置Spark-完全分布式 HA
1、上传spark压缩包到Linux操作系统
2、解压、并且配置软连接
[hadoop@master tmp]$ tar -zxvf spark-2.1.2-bin-hadoop2.7.tgz -C /cluster/
[hadoop@master ~]$ ln -s /cluster/spark-2.1.2-bin-hadoop2.7/ ~/spark
3、配置环境变量
[hadoop@master ~]$ vi ~/.bashrc
export SPARK_HOME=~/spark
[hadoop@master ~]$ source ~/.bashrc
4、修改配置文件$SPARK_HOME/conf
[hadoop@master conf]$ cp spark-env.sh.template spark-env.sh
[hadoop@master conf]$ vi spark-env.sh
#!/usr/bin/env bash
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
export JAVA_HOME=~/jdk
export HADOOP_HOME=~/hadoop
export HADOOP_CONF_DIR=~/hadoop/etc/hadoop/
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=500m
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master:2181,slave1:2181,slave2:2181 -Dspark.deploy.zookeeper.dir=/spark"
[hadoop@master conf]$ cp slaves.template slaves
[hadoop@master conf]$ vi slaves
# A Spark Worker will be started on each of the machines listed below.
master
slave1
slave2
5、分发slave1,slave2
[hadoop@master conf]$ scp -r /cluster/spark-2.1.2-bin-hadoop2.7/ slave1:/cluster/
[hadoop@master conf]$ scp -r /cluster/spark-2.1.2-bin-hadoop2.7/ slave2:/cluster/
[hadoop@master conf]$ scp ~/.bashrc slave1:~/
[hadoop@master conf]$ scp ~/.bashrc slave2:~/
[hadoop@slave1 ~]$ ln -s /cluster/spark-2.1.2-bin-hadoop2.7/ ~/spark
[hadoop@slave1 ~]$ source ~/.bashrc
[hadoop@slave2 ~]$ ln -s /cluster/spark-2.1.2-bin-hadoop2.7/ ~/spark
[hadoop@slave2 ~]$ source ~/.bashrc
6、启动spark
启动hadoop集群
[hadoop@master conf]$ start-all.sh
启动spark集群
[hadoop@master sbin]$ ./start-all.sh
[hadoop@slave1 sbin]$ ./start-master.sh
7、测试
http://192.168.0.199:8080/ —主Master
http://192.168.0.200:8080/ —辅助Master
[hadoop@slave1 sbin]$ spark-shell \
> --master spark://master:7077 \
> --executor-memory 500m \
> --total-executor-cores 1
scala> val text=sc.textFile("hdfs://slave2:9000/a.txt")
text: org.apache.spark.rdd.RDD[String] = hdfs://slave2:9000/a.txt MapPartitionsRDD[1] at textFile at <console>:24
scala> val flat=text.flatMap(_.split(" "))
flat: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at flatMap at <console>:26
scala> val mp=flat.map((_,1))
mp: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at map at <console>:28
scala> val rd=mp.reduceByKey(_+_)
rd: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:30
scala> val col=rd.collect
col: Array[(String, Int)] = Array((hello,2), (world,1), (hadoop,1))
scala> col.foreach(println)
(hello,2)
(world,1)
(hadoop,1)
附言:本人也是个新手,如有问题还请大佬们勘误。
天道酬勤,学海无涯。