• Spark(二)CentOS7.5搭建Spark2.3.1分布式集群


    一 下载安装包

    1 官方下载

    官方下载地址:http://spark.apache.org/downloads.html

    2  安装前提

    注意:从Spark2.0版开始,默认使用Scala 2.11构建。Scala 2.10用户应该下载Spark源包并使用Scala 2.10支持构建 。

    3  集群规划

    节点名称  IP Zookeeper Master Worker
    node21 192.168.100.21
    Zookeeper
    主Master  
    node22 192.168.100.22
    Zookeeper
    备Master Worker
    node23 192.168.100.23
    Zookeeper
      Worker

     二 集群安装

    1  解压缩

    [admin@node21 software]$ tar zxvf spark-2.3.1-bin-hadoop2.7.tgz -C /opt/module/
    [admin@node21 module]$ mv spark-2.3.1-bin-hadoop2.7 spark-2.3.1

    2  修改配置文件

    (1)进入配置文件所在目录

    [admin@node21 ~]$ cd /opt/module/spark-2.3.1/conf/
    [admin@node21 conf]$ ll
    total 36
    -rw-rw-r-- 1 admin admin  996 Jun  2 04:49 docker.properties.template
    -rw-rw-r-- 1 admin admin 1105 Jun  2 04:49 fairscheduler.xml.template
    -rw-rw-r-- 1 admin admin 2025 Jun  2 04:49 log4j.properties.template
    -rw-rw-r-- 1 admin admin 7801 Jun  2 04:49 metrics.properties.template
    -rw-rw-r-- 1 admin admin  870 Jul  4 23:50 slaves.template 
    -rw-rw-r-- 1 admin admin 1292 Jun  2 04:49 spark-defaults.conf.template
    -rwxrwxr-x 1 admin admin 4861 Jul  5 00:25 spark-env.sh.template

    (2)复制spark-env.sh.template并重命名为spark-env.sh

    [admin@node21 conf]$ cp spark-env.sh.template spark-env.sh
    [admin@node21 conf]$ vi spark-env.sh

    编辑并在文件末尾添加如下配置内容

    #指定默认master的ip或主机名
    export SPARK_MASTER_HOST=node21  
    #指定maaster提交任务的默认端口为7077    
    export SPARK_MASTER_PORT=7077 
    #指定masster节点的webui端口       
    export SPARK_MASTER_WEBUI_PORT=8080 
    #每个worker从节点能够支配的内存数 
    export SPARK_WORKER_MEMORY=1g        
    #允许Spark应用程序在计算机上使用的核心总数(默认值:所有可用核心)
    export SPARK_WORKER_CORES=1    
    #每个worker从节点的实例(可选配置) 
    export SPARK_WORKER_INSTANCES=1   
    #指向包含Hadoop集群的(客户端)配置文件的目录,运行在Yarn上配置此项   
    export HADOOP_CONF_DIR=/opt/module/hadoop-2.7.6/etc/hadoop
    #指定整个集群状态是通过zookeeper来维护的,包括集群恢复
    export SPARK_DAEMON_JAVA_OPTS="      
    -Dspark.deploy.recoveryMode=ZOOKEEPER 
    -Dspark.deploy.zookeeper.url=node21:2181,node22:2181,node23:2181
    -Dspark.deploy.zookeeper.dir=/spark"

    (3)复制slaves.template成slaves,并修改配置内容

    [admin@node21 conf]$ cp slaves.template slaves
    [admin@node21 conf]$ vi slaves

    修改从节点

    node22
    node23

    (4)将安装包分发给其他节点

    [admin@node21 module]$ scp -r spark-2.3.1 admin@node22:/opt/module/
    [admin@node21 module]$ scp -r spark-2.3.1 admin@node23:/opt/module/

    修改node22节点上conf/spark-env.sh配置的MasterIP为SPARK_MASTER_IP=node22

    3  配置环境变量

    所有节点均要配置

    [admin@node21 spark-2.3.1]$ sudo vi /etc/profile
    export  SPARK_HOME=/opt/module/spark-2.3.1
    export  PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
    [admin@node21 spark-2.3.1]$ source /etc/profile

    三 启动集群

    1 启动zookeeper集群

    所有zookeeper节点均要执行

    [admin@node21 ~]$ zkServer.sh start

    2 启动Hadoop集群

    [admin@node21 ~]$ start-dfs.sh
    [admin@node22 ~]$ start-yarn.sh
    [admin@node23 ~]$ yarn-daemon.sh start resourcemanager

    3 启动Spark集群

    启动spark:启动master节点:sbin/start-master.sh 启动worker节点:sbin/start-slaves.sh

    或者:sbin/start-all.sh

    [admin@node21 spark-2.3.1]$ sbin/start-all.sh
    starting org.apache.spark.deploy.master.Master, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.master.Master-1-node21.out
    node22: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node22.out
    node23: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node23.out

    注意:备用master节点需要手动启动

    [admin@node22 spark-2.3.1]$ sbin/start-master.sh 
    starting org.apache.spark.deploy.master.Master, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.master.Master-1-node22.out

    4 查看进程

    [admin@node21 spark-2.3.1]$ jps
    1316 QuorumPeerMain
    3205 Jps
    3110 Master
    1577 DataNode
    1977 DFSZKFailoverController
    1788 JournalNode
    2124 NodeManager
    
    [admin@node22 spark-2.3.1]$ jps
    1089 QuorumPeerMain
    1233 DataNode
    1617 ResourceManager
    1159 NameNode
    1319 JournalNode
    1735 NodeManager
    3991 Master
    4090 Jps
    1435 DFSZKFailoverController
    3918 Worker
    
    [admin@node23 spark-2.3.1]$ jps
    1584 ResourceManager
    1089 QuorumPeerMain
    1241 JournalNode
    2411 Worker
    1164 DataNode
    1388 NodeManager
    2478 Jps

    四 验证集群HA

    1 看Web页面Master状态

    node21是ALIVE状态,node22为STANDBY状态,WebUI查看:http://node21:8080/

    从节点连接地址:http://node22:8081/

    2 验证HA的高可用

    手动干掉node21上面的Master进程,node21:8080无法访问,node22:8080状态如下,Master状态成功自动进行切换。

     

    3 HA注意点 

    • 主备切换过程中不能提交Application。
    • 主备切换过程中不影响已经在集群中运行的Application。因为Spark是粗粒度资源调度。

    集群提交命令方式

    Standalone模式

    1.1 Standalone-client

    (1)提交命令

    [admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi 
     --master spark://node21:7077 
     --executor-memory 500m 
     --total-executor-cores 1 
     examples/jars/spark-examples_2.11-2.3.1.jar 10

    或者

    [admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi 
     --master spark://node21:7077 
     --deploy-mode client 
     --executor-memory 500m 
     --total-executor-cores 1 
     examples/jars/spark-examples_2.11-2.3.1.jar 10

    (2)提交原理图解

     (3)执行流程

    1. client模式提交任务后,会在客户端启动Driver进程。
    2. Driver会向Master申请启动Application启动的资源。
    3. 资源申请成功,Driver端将task发送到worker端执行。
    4. worker将task执行结果返回到Driver端。

    (4)总结

    client模式适用于测试调试程序。Driver进程是在客户端启动的,这里的客户端就是指提交应用程序的当前节点。在Driver端可以看到task执行的情况。生产环境下不能使用client模式,是因为:假设要提交100个application到集群运行,Driver每次都会在client端启动,那么就会导致客户端100次网卡流量暴增的问题。

    1.2 Standalone-cluster

    (1)提交命令

    [admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi 
     --master spark://node21:7077 
     --deploy-mode cluster 
     examples/jars/spark-examples_2.11-2.3.1.jar 10

    (2)提交原理图解

    (3)执行流程

    1. cluster模式提交应用程序后,会向Master请求启动Driver.
    2. Master接受请求,随机在集群一台节点启动Driver进程。
    3. Driver启动后为当前的应用程序申请资源。
    4. Driver端发送task到worker节点上执行。
    5. worker将执行情况和执行结果返回给Driver端。

    (4)总结

    Driver进程是在集群某一台Worker上启动的,在客户端是无法查看task的执行情况的。假设要提交100个application到集群运行,每次Driver会随机在集群中某一台Worker上启动,那么这100次网卡流量暴增的问题就散布在集群上。

    2 Yarn模式

    2.1 yarn-client

    (1)提交命令

    client模式启动Spark应用程序:

    $ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode client [options] <app jar> [app options]

    例如

    [admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi 
     --master yarn  
     --deploy-mode client  
     examples/jars/spark-examples_2.11-2.3.1.jar 10

    (2)提交原理图解

    (3)执行流程

    1. 客户端提交一个Application,在客户端启动一个Driver进程。
    2. 应用程序启动后会向RS(ResourceManager)发送请求,启动AM(ApplicationMaster)的资源。
    3. RS收到请求,随机选择一台NM(NodeManager)启动AM。这里的NM相当于Standalone中的Worker节点。
    4. AM启动后,会向RS请求一批container资源,用于启动Executor.
    5. RS会找到一批NM返回给AM,用于启动Executor。
    6. AM会向NM发送命令启动Executor。
    7. Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端。

    (4)总结

    Yarn-client模式同样是适用于测试,因为Driver运行在本地,Driver会与yarn集群中的Executor进行大量的通信,会造成客户机网卡流量的大量增加.

     ApplicationMaster的作用:

    1. 为当前的Application申请资源
    2. NodeManager发送消息启动Executor。

    注意:ApplicationMaster有launchExecutor和申请资源的功能,并没有作业调度的功能。

    2.2 yarn-cluster

    (1)提交命令

    cluster模式启动Spark应用程序:

    $ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]

    例如

    [admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi 
     --master yarn  
     --deploy-mode cluster  
     examples/jars/spark-examples_2.11-2.3.1.jar 10

    (2)提交原理图解

     

    (3)执行流程

    1. 客户机提交Application应用程序,发送请求到RS(ResourceManager),请求启动AM(ApplicationMaster)。
    2. RS收到请求后随机在一台NM(NodeManager)上启动AM(相当于Driver端)。
    3. AM启动,AM发送请求到RS,请求一批container用于启动Executor。
    4. RS返回一批NM节点给AM。
    5. AM连接到NM,发送请求到NM启动Executor。
    6. Executor反向注册到AM所在的节点的Driver。Driver发送task到Executor。

    (4)总结

    Yarn-Cluster主要用于生产环境中,因为Driver运行在Yarn集群中某一台nodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过yarn查看日志。

    ApplicationMaster的作用:

    1. 为当前的Application申请资源
    2. NodeManager发送消息启动Excutor。
    3. 任务调度。

    停止集群任务命令:yarn application -kill applicationID

    六 配置历史服务器

    1 临时配置

    对本次提交的应用程序起作用

    ./spark-shell --master spark://node21:7077 
    --name myapp1
    --conf spark.eventLog.enabled=true
    --conf spark.eventLog.dir=hdfs://node21:8020/spark/test

    停止程序,在Web Ui中Completed Applications对应的ApplicationID中能查看history。

    2  永久配置

    spark-default.conf配置文件中配置HistoryServer,对所有提交的Application都起作用

    在客户端节点,进入../spark-2.3.1/conf/ spark-defaults.conf最后加入:

    //开启记录事件日志的功能
    spark.eventLog.enabled          true
    //设置事件日志存储的目录
    spark.eventLog.dir              hdfs://node21:8020/spark/test
    //设置HistoryServer加载事件日志的位置
    spark.history.fs.logDirectory   hdfs://node21:8020/spark/test
    //日志优化选项,压缩日志
    spark.eventLog.compress         true

    启动HistoryServer:

    ./start-history-server.sh

    访问HistoryServer:node21:18080,之后所有提交的应用程序运行状况都会被记录。

    七 故障问题

    1 Worker节点无法启动

    [admin@node21 spark-2.3.1]$ sbin/start-all.sh 
    starting org.apache.spark.deploy.master.Master, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.master.Master-1-node21.out
    node23: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node23.out
    node22: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node22.out
    node23: failed to launch: nice -n 0 /opt/module/spark-2.3.1/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 --port 7078 spark://node21:7077
    node23: full log in /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node23.out
    node22: failed to launch: nice -n 0 /opt/module/spark-2.3.1/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 --port 7078 spark://node21:7077
    node22: full log in /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node22.out

    由于之前在conf/spark-env.sh里配置了如下信息

    #每个worker从节点的端口(可选配置)       
    export SPARK_WORKER_PORT=7078       
    #每个worker从节点的wwebui端口(可选配置)  
    export SPARK_WORKER_WEBUI_PORT=8081 

    可能是由于端口问题去掉上述两项配置,重启成功。

    2 启动Spark on YARN报错

    2.1  Caused by: java.net.ConnectException: Connection refused

    [admin@node21 spark-2.3.1]$ spark-shell --master yarn --deploy-mode client

    报错原因:内存资源给的过小,yarn直接kill掉进程,则报rpc连接失败、ClosedChannelException等错误。

    解决方法:先停止YARN服务,然后修改yarn-site.xml,增加如下内容

    <!--是否将对容器强制实施虚拟内存限制 -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <!--设置容器的内存限制时虚拟内存与物理内存之间的比率 -->
    <property>
         <name>yarn.nodemanager.vmem-pmem-ratio</name>
         <value>4</value>
    </property>   

    将新的yarn-site.xml文件分发到其他Hadoop节点对应的目录下,最后在重新启动YARN。 

    重新执行以下命令启动spark on yarn,启动成功

    2.2  java.lang.ClassNotFoundException: org.apache.spark.examples.SparkPi

    [admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi 
    >  --master yarn  
    >  --deploy-mode client  
    >  examples/jars/spark-examples_2.11-2.3.1.jar 10

    报错信息如下:

    2018-07-13 05:19:14 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    java.lang.ClassNotFoundException: org.apache.spark.examples.SparkPi
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:851)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
    2018-07-13 05:19:15 INFO  ShutdownHookManager:54 - Shutdown hook called
    2018-07-13 05:19:15 INFO  ShutdownHookManager:54 - Deleting directory /tmp/spark-d0c9c44a-40bc-4220-958c-c2f976361d64

    解决方法:

  • 相关阅读:
    Java阶段测试题一
    HttpClient配置及运用(一)
    字符串数组及链表的应用:例题
    Java多线程
    String普通方法测试;可变参数
    Java连接mysql数据库
    JS练习
    foreach遍历、包装类、Object类
    Java多态总结
    类的关联,不同类属性的调用
  • 原文地址:https://www.cnblogs.com/frankdeng/p/9294812.html
Copyright © 2020-2023  润新知