wqy1027

eeee

 

Spark概述,安装,以及四种运行方式

Spark

Apache Spark是一个开源集群计算系统,旨在使数据分析更快

 

 

 

Hadoop的共享数据为什么慢?

 

Spark的共享数据快

 

 

Spark支持三种语言,scala、python、java

 

可以通过四种模式运行Spark

1、Local(多用于测试)

2、Standalone

3、Mesos

4.YARN

 

1.Local

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>bigdata19-project</artifactId>
        <groupId>com.shujia</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>bigdata19-spark</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <scala.version>2.11.12</scala.version>
        <spark.version>2.4.5</spark.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-compiler</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-reflect</artifactId>
            <version>${scala.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>${spark.version}</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <!-- Scala Compiler -->
            <plugin>
                <groupId>org.scala-tools</groupId>
                <artifactId>maven-scala-plugin</artifactId>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

 

sparkwordCount代码

package com.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo01WorkCount {
  def main(args: Array[String]): Unit = {
    //构建spark的上下文环境
    //创建SparkConf
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo01WorkCount")
    conf.setMaster("local")//设置spark的运行方式
    //构建spark的上下文环境
    val sc: SparkContext = new SparkContext(conf)

    //1、加载数据
    /**
     * RDD : 弹性分布式数据集
     * 使用起来同List类似,但它不是List
     * 是Spark提供的编程模型,不管基于RDD做任何转换操作,最终都会得到一个RDD
     */
    val linesRDD: RDD[String] = sc.textFile("bigdata19-spark/data/words.txt")
    println(linesRDD.getNumPartitions)

    //2、将每一行的每个单词进行切分 并且扁平化处理
    val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(","))
    println(linesRDD.getNumPartitions)

    //3、按照每个单词进行分组
    /**
     * Iterable 跟 List 最大的区别在于
     * List中的数据是完全加载到内存中的
     * Iterable中的数据只有在需要的时候才会加载
     */
    val grpRDD: RDD[(String, Iterable[String])] = wordsRDD.groupBy(word => word)

    //4、统计每个单词的数量
    val wordCntRDD: RDD[String] = grpRDD.map(kv => s"${kv._1},${kv._2.size}")

    //5.将结果保存到文件中
    wordCntRDD.saveAsTextFile("bigdata19-spark/data/wc")

    while(true){

    }

  }

}

 

运行之前需要在电脑上配置环境变量

随便一个目录

 

 

 

RDD五大特性

 

 

在Linux安装Spark

1、Standalone模式

  • 1、上传解压

    tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /usr/local/soft
    mv spark-2.4.5-bin-hadoop2.7 spark-2.4.5
  • 2、修改配置文件 (在spark-2.4.5/conf中)

    # 重命名文件
    cp spark-env.sh.template spark-env.sh
    cp slaves.template slaves

    增加配置vim spark-env.sh

    master相当于RM worker相当于NM

    export SPARK_MASTER_IP=master
    export SPARK_MASTER_PORT=7077
    export SPARK_WORKER_CORES=2
    export SPARK_WORKER_INSTANCES=1
    export SPARK_WORKER_MEMORY=2g
    export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

    增加从节点配置vim slaves

    以node1、node2作为从节点

    node1
    node2
  • 3、复制到其它节点

    cd /usr/local/soft/
    scp -r spark-2.4.5 node1:`pwd`
    scp -r spark-2.4.5 node2:`pwd`
  • 4、配置环境变量

  • 5、在主节点执行启动命令

    注意:start-all.sh 与Hadoop的sbin目录中的启动命令有冲突

    cd /usr/local/soft/spark-2.4.5/
    ./sbin/start-all.sh
  • 6、访问Spark Web UI

    http://master:8080/
  • 7、测试及使用

    切换目录cd /usr/local/soft/spark-2.4.5/examples/jars

    standalone client模式 :日志在本地输出,一般用于上线前测试

    • 提交自带的SparkPi任务

      spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512m --total-executor-cores 1 spark-examples_2.11-2.4.5.jar 100

    standalone cluster模式:上线使用,不会在本地打印日志

    • 提交自带的SparkPi任务

      spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512M --total-executor-cores 1 --deploy-mode cluster spark-examples_2.11-2.4.5.jar 100
  • 8、其他运行方式

    • spark-shell spark 提供的一个交互式的命令行,可以直接写代码

      spark-shell master spark://master:7077

2、On Yarn模式(常用)

在公司一般不适用standalone模式

因为公司一般已经有yarn 不需要搞两个资源管理框架

Spark整合yarn只需要在一个节点整合, 可以删除node1 和node2中所有的Spark 文件

  • 1、停止Spark Standalone模式集群

    # 切换目录
    cd /usr/local/soft/spark-2.4.5/
    # 停止集群
    ./sbin/stop-all.sh
  • 2、增加hadoop 配置文件地址

    vim spark-env.sh
    # 增加HADOOP_CONF_DIR
    export HADOOP_CONF_DIR=/usr/local/soft/hadoop-2.7.6/etc/hadoop
  • 3、关闭Yarn

    stop-yarn.sh
  • 4、修改Yarn配置

    cd /usr/local/soft/hadoop-2.7.6/etc/hadoop/
    vim yarn-site.xml

    # 加入如下配置
      <property>
          <name>yarn.nodemanager.pmem-check-enabled</name>
          <value>false</value>
      </property>

      <property>
          <name>yarn.nodemanager.vmem-check-enabled</name>
          <value>false</value>
      </property>
  • 5、同步到其他节点

    scp -r yarn-site.xml node1:`pwd`
    scp -r yarn-site.xml node2:`pwd`
  • 6、启动Yarn

    start-yarn.sh
  • 7、测试及使用

    切换目录cd /usr/local/soft/spark-2.4.5/examples/jars

    Spark on Yarn Client模式:日志在本地输出,一班用于上线前测试

    • 提交自带的SparkPi任务

      spark-submit --class org.apache.spark.examples.SparkPi --master yarn-client --executor-memory 512M --num-executors 2 spark-examples_2.11-2.4.5.jar 100

    Spark on Yarn Cluster模式:上线使用,不会在本地打印日志

    • 提交自带的SparkPi任务

      spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster --executor-memory 512m --num-executors 2 --executor-cores 1 spark-examples_2.11-2.4.5.jar 100
    • 获取yarn程序执行日志 执行成功之后才能获取到

      yarn logs -applicationId application_1652086375126_0002
  • 8、开启Spark On Yarn的WEB UI

    修改配置文件

    # 切换目录
    cd /usr/local/soft/spark-2.4.5/conf

    # 去除后缀
    cp spark-defaults.conf.template spark-defaults.conf

    # 修改spark-defaults.conf
    vim spark-defaults.conf

    # 加入以下配置
    spark.eventLog.enabled true
    spark.eventLog.dir     hdfs://master:9000/user/spark/applicationHistory
    spark.yarn.historyServer.address       master:18080
    spark.eventLog.compress true
    spark.history.fs.logDirectory   hdfs://master:9000/user/spark/applicationHistory
    spark.history.retainedApplications     15

    创建HDFS目录用于存储Spark History日志

    hdfs dfs -mkdir -p /user/spark/applicationHistory

    启动Spark History Server

    cd /usr/local/soft/spark-2.4.5/
    ./sbin/start-history-server.sh

 

idea提交到yarn上

代码

package com.core

import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo02WordCountOnYarn {
  /**
   * 将代码提交到Yarn上运行
   * 1、将setMaster代码注释,使用提交命令设置运行方式
   * 2、修改输入输出路径,并准备数据
   * 3、打包上传至服务器
   * 4、使用spark-submit命令提交任务
   *
   * spark-submit --master yarn-client --class com.core.Demo02WordCountOnYarn bigdata19-spark-1.0-SNAPSHOT.jar
   * spark-submit --master yarn-cluster --class com.core.Demo02WordCountOnYarn bigdata19-spark-1.0-SNAPSHOT.jar
   *
   */
  def main(args: Array[String]): Unit = {
    // 创建SparkConf
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo02WordCountOnYarn")
    //    conf.setMaster("local") // 设置Spark的运行方式
    // 构建Spark的上下文环境
    val sc: SparkContext = new SparkContext(conf)

    // 1、加载数据
    /**
     * RDD : 弹性分布式数据集
     * 使用起来同List类似,但它不是List
     * 是Spark提供的编程模型,不管基于RDD做任何转换操作,最终都会得到一个RDD
     */
    val linesRDD: RDD[String] = sc.textFile("/spark/input")

    println(linesRDD.getNumPartitions)
    // 2、将每一行的每个单词进行切分 并且扁平化处理
    val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(","))
    println(linesRDD.getNumPartitions)

    // 3、按照每个单词进行分组
    /**
     * Iterable 跟 List 最大的区别在于
     * List中的数据是完全加载到内存中的
     * Iterable中的数据只有在需要的时候才会加载
     */
    val grpRDD: RDD[(String, Iterable[String])] = wordsRDD.groupBy(word => word)

    // 4、统计每个单词的数量
    val wordCntRDD: RDD[String] = grpRDD.map(kv => s"${kv._1},${kv._2.size}")

    /**
     * 使用HDFS的JAVA API来对输出目录进行删除,避免重复运行时出现目录已存在的问题
     */
    val fs: FileSystem = FileSystem.get(sc.hadoopConfiguration)
    val outputPath: Path = new Path("/spark/output01")
    if (fs.exists(outputPath)) {
      fs.delete(outputPath, true)
    }
    // 5、将结果保存到文件中
    wordCntRDD.saveAsTextFile("/spark/output01")

  }

}

 

yarn-client模式

yarn-cluster模式

 

两种方式的区别在于driver启动的位置不同,AM既负责资源申请又负责任务申请 

 

posted on 2022-10-24 16:43  不想写代码的小玉  阅读(154)  评论(0编辑  收藏  举报

导航