一、案例分析:Spark RDD实现单词计数
(一)案例概述
单词计数是学习分布式计算的入门程序,有很多种实现方式,例如MapReduce;使用Spark提供的RDD算子可以更加轻松地实现单词计数。
在IntelliJ IDEA中新建Maven管理的Spark项目,并在该项目中使用Scala语言编写Spark的WordCount程序,最后将项目打包提交到Spark集群(Standalone模式)中运行。
(二)实现步骤
1、新建Maven管理的Spark项目
在IDEA中选择File→new→Project…,在弹出的窗口中选择左侧的Maven项,然后在右侧勾选Create fromarchetype复选框并选择下方出现的org.scala-tools.archetypes:scala-archetype-simple项(表示使用scala-archetype-simple模板构建Maven项目)。

在弹出的窗口中填写GroupId与ArtifactId,Version保持默认设置即可,然后单击Next按钮

在弹出的窗口中从本地系统选择Maven安装的主目录的路径、Maven的配置文件settings.xml的路径以及Maven仓库的路径,然后单击Next按钮

在弹出的窗口中项目名称为WordCount,就是先前设置的ArtifactId的值,当然也可以修改,然后单击Finish按钮

2、添加Scala和Spark依赖

  • 启动spark-shell,可以看到Spark2.4.4使用Scala2.11.12
  • 在pom.xml文件里添加Scala2.11.12和Spark 2.4.4依赖,添加Maven构建插件
  • <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/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>net.hw.spark</groupId>
      <artifactId>WordCount</artifactId>
      <version>1.0-SNAPSHOT</version>
      <inceptionYear>2008</inceptionYear>

    <dependencies>
        <dependency>
          <groupId>org.scala-lang</groupId>
          <artifactId>scala-library</artifactId>
          <version>2.11.12</version>
        </dependency>
        <dependency>
          <groupId>org.apache.spark</groupId>
          <artifactId>spark-core_2.12</artifactId>
          <version>2.4.4</version>
        </dependency>
      </dependencies>
      <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <!--设置Spark应用的入口类-->
                  <mainClass>net.hw.spark.WordCount</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version>3.3.2</version>
            <executions>
              <execution>
                <id>scala-compile-first</id>
                <phase>process-resources</phase>
                <goals>
                  <goal>add-source</goal>
                  <goal>compile</goal>
                </goals>
              </execution>
              <execution>
                <id>scala-test-compile</id>
                <phase>process-test-resources</phase>
                <goals>
                  <goal>testCompile</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>

    3、创建WordCount对象

  • net.hw.spark包里创建WordCount对象

package net.hw.spark

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

/**
  * 功能:统计单词个数
 
  */
object WordCount {
  def main(args: Array[String]): Unit = {
    // 创建SparkConf对象,存储应用程序配置信息
    val conf = new SparkConf()
      .setAppName("Spark-WordCount") // 设置应用程序名称,可在Spark WebUI中显示
      .setMaster("spark://master:7077") // 设置集群Master节点访问地址
     // 创建SparkContext对象,该对象是提交Spark应用程序的入口
    val sc = new SparkContext(conf)
    // 读取指定路径(程序执行时传入的第一个参数)的文件内容,生成一个RDD
    val rdd: RDD[String] = sc.textFile(args(0))
    // 对rdd进行处理
    rdd.flatMap(_.split(" ")) // 将RDD的每个元素按照空格进行拆分并将结果合并为一个新RDD
      .map((_, 1)) //将RDD中的每个单词和数字1放到一个元组里,即(word,1)
      .reduceByKey(_ + _) //对单词根据key进行聚合,对相同的key进行value的累加
      .sortBy(_._2, false) // 按照单词数量降序排列
      .saveAsTextFile(args(1))   //保存结果到指定的路径(取程序执行时传入的第二个参数)
    //停止SparkContext,结束该任务        
    sc.stop();
  }
}
4、对于程序代码进行解析
SparkConf对象的setMaster()方法用于设置Spark应用程序提交的URL地址。若是Standalone集群模式,则指Master节点的访问地址;若是本地(单机)模式,则需要将地址改为local或local[N]或local[*],分别指使用1个、N个和多个CPU核心数。本地模式可以直接在IDE中运行程序,不需要Spark集群。
此处也可不设置。若将其省略,则使用spark-submit提交该程序到集群时必须使用--master参数进行指定。
SparkContext对象用于初始化Spark应用程序运行所需要的核心组件,是整个Spark应用程序中很重要的一个对象。启动Spark Shell后默认创建的名为sc的对象即为该对象。
textFile()方法需要传入数据来源的路径。数据来源可以是外部的数据源(HDFS、S3等),也可以是本地文件系统(Windows或Linux系统),路径可以使用以下3种方式:
(1)文件路径:例如textFile("/input/data.txt "),此时将只读取指定的文件。
(2)目录路径:例如textFile("/input/words/"),此时将读取指定目录words下的所有文件,不包括子目录。
(3)路径包含通配符:例如textFile("/input/words/*.txt"),此时将读取words目录下的所有TXT文件。
该方法将读取的文件中的内容按行进行拆分并组成一个RDD集合。假设读取的文件为words.txt,则上述代码的具体数据转化流程如下图所示。

5、将Spark项目编译和打包

  • 展开IDEA右侧的Maven Projects窗口,双击其中的package项,将编写好的WordCount项目进行编译和打包
  • 生成两个jar包,一个没有带依赖,一个带了依赖,我们使用没有带依赖的jar包

6、上传Spark应用程序到master虚拟机

7、启动HDFS服务

8、启动Spark集群

9、上传单词文件到HDFS指定目录

上传到HDFS的/wordcount目录

10、执行WordCount程序
(1)提交应用程序到集群中运行
执行命令:spark-submit --master spark://master:7077 --class net.hw.spark.WordCount WordCount-1.0-SNAPSHOT.jar hdfs://master:9000/wordcount hdfs://master:9000/wordcount_output

(2)命令参数解析
–master:Spark Master节点的访问路径。由于在WordCount程序中已经通过setMaster()方法指定了该路径,因此该参数可以省略。
–class:SparkWordCount程序主类的访问全路径(包名.类名)。
hdfs://master:9000/wordcount:单词数据的来源路径。该路径下的所有文件都将参与统计。
hdfs://master:9000/wordcount_output:统计结果的输出路径。与MapReduce一样,该目录不应提前存在,Spark会自动创建。
(3)Spark WebUI界面查看应用程序信息
应用程序运行的过程中,可以访问Spark的WebUI http://master:8080/,查看正在运行的应用程序的状态信息(也可以查看已经完成的应用程序)

可以看到,有一个名称为Spark-WordCount的应用程序正在运行,该名称即为SparkWordCount程序中通过方法setAppName(“Spark-WordCount”)所设置的值。
在应用程序运行的过程中,也可以访问Spark的WebUI http://master:4040/,查看正在运行的Job(作业)的状态信息,包括作业ID、作业描述、作业已运行时长、作业已运行Stage数量、作业Stage总数、作业已运行Task任务数量等(当作业运行完毕后,该界面将不可访问)

单击矩形选框里的超链接,将跳转到作业详情页面,该页面显示了作业正在运行的Stage信息(Active Stages)和等待运行的Stage信息(Pending Stages),包括Stage ID、Stage描述、Stage提交时间、Stage已运行时长、Stage包括的Task任务数量、已运行的Task任务数量等

单击矩形选框里的超链接(DAG Visualization),可以查看本次作业的DAG可视图

11、查看程序执行结果

Spark基础学习笔记(1)相关推荐

  1. 2022年Spark基础学习笔记目录

    一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...

  2. Spark基础学习笔记16:创建RDD

    文章目录 零.本讲学习目标 一.RDD为何物 (一)RDD概念 (二)RDD示例 (三)RDD主要特征 二.做好准备工作 (一)准备文件 1.准备本地系统文件 2.准备HDFS系统文件 (二)启动Sp ...

  3. Spark基础学习笔记10:Scala集成开发环境

    文章目录 零.本讲学习目标 一.搭建Scala的Eclipse开发环境 (一)安装Scala插件 (二)创建Scala项目 二.搭建Scala的IntelliJ IDEA开发环境 (一)启动IDEA ...

  4. 2022年Spark基础学习笔记

    一.Spark学习笔记 在OpenStack私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建 ...

  5. Spark基础学习笔记04:搭建Spark伪分布式环境

    文章目录 零.本讲学习目标 一.搭建伪分布式Hadoop (一)登录ied虚拟机 (二)配置免密登录 1.生成密钥对 2.将生成的公钥发送到本机(虚拟机ied) 3.验证虚拟机是否能免密登录本机 (三 ...

  6. Spark基础学习笔记23:DataFrame与Dataset

    文章目录 零.本讲学习目标 一.Spark SQL (一)Spark SQL概述 (二)Spark SQL主要特点 1.将SQL查询与Spark应用程序无缝组合 2.Spark SQL以相同方式连接多 ...

  7. Spark基础学习笔记08:Scala简介与安装

    文章目录 零.本讲学习目标 一.Scala简介 (一)Scala概述 (二)函数式编程 (三)Scala特性 1.一切都是对象 2.一切都是函数 3.一切都是表达式 (四)在线运行Scala 二.选择 ...

  8. Spark基础学习笔记06:搭建Spark On YARN模式的集群

    文章目录 零.本讲学习目标 一.在Spark Standalone模式的集群基础上修改配置 二.运行Spark应用程序 (一)启动Hadoop的HDFS和YARN (二)运行Spark应用程序 (三) ...

  9. Spark基础学习笔记01:初步了解Spark

    文章目录 零.本讲学习目标 一.大数据开发总体架构 二.Spark简介 三.Spark发展史 四.Spark特点 (一)快速 (二)易用 (三)通用 (四)随处运行 (五)代码简洁 1.采用MR实现词 ...

  10. Spark基础学习笔记22:Spark RDD案例分析

    文章目录 零.本讲学习目标 一.案例分析:Spark RDD实现单词计数 (一)案例概述 (二)实现步骤 1.新建Maven管理的Spark项目 2.添加Scala和Spark依赖 3.创建WordC ...

最新文章

  1. ORA-25153: Temporary Tablespace is Empty
  2. mos管工作原理_筋膜枪原理与筋膜枪方案,和筋膜枪烧mos管原理。推荐使用mos管 AP15G04NF...
  3. flask+sqlite3+echarts2+ajax数据可视化--静态图
  4. cad lisp 二次抛物线_学习CAD的五个段位,你是青铜还是王者?
  5. 【转】1.7异步编程:基于事件的异步编程模式(EAP)
  6. 服务端自动集成-山寨版
  7. python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...
  8. nb-iot 华为云_海曼NB-IoT智慧消防解决方案通过华为云资格审核,正式入驻华为云市场...
  9. jmeter 能调用python吗_jmeter 执行python脚本的方法 。(亲测ok)
  10. 二范数-特征值的意义-矩阵范数-向量范数-
  11. 深度学习(00)——GPU版本的TensorFlow
  12. 红芯浏览器终于承认抄袭,研发内核到底有多难:2400万代码
  13. 如何复制百度文库内容?
  14. 计算机数值计算方法答案,数值计算方法习题解答.pdf
  15. android oppo 驱动,Android Studio无法连接OPPO
  16. 第七代i3核显linux驱动下载,i3-8100,装win7,集显uhd 630改版驱动完美安装
  17. 机器学习-马尔可夫模型与隐马尔可夫模型
  18. 【BST】Treap
  19. 马化腾:这个市场不是拼钱、拼流量,而是拼团队、拼使命感和危机感
  20. Android 贯穿Activity的全局变量定义

热门文章

  1. ESP32 Arduino DHT11温湿度
  2. Python Challenge 第2关
  3. 自然语言处理人名识别常用词典
  4. 毕业总结:工欲善其事 必先利其器(公开版)(更新中)
  5. vue制作3*3拼图
  6. ipv6单播地址包括哪两种类型_IPv6地址详解
  7. java logbook_SpringBoot使用Logbook记录HTTP请求响应日志
  8. 小米手机 全面屏 状态判断
  9. 【JS】制作注册页面
  10. 计算机应用基础自考综合题,计算机应用基础自考精选练习题