Spark部署模式另类详解(内附大数据教程)
一, Spark的运行模式讲解
Spark运行模式有很多种,本文主要是将local,Standalone,yarn。因为平时生产中用的最多的也是yarn,所以,我们后面也重点讲解基于yarn的。其实,原因很简单,集群服务角色越多,越难运维,所以,统一调度系统,也是降低运维难度,减少故障源。
1, local模式
这种模式,主要是用来简单的逻辑验证类的,也可以进行对Spark应用进行debug。实际生产中我们可以用client模式进行验证性测试。使用方法很简单,我们只需要指定Master为local即可,此时要强调的是local[n],这个n代表线程数,也即它决定了你本地模式的并发度(能并行几个task),local内部不指定默认线程数为1,local[*]代表当前cpu的核心数个线程。
2, Standalone模式
所谓Standalone模式,就是采用Spark的master-worker进行资源管理和应用的调度。
3, Spark On yarn
所谓yarn模式,就是资源管理和app调度交给了yarn来做。此时常见的两种模式,就是yarn-client,yarn-cluster。主要区别就是Driver这个Spark App的应用内部角色运行的位置,运行在submit提交的进程中也即客户端成为client模式,与AppMaster一起运行在非client进程中成为cluster模式。Yarn-client模式,明显的缺点就是客户端断开APP就会死掉,主要用来调试。
二, Spark local模式的使用
这种模式,既可以使用Spark-shell进行测试,也可以采用idea进行本地测试。
1, 准备
首先解压Spark2.1.2(spark-2.1.2-bin-hadoop2.7.tgz),并配置环境变量。
2, Spark-shell本地测试
输入spark-shell --master local[4]
2.1并行化数据集
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
2.2读取本地文件
读取$SPARK_HOME/LICENSE文件
简单的wordCount并排序的程序
2.3 读取hdfs上文件
由于我们前面的关于/etc/profile配置已经包含了hadoop的配置,Spark直接可以找到hadoop配置,所以只要我们不加file前缀,就默认读取的是hdfs的数据,当然,也可以指定绝对路径(hdfs://Luffy.OnePiece.com:8020/user/root/input/wc.txt)。
三, Spark Standalone模式的使用
1, 配置
slaves spark-defaults.conf spark-env.sh这三个文件,原来后面都带.template,重命名。slaves修改内容为:Luffy.OnePiece.com,这里面应该是要启动的worker的主机名列表。spark-defaults.conf,主要是一些默认配置,在这里需要指定
spark.master spark://Luffy.OnePiece.com:7077
spark-env.sh配置,主要是添加以下
export JAVA_HOME=/opt/modules/jdk1.8.0_121
SPARK_MASTER_HOST=Luffy.OnePiece.com
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=4
SPARK_WORKER_MEMORY=8000m
SPARK_WORKER_PORT=7078
SPARK_WORKER_INSTANCES=1
然后这配置就算完成了
2, 启动
启动master
start-master.sh
启动worker,本机
start-slave.sh spark://Luffy.OnePiece.com:7077
也可以执行启动所有机器的Worker命令
start-slaves.sh,不过这个要配置包括本机在内的免秘钥登录。
启动完成之后
3, 读取本地文件
还是那spark-shell(启动的时候可以指定master不指定的话会读取spark-defaults.conf)使用为例,读取本地文件,启动后在浏览器上查看
http://luffy.onepiece.com:8080/
val distFile = sc.textFile("file:///opt/modules/spark-2.1.2/LICENSE")
distFile.flatMap(_.split("\s+")).map((_,1)).reduceByKey(_+_).map(each=>(each._2,each._1)).sortByKey(false)
res0.take(10).foreach(println)
4, 读取hadoop文件
只需换掉3,步骤中的file://就好,没有带hdfs的文件系统头(hdfs://Luffy.OnePiece.com:8020/user/root/input/wc.txt),原因也是因为我们在/etc/profile配置了hadoop的配置。
四, Spark On yarn的使用
在on yarn模式的时候,实际上就不需要启动spark的master和worker了,spark只需要找到yarn的配置即可,主要去掉虚拟内存检测,分配虚假cpu和内存。yarn-site.xml配置内容如下:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>13968</value>
<description>64G. Physical memory, in MB, to be made available to running containers.</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>6</value>
<description>Number of CPU cores that can be allocated for containers.</description>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Luffy.OnePiece.com</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<description>Classpath for typical applications.</description>
<name>yarn.application.classpath</name>
<value>/opt/modules/spark-2.1.2/jars/*,$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,
$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*
</value>
</property>
hdfs-site.xml要加上去掉权限检查
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
再就是要讲hdfs-site.xml和core-site.xml复制到spark的conf/目录下,假如要使用hive表功能的话hive-site.xml也要添加进去
spark-defaults.conf配置内容如下(依赖的jar都可以放到此处,避免每次copy):
spark.driver.extraClassPath /opt/modules/spark-2.1.2/jars/*:/opt/modules/hadoop-2.7.4/share/hadoop/hdfs/*:/opt/modules/hadoop-2.7.4/share/hadoop/common/*:/opt/modules/hadoop-2.7.4/share/hadoop/common/lib/*:/opt/modules/hadoop-2.7.4/share/hadoop/yarn/*:/opt/modules/hadoop-2.7.4/share/hadoop/yarn/lib/*:/opt/modules/spark-2.1.2/jars/*:/opt/modules/hive-1.2.1/lib/*:/opt/modules/hbase-1.2.0/lib/*
spark.executor.extraClassPath /opt/modules/spark-2.1.2/jars/*:/opt/modules/hadoop-2.7.4/share/hadoop/hdfs/*:/opt/modules/hadoop-2.7.4/share/hadoop/common/*:/opt/modules/hadoop-2.7.4/share/hadoop/common/lib/*:/opt/modules/hadoop-2.7.4/share/hadoop/yarn/*:/opt/modules/hadoop-2.7.4/share/hadoop/yarn/lib/*:/opt/modules/spark-2.1.2/jars/*:/opt/modules/hive-1.2.1/lib/*:/opt/modules/hbase-1.2.0/lib/*
spark-env.sh的配置内容如下:
export JAVA_HOME=/opt/modules/jdk1.8.0_121
export HADOOP_HOME=/opt/modules/hadoop-2.7.4/
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
首先就是要启动yarn相关的服务。
再次以spark-shell的使用为例,我们让其以yarn-client的模式(其实,也只能运行于该模式)
Spark-shell on yarn读取hdfs上文件
Spark-shell local模式读取本地文件
提交Spark的pi运行案例
spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 4g --executor-memory 2g --executor-cores 1 examples/jars/spark-examples*.jar 10
启动spark-sql的时候要先删除,
rm -rf jars/derby-10.12.1.1.jar
否则会报错误。
五, 总结Spark在生产中的场景
Spark在企业中的应用场景。
1, Spark Streaming的准实时处理。
2, Spark core/sql的离线处理。
3, Spark sql+hive的metastore做仓库。
4, Spark mllib/ml/TensorFlow/deeplearning4j等做机器学习。
5, Spark也可以代替sqoop进行RMDBS和hadoop集群数据导入导出
给大家来一波福利,大数据项视频教程和实战项目: