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 
 2- node01 
 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
 3- cd /opt/ 
 scp -r spark root@node02:$PWD
 scp -r spark root@node03:$PWD
- 启动服务 - 1 
 2
 3- cd /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