安装Spark
Spark是什么
Spark是一个集群计算系统,可以在集群上部署和运行并行的应用,Spark初始是运行Scala应用,但是也支持Java,Python,R。
Spark不但可以作为独立的集群管理器,也可以使用Yarn或者Mesos的集群管理器。
安装之前的准备
- 安装和配置三节点的Hadoop集群,一个节点是master节点(包含HDFS NameNode和YARN ResourceManager)。另两个节点是slave节点(HDFS DataNode和YARN NodeManager),分别是node1和node2.
- 运行jps,确保HDFS和YARN正常运行。
下载和安装Spark
- 安装Spark到/opt目录下
- 配置SPARK_HOME环境变量到~/.bashrc
- 配置$SPARK_HOME/bin到PATH环境变量
集成Spark和Yarn
为了连接Yarn资源管理器,Spark必须知道Hadoop的配置文件,可以通过HADOOP_CONF_DIR环境变量来实现。
- 在~/.bashrc中添加如下内容
export HADOOP_CONF_DIR=$HADOOP_HOME/etct/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
- 重命名Spark的spark-defaults.conf.template
mv $SPARK_HOME/conf/spark-defaults.conf.template $SPARK_HOME/conf/spark-defaults.conf
- 编辑spark-defaults.conf
spark.master yarn
理解client和cluster模式
Spark job可以在Yarn中以两种模式运行,cluster模式和client模式,理解这两种模式的不同,对于使用合适的内存分配配置是非常重要的。
一个Spark job包含两部分,Spark Executors执行实际的任务,Spark Driver用来调度Executors。
- Cluster模式:一切都运行在集群上,例如,你从你的笔记本电脑开启一个job,尽管你关闭你的电脑,但是job还会继续运行。在这种模式下,Spark Driver是在Yarn Application Master中的。
- Client模式:Spark Driver运行在客户端,例如你的笔记本电脑,如果客户端关闭,那么job会失败,Spark Executors仍然运行在集群上,为了调用一切,一个小的Yarn Application Master被创建。
客户端模式很适合交互式的jobs,但是如果客户端停止的话,那么applications将会失败。对于运行时间比较长的jobs,cluster模式会更适合一点。
配置内存分配
如果内存分配没有合理的配置,那么Spark容器会失败。对于小于4G内存的节点,默认的配置是不合适的,因为可能会触发交换和差的性能,甚至可能会导致初始化应用失败,由于内存的缺失。
在编辑Spark内存设置之前,一定要理解Yarn如何管理内存分配。这样才能更好的利用Yarn的能力。
给予Yarn容器最大允许的内存
如果请求的内存超过了允许的最大大限,那么Yarn将会拒绝容器的创建,Spark应用将不会开启。
- 在$HADOOP_CONF_DIR/yarn-site.xml中的yarn.scheduler.maximum-allocation-mb的值是决定单个容器允许的最大内存,以MB为单位。
- 确保接下来配置的Spark内存分配小于yarn.scheduler.maximum-allocation-mb的值。
在cluster模式下配置Spark Driver内存
在cluster模式下,Spark Driver运行在Yarn Application Master中。在初始化过程中,Spark请求的内存大小可以在spark-defaults.conf或者命令行配置。
- spark-defaults.conf
在cluster模式下,分配给Spark Driver的内存(默认是1G)可以以下进行设置:
spark.driver.memory 512m
- 命令行
使用--driver-memory参数来配置spark-submit请求的内存
命令行中的值会覆盖在spark-defaults.conf中的值
在client模式下,配置Spark Application Master的内存
在client模式下,Spark Driver不运行在集群上,上面的配置将会无效。一个Yarn Application Master需要被创建是为了调度Spark executor,你可以设置它的内存大小。
在client模式下,通过使用spark.yarn.am.memory参数来application master的内存大小。
- spark-defaults.conf
spark.yarn.am.memory 512m
这个值不能通过命令行来进行设置
配置Spark Executors的内存
Spark Executors的内存是基于在spark-defaults.conf中的两个参数决定的。
- spark.executor.memory: 设置使用在计算上的内存
- spark.yarn.executor.memoryOverhead:添加到spark.executor.memory内存上,默认是spark.executor.memory值的7%,但是最小值是384MB。
确保Executor请求的内存(包括overhead内存)小于Yarn最大允许的内存,否则Spark应用将不能初始化
例如:spark.executor.memory的值是1G,必要的内存大小是1024 + 384 = 1408MB。对于512MB内存来说,必要的内存大小是512+384=896MB。
为了设置executor内存为512MB,编辑spark-defaults.conf
spark.executor.memory 512m
如何提交Spark应用到Yarn集群上
使用spark-submit命令提交spark应用,spark安装目录包含样本应用,可以进行测试
spark-submit --deploy-mode client \
--class org.apache.spark.examples.SparkPi \
$SPARK_HOME/examples/jars/spark-examples_2.11-2.2.0.jar 10
--deploy-mode配置使用哪种模式,client或者cluster。
监控Spark应用
当你提交一个job时,Spark Driver会自动开启一个端口是4040的web UI,显示关于应用的信息,但是当执行完成时,web UI将不能再访问了。
Spark提供history server,收集来自于HDFS的应用日志,在一个web UI上显示。下面的步骤是开启在HDFS上的日志持久化.
- 编辑spark-defaults.conf文件
spark.eventLog.enabled true
spark.eventLog.dir hdfs://node-master:9000/spark-logs
- 在HDFS上创建目录
hdfs dfs -mkdir /spark-logs
- 在spark-defaults.conf文件中配置关于History Server的属性
spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory hdfs://node-master:9000/spark-logs
spark.history.fs.update.interval 10s
spark.history.ui.port 18080
你可能会使用不同的spark.history.fs.update.interval的值,如果配置的值比较高,将会增大应用实时的状态和History Server的延迟。如果使用比较小的值,将会增加HDFS上的I/O
- 运行History Server
$SPARK_HOME/sbin/start-history-server.sh
- 重复上面计算Pi的例子,将会在HDFS上形成日志
- 在浏览器上通过http://node-master:18080 访问
运行Spark Shell
Spark shell提供交互式的方式进行工作
spark-shell
var input = spark.read.textFile("inputs/alice.txt")
// Count the number of non blank lines
input.filter(line => line.length()>0).count()