Spark相关组件运维

本文主要讲解我工作中对Spark的运维整理,包括安装,配置等。

1、介绍

     相信大家在使用Spark的过程中遇到过一个很简单的问题,用户使用一个简单的spark-sql命令打印了太多的日志,那肯定有人说将日志级别提高到WARN来减少了,是滴这确实是一种牺牲一些信息来获得简洁的方式。借助于这个方式我们思考,或许业务方的小白不太需要满屏的INFO日志,可能或许他们根本就不懂这些含义,所以我们将日志级别提高到了WARN,But 用户不需要这些INFO信息我们需要啊,不然怎么找问题(苦笑脸)。经过良久思考我们发现或许可以将日志进行分开打,给用户打印WARN级别的(Console),给我们打印INFO级别的(File)。说明下前面所说的是On Yarn下Driver端的日志。
配置非常简单:

##info to File;warn to console
log4j.rootCategory=INFO,info,warn
##info to File
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File=/appcom/logs/spark/spark-subimt/${user.name}/sparkSubmit-${user.name}.log
log4j.appender.info.DatePattern=yyyy-MM-dd
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p %c{1}: %m%n
##warn to console
log4j.appender.warn=org.apache.log4j.ConsoleAppender
log4j.appender.warn.target=System.out
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{ISO8601} %-5p (%t) [%F:%M(%L)] - %m%n
log4j.appender.warn.Threshold=WARN

     举手投足间我们就解决了一个大问题,毕竟很多用户用SparkSQL啊。BTW,Spark还有这么多组件呢,我就那么简单的数了数Mllib,SparkStreaming,RDD,ThriftServer,SparkR,Structured Streaming,PySpark,History ......好像差不多要数完了(鄙视脸)。那么这些日志怎么办,他们的日志就不要管了,你改了spark-sql的日志你让我们怎么启动。经过长久思考,改吧,改吧,不再按着一个spark的安装目录,一个conf目录来了,这次一定要改成配置清晰,日志清晰。那好吧,既然这样大家都不读一样的conf了各按各的来,log打到各自的目录。跑过去开心的跟老大商量,老大:既然你下定决心了,那改吧,开发,测试生产。我:.......。
     真的是九牛二虎之力啊,终于让我改造好了。吹了这么多的水,其实很简单,下面开始简约介绍。

2、方案设计

     为了升级方便,那么最先想到的当然就是劲量不去修改Spark的安装目录,那么对于Spark的安装主要有几个目录:bin,sbin,conf进行设计了。经过一番思考决定将sbin和bin放到spark-cmd目录,并将下面的脚本进行相应的修改。同时为了日志打印方便将conf目录进行了划分。具体见如下介绍:
1. 在安装Spark时我们将Spark的安装包解压在/appcom/Install/SparkInstall文件夹下同时建立相应的软链接/appcom/Install/spark指向解压后的文件夹;
2. 为了Spark组件在启动时的日志和配置不一样,我们在/appcom/Install/下建立了一个子文件夹spark-cmd。该文件下的目录结果为:
├── bin:目录存放修改spark安装包下的bin文件,加入PATH;
├── sbin: 目录存放修改后historyServer和thriftServer等shell文件;
├── thriftServer:目录存放为用户启动thriftServer服务的shell文件。
3. 为了日志方便将spark-config的目录结构如下,:
├── spark-submit:存放其他spark组件的配置文件;
├── spark-sql:存放spark-sql的配置文件;
├── thriftserver-config:存放ThriftServer的配置文件;
├── pyspark:存放pyspark的配置文件。

这几个文件夹spark-submit是基础文件夹,含有常用的Spark配置文件其余文件进行软链接,其余文件夹中主要拥有不一样的log4j.properties文件。

3、spark-cmd和spark-config修改记录

3.1 spark-cmd/bin目录:

     bin目录主要是拷贝了Spark安装包下的bin目录的命令进行修改,对于需要特许日志打印的进行的修改主要是将环境变量SPARK_CONF_DIR指向自己的Conf目录,实例SparkSQL:

#!/usr/bin/env bash
export SPARK_CONF_DIR=/appcom/config/spark-config/spark-sql
exec "${SPARK_HOME}/bin/spark-sql" "$@"

对于不进行区分的命令修改毕竟简单如:beeline,spark-class,spark-shell等:

#!/usr/bin/env bash
exec "${SPARK_HOME}/bin/beeline" "$@"

3.2 spark-cmd/sbin目录:

     sbin目录主要是将spark安装目录下的sbin目录的HistoryServer和Thriftserver脚本进行修改;其中HistoryServer的启动脚本为:

#!/usr/bin/env bash
export SPARK_LOG_DIR=/appcom/logs/spark
if [ -z "${SPARK_HOME}" ]; then
  export SPARK_HOME=/appcom/Install/spark
fi
sh "${SPARK_HOME}/sbin"/start-history-server.sh 

Thriftserver的启动脚为了在name对用户进行区分直接拷贝了spark安装目录下的sbin目录进行修改,主要内容为:

#!/usr/bin/env bash
# Shell script for starting the Spark SQL Thrift server
export SPARK_CONF_DIR=$SPARK_CONF_DIR/thriftserver-config

#Enter posix mode for bash
set -o posix

if [ -z "${SPARK_HOME}" ]; then
  export SPARK_HOME=/appcom/Install/spark
fi

# NOTE: This exact class name is matched downstream by SparkSubmit.
# Any changes need to be reflected there.
。。。。无修改的地方省略。。。。
export SUBMIT_USAGE_FUNCTION=usage
exec "${SPARK_HOME}"/sbin/spark-daemon.sh submit $CLASS "$@" --name "Thrift JDBC/ODBC Server-$USER" 

3.3 spark-cmd/thriftServer目录:

     thriftServer目录存放为用户启动thriftServer服务的shell文件,之所以要另外给每个用户建立一个thriftServer的启动文件,主要是因为thriftServer为后台进程,为了方便进行管理需要指定特定的端口和日志目录,队列等,并且文件所属也为对应的用户。内容主要如下:

export SPARK_LOG_DIR=/appcom/logs/spark/thriftserver/hadoop
export SPARK_PID_DIR=$SPARK_LOG_DIR/pids
export HIVE_SERVER2_THRIFT_BIND_HOST=*****(这里是IP)
export HIVE_SERVER2_THRIFT_PORT=10000
sh $SPARK_CMD/sbin/start-thriftserver.sh 1 --queue default --executor-cores 2 --executor-memory 4g --num-executors 10 --driver-memory 6g --conf spark.sql.shuffle.partitions=200 --conf spark.driver.maxResultSize=500m --conf spark.locality.wait=3s --conf spark.scheduler.mode=FAIR --conf spark.sql.hive.thriftServer.singleSession=true --conf spark.driver.extraJavaOptions="-XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=40 -XX:G1ReservePercent=10 -XX:G1HeapRegionSize=4M -XX:MaxPermSize=256M  -XX:+PrintReferenceGC -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark  -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:${SPARK_LOG_DIR}/hadoop-gc.log.$(date +%Y%m%d%H%M%S)"

3.4、spark-config目录:

     spark-config目录下的目录比较特别的只有spark-submit,其他目录的配置文件除了driver的log4j.properties都软链接该目录下的文件。spark-submit目录下的配置文件主要就是对spark安装目录conf下的文件进行的修改。对于该目录下的文件介绍请参考我的另外一篇文章:Spark Conf和Shell文件分析

3.5 spark-config/spark-submit目录介绍:

     配置的环境变量SPARK_CONF_DIR会指定Spark运行时的conf目录,然后运行时会上传给所有的Executor。默认配置的SPARK_CONF_DIR目录为spark-submit,其中文件主要介绍如下:
1. spark-defaults.conf:Spark的主要配置文件,用于配置Spark运行相关的配置参数;
2. spark-env.sh:Spark的主要环境变量配置文件,用于用户配置相关的环境变量如:SPARK_LOCAL_IP,SPARK_HISTORY_OPTS等;
3. log4j.properties:Spark默认的日志配置文件,默认Driver和Executor都是该文件。同时Spark还给后台程序启动时指定了Log文件目录为SPARK_LOG_DIR,如ThriftServer和HistoryServer都是后台进程;
4. executor-log4j.properties:用于给Executor的日志配置文件,在Spark-default中加入了相应的参数:
spark.executor.extraJavaOptions …-Dlog4j.configuration=executor-log4j.properties…
5. fairscheduler.xml:Spark的调度池配置,这个配置文件的使用需要指定:spark.scheduler.mode=FAIR。

3.6 spark-config/其余 conf目录介绍目录介绍:

     其他目录都是基于spark-config/spark-submit目录如: thriftServer-config目录下除了用于Driver端的日志配置文件log4j.properties,其余文件都是链接了spark-submit下的文件;为了日志打印方便在log4j.properties设置了相应的文件打印位置:
log4j.appender.info.File=/appcom/logs/spark/thriftserver/${user.name}/sparkthriftserver-${user.name}.log

4、安装

     下面简单介绍下安装步骤:

4.1、Spark安装

  1. 拷贝相应的Spark安装包到/appcom/Install/SparkInstall,并解压;
    tar zvxf spark-2.1.1-bin-hadoop2.7.2.tar.gz -C /appcom/Install/SparkInstall/
  2. 建立软链接:/appcom/Install/spark 到刚刚解压的安装包文件夹;
    rm /appcom/Install/spark ;
    ln -s /appcom/Install/SparkInstall/spark-2.1.1-bin-hadoop2.7.2/ /appcom/Install/spark
  3. 解压spark-cmd到/appcom/Install/;
    tar zvxf spark-cmd.tar.gz -C /appcom/Install
  4. 拷贝spark-config到/appcom/config/;
    mv /appcom/config/spark-config /appcom/config/spark-config_bak
    tar zvxf spark-config.tar.gz -C /appcom/config/
  5. 修改环境变量,修改/appcom/config/目录下的env.sh增加Spark部分:
#Spark
export SPARK_HOME=/appcom/Install/spark
export SPARK_CONF_DIR=/appcom/config/spark-config/spark-submit
export SPARK_CMD=/appcom/Install/spark-cmd
#修改PATH
$SPARK_CMD/bin:$PATH
  1. 执行source ~/.bashrc 生效环境变量。
  2. 经过这几步后,Spark SQL CLI,spark-submit,shell等都可以使用,验证:
    spark-submit –version
    spark-sql -e "show tables;"
  3. 添加相关包:
    Kafka相关的包:spark-streaming-kafka-0-10-assembly_2.11-2.1.0.jar (相应版本);
    和Yarn冲突的Jersey相关的包:jersey-core-1.9.jar和jersey-client-1.9.jar。

4.2、ThriftServer安装

  1. 拷贝一份/appcom/Install/spark-cmd/ thriftServer下的模版启动文件;
  2. 将文件修改为:start-thriftserver-$user.sh的形式,并将所属和组改为相应用户;
  3. 切换到需要使用ThriftServer服务的用户下,修改相应的URL和端口等配置;
  4. 启动时切换到相应用户,执行启动文件:
    sh start-thriftserver-$user.sh
  5. 通过ps -elf | grep thrift 查看进程是否存在。

4.3、其他安装

  1. 主要是为了建立跟Hive-site.xml的软连接,在/appcom/config/spark-config每个目录下执行相应的建立软链接命令即可;
    ln -s /appcom/config/hive-config/hive-site.xml hive-site.xml

5、运行命令

     简单介绍下各组件的运行启动命令:
1、 提交SparkRDD,SparkStreaming等通过spark-submit进行提交
2、 CLI相关:spark-cmd/bin
- a) beeline:启动beeline;
- b) pyspark:启动PySpark的CLI
- c) sparkR:启动Spark R
- d) spark-shell:启动Spark的CLI
- e) spark-sql:启动spark-sql的CLI

3、 ThriftServer的启动步骤:spark-cmd/thriftServer
- a) 切换到相应用户:sudo su hadoop06
- b) 跳转到目录:cd /appcom/Install/spark-cmd/thriftserver/
- c) 执行相应的启动命令:sh start-thriftserver- hadoop.sh

4、 启动history-server:spark-cmd/sbin
- 运行./start-history-server.sh

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

标签:

分享到:

扫一扫在手机阅读

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:已经是最新的文章了

还没有评论,快来抢沙发!

电子邮件地址不会被公开。 必填项已用*标注

loading

johnnwang

人生得意须尽欢,莫使金樽空对月。