spark-1
1、核心模块简介及安装配置
核心模块
Spark和Hadoop的根本差异是多个作业之间的数据通信问题:Spark多个作业之间数据通信是基于内存,而Hadoop是基于磁盘。
在绝大多数的数据计算场景中,Spark确实会比MapReduce更有优势,但是Spark是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会由于内存资源不够导致Job执行失败,此时,MapReduce其实是一个更好的选择,所以Spark并不能完全替代MR。
Spark Core:提供了Spark最基础与最核心的功能,其余模块都是在Spark Core基础上进行拓展的
Spark SQL:操作结构化数据的功能模块
Spark Streaming:处理流式数据的功能模块
Spark MLlib:处理机器学习相关库的功能模块
Spark GraphX:图形挖掘计算相关功能模块
安装配置
IDEA首先配置scala环境
导入核心依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.3.0</version>
</dependency>
spark版本根据scala sdk版本确定
wordcount案例实现
package spark.core
import org.apache.spark.{SparkConf, SparkContext}
object WordCount2 {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparkConf)
val lines = sc.textFile("datas")
val words = lines.flatMap(_.split(" "))
val words1 = words.map(word => (word, 1))
val wordGroup = words1.groupBy(t => t._1)
val wordToCount = wordGroup.map {
case (word, list) => {
list.reduce((t1, t2) => (t1._1, t1._2 + t2._2))
}
}
val array = wordToCount.collect()
array.foreach(println)
sc.stop()
}
}
2-运行环境
Local模式
不需要其他任何节点资源就可以在本地执行Spark代码的环境,一般用于教学,调试,演示等。
spark安装后,不需要配置,直接执行命令${SPARK_HOME}/bin/spark-shell
就可以进入命令行模式
此时可以输入单行命令执行wordcount案例
sc.textFile("data/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
提交运行案例程序的任务
bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ./examples/jars/spark-examples_2.11-2.4.7.jar 10
并且可以通过端口4040访问网页UI
Standalone模式
顾名思义,独立部署模式,单节点启动。Spark的Standalone模式体现了经典的master-slave模式
配置slaves
num04
num05
num06
配置spark-env.sh
export JAVA_HOME=/opt/jdk1.8
SPARK_MASTER_HOST=num04
SPARK_MASTER_PORT=7077
以上两个配置文件都是template样例文件,修改完成后修改文件名
分发至其余两个节点
可以启动集群了spark_standalone/sbin/start-all.sh
启动成功后,主结点有Master进程,配置有worker的节点有Worker进程
可以使用8080端口访问网页UI
再提交案例任务
bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master spark://num04:7077 ./examples/jars/spark-examples_2.11-2.4.7.jar 10
提交参数格式:
${SPARK_HOME}/bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar>
[application-arguments]
参数说明:
- –class指定包含主函数的类
- –master指定的是运行环境
- –executor-memory 1G:指定每个executor可用内存为1G
- –total-executor-cores 2:指定所有executor使用的cpu核数为2个
- application-jar:打包好的应用Jar,包含依赖
- application-arguments:传给main()方法的参数
配置历史服务
配置spark-defaults.conf(改名)
# 这两行去掉注释,下面的是历史文件保存地址,文件要求已存在
spark.eventLog.enabled true
spark.eventLog.dir hdfs://num04:9000/spark_log
配置spark-env.sh
# 第一项是端口号
# 第二项指定历史文件保存地址,和上面的配置文件要求相同
# 第三项是历史记录个数,超出这个个数,旧的应用程序信息就会被删除
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://num04:9000/spark_log
-Dspark.history.retainedApplications=30"
高可用
集群规划
num04:Master、Worker
num05:Master、Worker
num06:Worker
配置spark-env.sh
# 将原本配置的这两行注释掉
# SPARK_MASTER_HOST=num04
# SPARK_MASTER_PORT=7077
# 修改为如下配置
SPARK_MASTER_WEBUI_PORT=8989
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=num04,num05,num06
-Dspark.deploy.zookeeper.dir=/spark"
分发配置文件
主结点启动集群
第二节点启动Master服务
此时如果可以通过两台节点的IP通过指定的端口号访问webui说明配置成功(主结点status为active,备用节点状态为standby)
再次提交案例任务测试环境
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://num04:7077,num05:7077 \
./examples/jars/spark-examples_2.11-2.4.7.jar 10
Yarn模式
独立部署(Standalone)模式由Spark自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是同时,Spark主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以还是和其他专业的资源调度框架集成会更可靠。所以接下来配置Yarn环境下的Spark。
重新解压缩
修改配置文件
- 修改hadoop配置文件中的yarn-site.xml
<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则会直接将其杀掉,默认是true-->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量。如果任务超出分配值。则直接将其杀掉,默认是true-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
- 配置spark-env.sh
export JAVA_HOME=/opt/jdk1.8
YARN_CONF_DIR=/opt/hadoop/etc/hadoop
- 启动集群
- 再次提交案例任务,测试环境
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.11-2.4.7.jar 10
- 此时控制台不能再看到执行结果了,7077端口也无法打开webui,可以打开8088端口,访问yarn页面,看到spark的任务执行记录
- 此时再配置历史服务,需要在spark-default.conf中多配置一项,关联yarn和spark
spark.yarn.historyServer.address=num04:18080
spark.history.ui.port=18080
- 开启历史服务后再次提交任务
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.4.7.jar 10
Windows模式
为了便于调试和学习,安装Windows模式
运行案例任务,测试环境
D:\sofeware\developtool\spark\bin>spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ../examples/jars/spark-examples_2.11-2.4.7.jar 10
部署模式对比
模式 | spark安装机器数 | 需启动的进程 | 所属者 | 应用场景 |
---|---|---|---|---|
Local | 1 | 无 | Spark | 测试 |
Standalone | 3 | Master及Worker | Spark | 单独部署 |
Yarn | 1 | Yarn和HDFS | Hadoop | 混合部署 |
端口号
- Spark查看当前Spark-shell运行任务情况:4040
- Spark Master内部同通信服务端口:7077
- Standalone模式下,Spark Master Web端口:8080
- Spark历史服务:18080
- Hadoop Yarn任务运行情况查看端口:8088
IDEA设置控制台不打印INFO信息
1、首先将spark根目录下中的conf目录里的log4j.properties.template文件拷贝到IDEA项目中的src\main\resources目录下并改名为log4j.properties
2、然后在将文件中的log4j.rootCategory=INFO, console修改为log4j.rootCategory=ERROR, console即可