• 【spark】spark-2.4.4的安装与测试


    4.2.1 下载并安装spark


    下载文件名:spark-2.4.4-bin-without-hadoop.tgz

    [hadoop@hadoop01 ~]$ tar -zxvf spark-2.4.4-bin-without-hadoop.tgz


    4.2.2 配置linux环境变量

    [hadoop@hadoop01 ~]$ gedit ~/.bash_profile
    [hadoop@hadoop01 ~]$ source ~/.bash_profile
    新加入:
    #spark
    export SPARK_HOME=/home/hadoop/spark-2.4.4-bin-without-hadoop
    export PATH=$PATH:$SPARK_HOME/bin


    4.2.3 配置spark-env.sh变量环境

    [hadoop@hadoop01 conf]$ cp spark-env.sh.template spark-env.sh
    [hadoop@hadoop01 conf]$ gedit spark-env.sh
    加入:
    export JAVA_HOME=/usr/java/jdk1.8.0_131
    export SCALA_HOME=/home/hadoop/scala-2.13.1
    export SPARK_MASTER_IP=192.168.1.100
    export HADOOP_HOME=/home/hadoop/hadoop-3.2.0
    export HADOOP_CONF_DIR=/home/hadoop/hadoop-3.2.0/etc/hadoop
    export SPARK_DIST_CLASSPATH=$(/home/hadoop/hadoop-3.2.0/bin/hadoop classpath) #不添加,就会报错

    注:因为我们下载是不带hadoop依赖jar的spark版本,所以需要在spark配置中指定hadoop的classpath

    配置文件spark-env.sh:
    ### in conf/spark-env.sh ###
    
    # If 'hadoop' binary is on your PATH
    export SPARK_DIST_CLASSPATH=$(hadoop classpath)
    
    # With explicit path to 'hadoop' binary
    export SPARK_DIST_CLASSPATH=$(/path/to/hadoop/bin/hadoop classpath)
    
    # Passing a Hadoop configuration directory
    export SPARK_DIST_CLASSPATH=$(hadoop --config /path/to/configs classpath)

    4.2.4 修改slaves文件

    [hadoop@hadoop01 conf]$ cp slaves.template slaves
    [hadoop@hadoop01 conf]$ gedit slaves
    加入:
    hadoop02
    hadoop03


    4.2.5 拷贝到其他节点
    scp -r ~/spark-2.4.4-bin-without-hadoop hadoop02:~/
    scp -r ~/spark-2.4.4-bin-without-hadoop hadoop03:~/

    4.2.6 启动spark

    4.2.6.1 直接启动

    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ sbin/start-all.sh
    第一次启动报错:
    进程显示:failed to launch: nice -n 0 /home/hadoop/spark-2.4.4-bin-without-hadoop/bin/spark-class org.apache.spark.deploy.master.Master --host hadoop01 --port 7077 --webui-port 808
    查看spark目录下logs:
    Spark Command: /usr/java/jdk1.8.0_131/bin/java -cp /home/hadoop/spark-2.4.4-bin-without-hadoop/conf/:/home/hadoop/spark-2.4.4-bin-without-hadoop/jars/*:/home/hadoop/hadoop-3.2.0/etc/hadoop/ -Xmx1g org.apache.spark.deploy.master.Master --host hadoop01 --port 7077 --webui-port 8080
    ========================================
    Error: A JNI error has occurred, please check your installation and try again
    Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        at java.lang.Class.getMethod0(Class.java:3018)
        at java.lang.Class.getMethod(Class.java:1784)
        at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
    Caused by: java.lang.ClassNotFoundException: org.slf4j.Logger
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 7 more

    解决办法:在spark-env.sh末尾添加“export SPARK_DIST_CLASSPATH=$(/home/hadoop/hadoop-3.2.0/bin/hadoop classpath)”

    再次启动spark:

    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ sbin/start-all.sh
    starting org.apache.spark.deploy.master.Master, logging to /home/hadoop/spark-2.4.4-bin-without-hadoop/logs/spark-hadoop-org.apache.spark.deploy.master.Master-1-hadoop01.out
    hadoop03: starting org.apache.spark.deploy.worker.Worker, logging to /home/hadoop/spark-2.4.4-bin-without-hadoop/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-hadoop03.out
    hadoop02: starting org.apache.spark.deploy.worker.Worker, logging to /home/hadoop/spark-2.4.4-bin-without-hadoop/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-hadoop02.out
    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ jps
    29200 NodeManager
    28595 DataNode
    29059 ResourceManager
    28804 SecondaryNameNode
    30564 Master
    28424 NameNode
    30777 Jps
    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ ssh hadoop02
    Last login: Wed Oct  2 11:21:48 2019 from hadoop01
    [hadoop@hadoop02 ~]$ jps
    19905 Worker
    20098 Jps
    18922 DataNode
    19054 NodeManager
    [hadoop@hadoop02 ~]$ ssh hadoop03
    Last login: Tue Oct  1 15:58:07 2019 from hadoop02
    [hadoop@hadoop03 ~]$ jps
    18896 Jps
    17699 DataNode
    17829 NodeManager
    18694 Worker


    注1:通过jps看见三个节点有Master和Worker的进程,其中Master是spark的主控进程
    注2:另外需要注意的是spark的启动命令与hadoop的一样,所以启动hadoop和spark的时候需要明确指定目录,如:hadoop-3.2.0/sbin/start-all.sh 或者spark2.4.4/sbin/start-all.sh

    4.2.6.2 通过spark提供的web接口查看系统状态,各节点都可以:
    http://http://192.168.1.100:8080/
    http://http://192.168.1.101:8081/
    http://http://192.168.1.102:8081/


    4.2.7 停止spark

    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ sbin/stop-all.sh
    hadoop02: stopping org.apache.spark.deploy.worker.Worker
    hadoop03: stopping org.apache.spark.deploy.worker.Worker
    stopping org.apache.spark.deploy.master.Master
    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ jps
    29200 NodeManager
    28595 DataNode
    29059 ResourceManager
    28804 SecondaryNameNode
    28424 NameNode
    31112 Jps


    4.2.8 spark的简单使用

    4.2.8.1 执行示例程序
    在 ./examples/src/main 目录下有一些 Spark 的示例程序,有 Scala、Java、Python、R 等语言的版本。我们可以先运行一个示例程序 SparkPi(即计算 π 的近似值),执行如下命令:
    注:执行时会输出非常多的运行信息,输出结果不容易找到,可以通过 grep 命令进行过滤(命令中的 2>&1 可以将所有的信息都输出到 stdout 中,否则由于输出日志的性质,还是会输出到屏幕中):

    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ ./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"
    Pi is roughly 3.135075675378377

    Python 版本的 SparkPi, 则需要通过 spark-submit 运行:

    [hadoop@hadoop01 spark-2.4.4-bin-without-hadoop]$ ./bin/spark-submit examples/src/main/python/pi.py 2>&1 | grep "Pi is roughly"
    Pi is roughly 3.144580


    4.2.8.2 进入shell模式:

    [hadoop@hadoop01 jars]$ spark-shell
    2019-10-02 21:05:49,292 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Setting default log level to "WARN".
    To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
    Spark context Web UI available at http://hadoop01:4040
    Spark context available as 'sc' (master = local[*], app id = local-1570021558420).
    Spark session available as 'spark'.
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _ / _ / _ `/ __/  '_/
       /___/ .__/\_,_/_/ /_/\_   version 2.4.4
          /_/
             
    Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_131)
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> 


    附:

    【转】Spark集群三种部署模式的区别

    Spark最主要资源管理方式按排名为Hadoop Yarn, Apache Standalone 和Mesos。在单机使用时,Spark还可以采用最基本的local模式。

    目前Apache Spark支持三种分布式部署方式,分别是standalone、spark on mesos和 spark on YARN,其中,第一种类似于MapReduce 1.0所采用的模式,内部实现了容错性和资源管理,后两种则是未来发展的趋势,部分容错性和资源管理交由统一的资源管理系统完成:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架,比如MapReduce,公用一个集群资源,最大的好处是降低运维成本和提高资源利用率(资源按需分配)。本文将介绍这三种部署方式,并比较其优缺点。


    1. Standalone模式

    即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。从一定程度上说,该模式是其他两种的基础。借鉴Spark开发模式,我们可以得到一种开发新型计算框架的一般思路:先设计出它的standalone模式,为了快速开发,起初不需要考虑服务(比如master/slave)的容错性,之后再开发相应的wrapper,将stanlone模式下的服务原封不动的部署到资源管理系统yarn或者mesos上,由资源管理系统负责服务本身的容错。目前Spark在standalone模式下是没有任何单点故障问题的,这是借助zookeeper实现的,思想类似于Hbase master单点故障解决方案。将Spark standalone与MapReduce比较,会发现它们两个在架构上是完全一致的:
    1)  都是由master/slaves服务组成的,且起初master均存在单点故障,后来均通过zookeeper解决(Apache MRv1的JobTracker仍存在单点问题,但CDH版本得到了解决);
    2) 各个节点上的资源被抽象成粗粒度的slot,有多少slot就能同时运行多少task。不同的是,MapReduce将slot分为map slot和reduce slot,它们分别只能供Map Task和Reduce Task使用,而不能共享,这是MapReduce资源利率低效的原因之一,而Spark则更优化一些,它不区分slot类型,只有一种slot,可以供各种类型的Task使用,这种方式可以提高资源利用率,但是不够灵活,不能为不同类型的Task定制slot资源。总之,这两种方式各有优缺点。
     

    2. Spark On Mesos模式

    这是很多公司采用的模式,官方推荐这种模式(当然,原因之一是血缘关系)。正是由于Spark开发之初就考虑到支持Mesos,因此,目前而言,Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。目前在Spark On Mesos环境中,用户可选择两种调度模式之一运行自己的应用程序(可参考Andrew Xia的“Mesos Scheduling Mode on Spark”):
    1)   粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。举个例子,比如你提交应用程序时,指定使用5个executor运行你的应用程序,每个executor占用5GB内存和5个CPU,每个executor内部设置了5个slot,则Mesos需要先为executor分配资源并启动它们,之后开始调度任务。另外,在程序运行过程中,mesos的master和slave并不知道executor内部各个task的运行情况,executor直接将任务状态通过内部的通信机制汇报给Driver,从一定程度上可以认为,每个应用程序利用mesos搭建了一个虚拟集群自己使用。

    2)   细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。与粗粒度模式一样,应用程序启动时,先会启动executor,但每个executor占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos会为每个executor动态分配资源,每分配一些,便可以运行一个新任务,单个Task运行完之后可以马上释放对应的资源。每个Task会汇报状态给Mesos slave和Mesos Master,便于更加细粒度管理和容错,这种调度模式类似于MapReduce调度模式,每个Task完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。


    3. Spark On YARN模式

    这是一种很有前景的部署模式。但限于YARN自身的发展,目前仅支持粗粒度模式(Coarse-grained Mode)。这是由于YARN上的Container资源是不可以动态伸缩的,一旦Container启动之后,可使用的资源不能再发生变化,不过这个已经在YARN计划中了。
    spark on yarn 的支持两种模式:
    1) yarn-cluster:适用于生产环境;
    2) yarn-client:适用于交互、调试,希望立即看到app的输出

    yarn-cluster和yarn-client的区别在于yarn appMaster,每个yarn app实例有一个appMaster进程,是为app启动的第一个container;负责从ResourceManager请求资源,获取到资源后,告诉NodeManager为其启动container。yarn-cluster和yarn-client模式内部实现还是有很大的区别。如果你需要用于生产环境,那么请选择yarn-cluster;而如果你仅仅是Debug程序,可以选择yarn-client。


    总结:
    这三种分布式部署方式各有利弊,通常需要根据实际情况决定采用哪种方案。进行方案选择时,往往要考虑公司的技术路线(采用Hadoop生态系统还是其他生态系统)、相关技术人才储备等。上面涉及到Spark的许多部署模式,究竟哪种模式好这个很难说,需要根据你的需求,如果你只是测试Spark Application,你可以选择local模式。而如果你数据量不是很多,Standalone 是个不错的选择。当你需要统一管理集群资源(Hadoop、Spark等),那么你可以选择Yarn或者mesos,但是这样维护成本就会变高。
    · 从对比上看,mesos似乎是Spark更好的选择,也是被官方推荐的
    · 但如果你同时运行hadoop和Spark,从兼容性上考虑,Yarn是更好的选择。 · 如果你不仅运行了hadoop,spark。还在资源管理上运行了docker,Mesos更加通用。
    · Standalone对于小规模计算集群更适合!

  • 相关阅读:
    Java:多线程
    javascript:正则表达式、一个表单验证的例子
    DOM对象和window对象
    javascript:面向对象和常见内置对象及操作
    如何检查CentOS服务器受到DDOS攻击
    CentOS防SYN攻击
    CentOS服务器简单判断CC攻击的命令
    在VMware中为CentOS配置静态ip并可访问网络
    安全运维之:网络实时流量监测工具iftop
    安全运维之:网络实时流量监测工具iftop
  • 原文地址:https://www.cnblogs.com/CQ-LQJ/p/11618541.html
Copyright © 2020-2023  润新知