1. spark的核心概念,是什么?解决了什么问题?
内存计算框架
官网:Lightning-fast unified analytics engine.------快如闪电的统一分析引擎
a unified analytics engine for large-scale data processing. ---针对大规模数据处理的统一分析引擎
补充:spark是基于hadoop基础之上的改进,不同于mapreduce的是Job中间的输出和结果可以保存在内存中,从而不再需要读写HDFS.
Spark是基于内存计算框架,计算速度非常快,但仅仅涉及计算,不涉及存储。
2. Spark的四大特性
2.1 Speed
面试问题:为什么比hadoop快?
1. 计算基于内存
mapreduce任务后期计算的时候,每一个job的输出结果落地磁盘,后续其他job需要依赖于前面job的 输出结果,这个时候需要进行大量的磁盘io操作,性能降低。
spark任务后期计算的时候,job输出的结果可以保存在内存中,后期其他job依赖前面job输出结果可以 直接从内存中获取,避免了磁盘io操作,性能比较高。
例如hivesql:
select name,age from (select * from user where age > 30) t;
===job1============ =========job2===============
2. 进程和线程
1) mapreduce任务以进程的方式运行在yarn集群中,比如程序有100个mapTask,一个task需要一个进 程,那么就需要100个进程。
2)spark任务以线程的方式运行在进程中,比如程序有100个mapTask,后期一个task对应一个进程, 可以极端一点在一个进程中启动100个线程就可以了。
3)开启进程和线程的时间和调度代价是不一样的,前者远远大于后者。
2.2 Easy of use(易用性)
Java,Scala,Python,R,SQL
2.3 Generality(通用性)
一站式
2.4 Run Everywhere
Spark runs on Hadoop,Apache Mesos,Kubernetes,standalone,or in the cloud
理解:计算框架==》计算程序==》要运行需要计算资源(内存,CPU,磁盘),哪里可以给当前这个任务提供计算资源,就可以把spark程序提交到哪里运行。
* **standalone**
spark自带的集群模式,集群中的老大Master负责
* **yarn**
ResourceManager负责(计算资源)
* **mesos**
apache开源的类似yarn的资源调度平台
3. Spark的整体架构
![8dd5236da9edf2b70030d47a7e0da361.png](evernotecid://EF6E7930-50FF-44A0-BEB3-6B91139D9B51/appyinxiangcom/27146473/ENResource/p2)
4. Spark的集群安装部署
~~~
例如:node01:master,node02:master,worker
node03:worker
~~~
- **在node01节点上下载并安装,及解压的过程略,spark-version :2.3.3**
- **修改配置vi spark-env.sh(/spark里面存储的是元数据)**
export JAVA_HOME=/opt/bigdata/jdk
#配置zk相关
export SPARK_DAEEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181 -Dspark.deploy.zookeeper.dir=/spark"
```
- **vi slaves(mv slaves.template slaves)**
```
#指定spark集群的worker节点
node02
node03
````
- **分发安装目录到其他节点**
``
scp -r /opt/bigdata/spark node02:/opt/bigdata
``
``
scp -r /opt/bigdata/spark node03:/opt/bigdata
``
- **修改spark环境变量vi /etc/profile,并立即生效source /etc/profile,所有节点都要执行**
``
export SPARK_HOME=/opt/bigdata/spark
``
``
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
``
5. Spark的集群启动和停止(依赖Zookeeper,首先要启动zookeeper)
- 在node01上执行$SPARK_HOME/sbin/start-all.sh(在哪一台机器上执行start-all,哪一台机器就是master)
- 可以在node02上执行$SPARK_HOME/sbin/start-master.sh,这样node02也是一个master
- 其他命令sbin/stop-master.sh,sbin/stop-all.sh等顾名思义
6. Spark的集群web管理页面
- node01://8080,可以查看到master及worker的状态以及资源分配情况,当然还有任务执行等信息非常全面,master:alive
- node02://8080,master:standby,如果在node01上执行sbin/stop-master.sh,那么这个node02上的master状态会由standby-->alive,体现高可用(页面不会立即生效,大约需要1-2分钟,这期间是在计算资源及选举新的master的过程,这期间已经提交的任务不受影响,对即将提交的任务由于没有活着的master,会受到影响)
7. 初识spark程序
- **普通模式提交**(指定活着的master地址)
```
$SPARk_HOME/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
--examples/jars/spark-examples_2.11-2.3.3.jar \ 10
============================
####参数说明
--class:指定包含main方法的主类
--master:指定spark集群master地址
--executor-memory:指定任务在运行时需要的每一个executor内存大小,如果不指定就会全部占用分配的内存
--total-executor-cores:指定任务在运行时需要的总的cpu核数
```
- **高可用模式提交**(把所有master都罗列出来,后期程序会轮询maser列表找到活着的master,然后向它申请资源运行程序)
``
--master spark://node01:7077,node02:7077,node03:7077
``
8. spark-shell使用(退出spark-shell,干掉SparkSubmit进程,spark-shell仅仅用来测试或者本地学习,实际生产不用)
- ``$SPARK_HOME/bin/spark-shell --master local[2]``
####**说明**:本地模式启动2个线程运行程序(本地模式与集群无关),以下'sc'是运行shell后被初始化的SparkConext对象
- web界面:``http://node01:4040``
- 案例:(统计文件里的每个单词个数)
``scala> sc.textFile("file:///home/hadoop/words.txt").flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey((x,y)=>x+y).collect
``
- ####简写
``
scala> sc.textFile("file:///home/hadoop/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
``
- ####处理hdfs上的数据
``
scala> sc.textFile("hdfs://node01:9000/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
``
9. Spark程序的开发(这里不过多介绍)
9.1 本地模式运行
![60771e1528951f6dc30d9e31cdc2b0c5.jpeg](evernotecid://EF6E7930-50FF-44A0-BEB3-6B91139D9B51/appyinxiangcom/27146473/ENResource/p4)
![4d819104964c8a4b4a3a05ec9f1951f8.jpeg](evernotecid://EF6E7930-50FF-44A0-BEB3-6B91139D9B51/appyinxiangcom/27146473/ENResource/p3)
9.2 集群模式开发:上传程序jar包到服务器,spark-submit时指定jar包和主类class以及输入输出参数(这里的输入参数:/words.txt, 输出参数:/out)
![b4c5d28db9b0f561ec9120cc921f3b17.jpeg](evernotecid://EF6E7930-50FF-44A0-BEB3-6B91139D9B51/appyinxiangcom/27146473/ENResource/p5)