1.0 Spark 学习
1.1 spark 是什么
快速,多用途,集群计算系统
hdfs
分布式存储工具,hadoop存在MR(map-reduce)即,每个计算节点计算完毕后hdfs存储在本地,效率地下
spark,中间结果存储在内存
1.2 spark 优势
速度快,是MR100倍
易用,更加灵活的api
通用,提供大部分计算工具(结构化,非结构化,图形计算)
兼容性好,可以访问大部分中间队列和数据库
1.3 Spark组件
spark-core:是整个spark的基础(RDDs)
spark-sql: 处理结构化数据,Data set,DateFrame 上执行sql
spark-streaming: 流分析,和批量分析
MLib: 机器学习
GraphX:图计算工具
1.4 hadoop和spark
- hadoop:基础平台(存储,调度),spark只是替换mr的计算工具
- hadoop擅长处理大数据的批处理,spark也支持大数据,快,适合迭代,交互,流计算
- hadoop延迟大,spark 小
2.0 Spark 集群
2.1 spark集群结构
spark支持集群管理工具(standalone,yarn,mersos,kubernetes)
spark客户端(Driver:该进程调用spark的main,并且启动SparkContext)调用集群管理工具(Cluster manager),cm负责将任务分发,每个子主机(Worker)有个守护进程,负责和cm沟通,每个Worker执行分发下来的任务,在其内的JVM虚拟机中执行(Executor)
流程:启动Driver,创建sparkContext(切割任务),Client提交程序给Driver,Driver向CM申请集群资源,CM在对应的Worker启动Executor执行任务
NOTE:
- spark不是每次都需要启动集群,可以在单机模式(standalone)中使用测试代码
- spark可以运行在不同集群中,支持yarn,mersos,kubernetes和自己的standalone,在每个集群中启动方式不同
- spark在每个集群的启动模型自行了解
2.2 spark集群搭建
2.2.0 配置hadoop
- 配置hadoop的java环境
/opt/hadoop/etc/hadoop/hadoop-env.sh
:
1 | export JAVA_HOME=/usr/java/jdk1.8 |
vim /opt/hadoop/etc/hadoop/core-site.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node01:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
<!--property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property-->
</configuration>vim /opt/hadoop/etc/hadoop/hdfs-site.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node01:50090</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///opt/hadoop/tmp/edits</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
</configuration>vim /opt/hadoop/etc/hadoop/mapred-site.xml
1 | <configuration> |
vim /opt/hadoop/etc/hadoop/mapred-env.sh
1 | export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000 |
vim /opt/hadoop/etc/hadoop/slaves
:node01
mkdir -p /opt/hadoop/tmp
mkdir -p /opt/hadoop/edits
mkdir -p /opt/hadoop/name
mkdir -p /opt/hadoop/data
格式化和启动dfs
/opt/hadoop/bin/hdfs namenode -format
/opt/hadoop/sbin/start-dfs.sh
/opt/hadoop/sbin/start-yarn.sh
- 配置环境变量
1 | export HADOOP_HOME=/opt/hadoop |
- web查看hadoop存储空间
w3m http://node01:50070
NOTE: 如果jps查看缺了什么namenode或者datanode cd /opt/hadoop/tmp
rm -r dfs
(不使用停止服务 会导致这样)
- 常用命令
hdfs dfs -ls /
hdfs dfs -mkdir /spark_log
hdfs dfs -put xxx.txt /data
2.2.1 安装配置spark
下载spark 2.2,hadoop 2.75和安装
配置本地host:
127.0.0.1 localhost node01 localhost4 localhost4.localdomain4
配置conf/spark-env.sh
1 | 指定java |
配置conf/slaves,master启动时可以启动所有从节点,告诉master worker在哪
1
2node01
192.168.....配置history server:conf/spark-defaults.conf,运行结束后无法查看中间过程,配置这个即可看到
启用输出日志,指定输入地址,是否压缩
1 | spark.eventLog.enabled true |
- 创建history-server的日志地址 hdfs目录下
hdfs dfs mkdir -p /spark_log
2.2.2 分发
同步配置到其他机器
1
2
3cd /opt/
scp -r spark root@node02:$PWD
scp -r spark root@node03:$PWD启动服务
1
2
3cd /opt/spark
sbin/start-all.sh
sbin/start-history-server.sh
2.3 高可用
master有可能会挂,所有需要整一个备用master,有两种方式实现,一个是利用本地,一个是利用ZooKeeper,大部分是后者
配置高可用
进入spark-env.sh
1
2
3
4注释原来的Spark Master地址
export SPARK_MASTER_HOST=node01
指定spark运行时参数
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181(#这里填写的是zookeeper的三台主机) -Dspark.deploy.zookeeper.dir=/spark"分发配置
scp -r spark root@node02:$PWD
启动
jps查看启动进程,webUI: localhost:8080
2.4 入门案例
- 提交任务命令
程序名,master节点,执行内存,执行内数量,包名
`bin/spark-submit
–class org.apache.spark.examples.SparkPi
–master spark://node01:7077
–executor-memory 1G
–total-executor-cores 2
/opt/spark/examples/jars/spark-examples_2.11-2.2.0.jar
out.log
`
2.4.1 执行方式
- 观察数据集
- 测试数据集
- 固话代码
- 提交集群
2.4.1.1 spark-shell 读取本地文件和读取hdfs 统计单词数量
启动spark-shell:
spark-shell –master local[N] 使用N条worker线程本地运行
spark-shell –master spark://host:port standAlone中运行,指定master地址,默认端口7077
spark-shell –master mesos://host:port Apache Mesos中运行
spark-shell –master yarn yarn中运行
建立文件 vim /opt/data/WordCount.txt
进入shell spark-shell –master local[6]
1 | // 读取文件 /opt/data/WordCount.txt |
如果文件过大,本机存不下,需要将文件上传到hdfs,可以直接不加”hdfs://node01:8020”,需要在conf/spark-env.sh中配置
1 | export HADOOP_HOME=/opt/hadoop |
cd /opt/data
hdfs dfs -mkdir /data
,hdfs dfs -put WordCount.txt /data
1 | // 读取文件 /opt/data/WordCount.txt |
- 只有在调用collect的时候才会计算
2.4.1.1 独立应用
- 本地运行
创建idea,maven 工程
pom.xml
1 |
|
WordCount.scala
1 | package com.tr.spark |
- 提交运行
- 修改本地文件读取路径为hdfs
- 打成jar包 mvn package
- 两个包:一个包大的包含了所有的依赖,一个小开头为orignal只包含了代码,由于云上有spark环境,只需要小包即可
root@tr:/opt/spark# bin/spark-submit --class com.tr.spark.WordCount --master spark://node01:7077 /opt/MyExercise/original-tr.jar