1. Standalone模式
1.1 概述
使用Standalone需要构建一个完整的Master+Slaves的Spark集群,分布式部署,资源管理和任务监控都是依赖Spark自带架构实现。
1.2 安装使用
1)进入spark安装目录下的conf文件夹
[centos@hadoop102 module]$ cd spark/conf/
2)修改配置文件名称
[centos@hadoop102 conf]$ mv slaves.template slaves
[centos@hadoop102 conf]$ mv spark-env.sh.template spark-env.sh
3)修改slave文件,添加work节点
[centos@hadoop102 conf]$ vim slaves
hadoop102
hadoop103
hadoop104
4)修改spark-env.sh文件,添加如下配置
[centos@hadoop102 conf]$ vim spark-env.sh
SPARK_MASTER_HOST=hadoop102
SPARK_MASTER_PORT=7077
5)分发spark包
[centos@hadoop102 module]$ xsync spark/
6)启动
[centos@hadoop102 spark]$ sbin/start-all.sh
网页查看: hadoop102:8080
注意:如果遇到 “JAVA_HOME not set” 异常,可以在sbin目录下的spark-config.sh 文件中加入如下配置
export JAVA_HOME=XXXX
2. Yarn模式
2.1 概述
Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
yarn-client:Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出。
yarn-cluster:Driver程序运行在由RM(ResourceManager)启动的AP(APPMaster)适用于生产环境。
2.1 安装使用
1)修改hadoop配置文件yarn-site.xml,添加如下内容:
[centos@hadoop102 hadoop]$ vi yarn-site.xml
yarn.nodemanager.pmem-check-enabled
false
yarn.nodemanager.vmem-check-enabled
false
2)修改spark-env.sh,添加如下配置
[centos@hadoop102 conf]$ vi spark-env.sh
YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
3)将以下文件分发同步到hadoop103和hadoop104上
1. /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
2. spark-env.sh
4)执行一个示例程序
[centos@hadoop102 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100
注意:在提交任务之前需启动HDFS以及YARN集群。
2.2 日志查看
1)修改配置文件spark-defaults.conf
添加如下内容:
spark.yarn.historyServer.address=hadoop102:18080
spark.history.ui.port=18080
2)重启spark历史服务
[centos@hadoop102 spark]$ sbin/stop-history-server.sh
[centos@hadoop102 spark]$ sbin/start-history-server.sh
3)提交任务到Yarn执行
[centos@hadoop102 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100
4)Web页面查看日志
3.配置HistoryServer
Ø 临时配置,对本次提交的应用程序起作用
./spark-shell --master spark://node1:7077
--name myapp1
--conf spark.eventLog.enabled=true
--conf spark.eventLog.dir=hdfs://node1:9000/spark/test
停止程序,在Web Ui中Completed Applications对应的ApplicationID中能查看history。
Ø spark-default.conf配置文件中配置HistoryServer,对所有提交的Application都起作用
在客户端节点,进入../spark-2.3.4/conf/ spark-defaults.conf最后加入
//开启记录事件日志的功能
spark.eventLog.enabled true
//设置事件日志存储的目录
spark.eventLog.dir hdfs://node1:9000/spark/test
//设置HistoryServer加载事件日志的位置
spark.history.fs.logDirectory hdfs://node1:9000/spark/test
//日志优化选项,压缩日志
spark.eventLog.compress true
启动HistoryServer
./start-history-server.sh
效果展示
4. Master HA
4.1 Master的高可用原理
Standalone集群只有一个Master,如果Master挂了就无法提交应用程序,需要给Master进行高可用配置,Master的高可用可以使用fileSystem(文件系统)和zookeeper(分布式协调服务)。
fileSystem只有存储功能,可以存储Master的元数据信息,用fileSystem搭建的Master高可用,在Master失败时,需要我们手动启动另外的备用Master,这种方式不推荐使用。
zookeeper有选举和存储功能,可以存储Master的元素据信息,使用zookeeper搭建的Master高可用,当Master挂掉时,备用的Master会自动切换,推荐使用这种方式搭建Master的HA。
4.2 Master高可用搭建
1)在Spark Master节点上配置主Master,配置spark-env.sh
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=node3:2181,node4:2181,node5:2181
-Dspark.deploy.zookeeper.dir=/sparkmaster0821"
2) 发送到其他worker节点上
3) 找一台节点(非主Master节点)配置备用 Master,修改spark-env.sh配置节点上的MasterIP
4)启动集群之前启动zookeeper集群
../zkServer.sh start
5) 启动spark Standalone集群,启动备用Master
6) 打开主Master和备用Master WebUI页面,观察状态。
4.3 注意点
Ø 主备切换过程中不能提交Application。
Ø 主备切换过程中不影响已经在集群中运行的Application。因为Spark是粗粒度资源调度。
4.4 测试验证
提交SparkPi程序,kill主Master观察现象。
./spark-submit
--master spark://node1:7077,node2:7077
--class org.apache.spark.examples.SparkPi
../lib/spark-examples-2.3.4-hadoop2.7.0.jar
10000
5. 硬件说明
1. Cpu:每台计算机上至少配置8-16个内核。
2. Memory: 通常,Spark可以在每台机器8 GB到数百GB的内存中运行良好。在所有情况下,我们建议仅为Spark分配最多75%的内存;其余的留给操作系统和缓冲区高速缓存。
3. 磁盘:每个节点有4-8个磁盘。
6. Spark容器镜像制作
Spark2.3.4 部署资料包以及更具体脚本请见资料目录,此处列举关键脚本内容。
首先需要Docker运行环境以便执行Docker命令。
DockerFile如下
FROM harbor.gaoming.net/gaoming-snapshot/base:1.0.0
MAINTAINER Gao
USER root
ADD spark-2.3.4-bin-hadoop2.7.tgz /usr/local/
RUN cd /usr/local && ln -s spark-2.3.4-bin-hadoop2.7 spark
ADD bootstrap.sh /etc/bootstrap.sh
RUN chown root:root /etc/bootstrap.sh && chmod 700 /etc/bootstrap.sh
ENV SPARK_HOME /usr/local/spark
ENV PATH $PATH:$SPARK_HOME/bin
ENV BOOTSTRAP /etc/bootstrap.sh
ENTRYPOINT ["/etc/bootstrap.sh"]
Boostrap.sh如下
#!/usr/bin/env bash
DAEMON=true
if [ -z "${LOG_DIR}" ]; then
export LOG_DIR="/var/log/spark-app/default/"
fi
if [ "${BEFORE_RUN}" ]; then
$BEFORE_RUN
fi
DATETIME=`date +%Y-%m-%d`
log_file=$LOG_DIR/$DATETIME
mkdir -p $LOG_DIR
echo log4j.appender.FILE.File=$log_file >> /usr/local/spark/conf/log4j.properties
if [ "${SPARK_RUN}" ]; then
echo $SPARK_RUN > /home/spark_run.sh
sh /home/spark_run.sh
else
$*
fi
if [ "${AFTER_RUN}" ]; then
$AFTER_RUN
fi
if [ "${DAEMON}" ]; then
# TODO: use other command
while :
do
sleep 300
echo `date `" sleep !!"
done
fi
在DockerFile和boostrap.sh目录下执行如下命令完成容器制作
docker build -t 容器名:容器版本 .
注意:不要忘记最后的.
7. Spark+Hadoop容器镜像制作
由于Docker Hub星级排名最高的Spark镜像只支持1.6.x,如下所示
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
sequenceiq/spark An easy way to try Spark 450 [OK]
因此当我们要使用Spark 2.x以上版本时候需要自己动手制作,具体操作如下。首先准备Docker运行环境
拉取hadoop 镜像
docker pull sequenceiq/hadoop-docker:2.7.0.
3. 关键脚本编写如下
DockerFile如下
FROM sequenceiq/hadoop-docker:2.7.0
MAINTAINER Gao
RUN mkdir /usr/local/java
ADD jdk-8u231-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_231
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
#support for Hadoop 2.7.0
# RUN curl -s http://d3kbcqa49mib13.cloudfront.net/spark-1.6.1-bin-hadoop2.6.tgz | tar -xz -C /usr/local/
ADD spark-2.3.4-bin-hadoop2.7.tgz /usr/local
RUN cd /usr/local && ln -s spark-2.3.4-bin-hadoop2.7 spark
ENV SPARK_HOME /usr/local/spark
RUN mkdir $SPARK_HOME/yarn-remote-client
ADD yarn-remote-client $SPARK_HOME/yarn-remote-client
# RUN $BOOTSTRAP && $HADOOP_PREFIX/bin/hadoop dfsadmin -safemode leave && $HADOOP_PREFIX/bin/hdfs dfs -put $SPARK_HOME-2.1.0-bin-hadoop2.6/jars /spark && $HADOOP_PREFIX/bin/hdfs dfs -put $SPARK_HOME-2.1.0-bin-hado# op2.6/examples/jars /spark
RUN $BOOTSTRAP && $HADOOP_PREFIX/bin/hadoop dfsadmin -safemode leave && $HADOOP_PREFIX/bin/hdfs dfs -put $SPARK_HOME-2.3.4-bin-hadoop2.7/jars /spark && $HADOOP_PREFIX/bin/hdfs dfs -put $SPARK_HOME-2.3.4-bin-hadoop2.7/examples/jars /spark
ENV YARN_CONF_DIR $HADOOP_PREFIX/etc/hadoop
ENV PATH $PATH:$SPARK_HOME/bin:$HADOOP_PREFIX/bin
# update boot script
COPY bootstrap.sh /etc/bootstrap.sh
RUN chown root.root /etc/bootstrap.sh
RUN chmod 700 /etc/bootstrap.sh
#install R
#RUN rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#RUN yum -y install R
ENTRYPOINT ["/etc/bootstrap.sh"]
Boostrap.sh如下
#!/bin/bash
: ${HADOOP_PREFIX:=/usr/local/hadoop}
$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh
rm /tmp/*.pid
# installing libraries if any - (resource urls added comma separated to the ACP system variable)
cd $HADOOP_PREFIX/share/hadoop/common ; for cp in ${ACP//,/ }; do echo == $cp; curl -LO $cp ; done; cd -
# altering the core-site configuration
sed s/HOSTNAME/$HOSTNAME/ /usr/local/hadoop/etc/hadoop/core-site.xml.template > /usr/local/hadoop/etc/hadoop/core-site.xml
# setting spark defaults
echo spark.yarn.jar hdfs:///spark/* > $SPARK_HOME/conf/spark-defaults.conf
cp $SPARK_HOME/conf/metrics.properties.template $SPARK_HOME/conf/metrics.properties
service sshd start
$HADOOP_PREFIX/sbin/start-dfs.sh
$HADOOP_PREFIX/sbin/start-yarn.sh
DAEMON=true
if [ "${DAEMON}" ]; then
# TODO: use other command
while :
do
sleep 1000
echo `date `" sleep !!"
done
fi
CMD=${1:-"exit 0"}
if [[ "$CMD" == "-d" ]];
then
service sshd stop
/usr/sbin/sshd -D -d
else
/bin/bash -c "$*"
fi
在DockerFile和boostrap.sh目录下执行如下命令完成容器制作
docker build -t 容器名:容器版本 .
8. SparkBench大数据性能基准测试工具
1.构建Hibench
build all modules in HiBench,use the below command
1.build all modules in HiBench,use the below command
Build a specific framework benchmark
mvn -Phadoopbench -Dspark=2.1 -Dscala=2.11 clean package
Build a single module
mvn -Psparkbench -Dmodules -Psql -Dspark=2.1 -Dscala=2.11 clean package
Set up
Python 2.x(>=2.6) is required.
bc is required to generate the HiBench report.
Supported Hadoop version: Apache Hadoop 2.x, CDH5.x, HDP
Supported Spark version: 1.6.x, 2.0.x, 2.1.x, 2.2.x
Start HDFS, Yarn, Spark in the cluster
Configure hadoop.conf 和Configure spark.confPropertyMeaning
hibench.hadoop.homeThe Hadoop installation location
hibench.hadoop.executableThe path of hadoop executable. For Apache Hadoop, it is /YOUR/HADOOP/HOME/bin/hadoop
hibench.hadoop.configure.dirHadoop configuration directory. For Apache Hadoop, it is /YOUR/HADOOP/HOME/etc/hadoop
hibench.hdfs.masterThe root HDFS path to store HiBench data, i.e. hdfs://localhost:8020/user/username
hibench.hadoop.releaseHadoop release provider. Supported value: apache, cdh5, hdp
hibench.spark.home The Spark installation location
hibench.spark.master The Spark master, i.e. `spark://xxx:7077`, `yarn-client`
Run a workload
bin/workloads/micro/wordcount/prepare/prepare.sh
bin/workloads/micro/wordcount/spark/run.sh
性能测验
流处理
性能测试流程步骤如下
1. 创造数据放置HDFS
2. 向Kafka发送记录消息
本次发送数据测试指标详情如下
Interval Span : 50 ms
Record Per Interval : 5
Record Length : 200 bytes
Producer Number : 1
Total Records : -1 [Infinity]
Total Rounds : -1 [Infinity]
Kafka Topic : identity
====================================================
Estimated Speed :
100 records/second
0.02 Mb/second
3. 开启流式任务处理
如下Spark Streaming任务阻塞,正在处理消费数据
4. 观察流处理过程中详情
Running batches of 100 msfor 4 hours 26 minutes 36 secondssince 2020/03/30 23:47:44(159979 completed batches, 2070074 records)
5. 观察流处理后的指标统计
指标包括
1.磁盘,比如io写,io读效率 (byte/second)
2.CPU 比如system ,idle ,iowait,irq ,softirq 等
3.内存 比如label = 'total', total = 131918500, used = 1, buffer_cache = 35182820, free = 78597416, map = 283156)
{
'timestamp': 1585559452.413635,
'hostname': 'rgibns1',
'proc': Proc(label = 'total', load5 = 0.28, load10 = 0.29, load15 = 0.63, running = 5, procs = 2903),
'memory/total': Memory(label = 'total', total = 65595720, used = 22327984, buffer_cache = 23487860, free = 19779876, map = 347428)
}
2. 批处理
创造数据放置HDFS
此处参考流处理
执行批量任务WordCount负载
3. 观察结果
目前跑两次批量任务,一个是tiny任务,数据流大约35704比特
另外一个是GB数据量。
测验报告如下
我在生产上使用的启动命令
spark-submit --class com.batch.GaomingJob --name com.batchGaomingJob --master local[*] --conf spark.ui.port=4042 --conf spark.scheduler.mode=FIFO --conf spark.shuffle.manager=sort --conf spark.default.parallelism=8 --conf spark.locality.wait=0s --conf spark.executor.logs.rolling.strategy=time --conf spark.executor.logs.rolling.time.interval=daily --conf spark.executor.logs.rolling.maxRetainedFiles=10 --conf spark.streaming.concurrentJobs=1 --conf spark.shuffle.consolidateFiles=true --conf spark.shuffle.file.buffer=1024k --conf spark.reducer.maxSizeInFlight=128m --conf spark.shuffle.sort.bypassMergeThreshold=100 --conf spark.ui.showConsoleProgress=false /home/gaoming/webapps/spark-stream-1.0.0.jar >/home/logs/GaomingJob.log 2>&1 &