从零开始学习Spark环境搭建简单Demo

Posted 小周编程日记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始学习Spark环境搭建简单Demo相关的知识,希望对你有一定的参考价值。

零基础从bilibili学习,是尚硅谷的Spark公开教程教程地址:https://www.bilibili.com/video/BV11A411L7CK?p=11&spm_id_from=pageDriver本文分为三块介绍:1.Spark简介 2.Spark环境搭建 3.第一个Demo:WordCount


(一)Spark和Hadoop的区别

Hadoop job之间是通过磁盘,趋向于一次计算,出现较早,有HBase作为数据库 Spark是通过内存,趋向于实时计算,基于内存,出现比Hadoop晚一点,没有数据库两者都是大数据框架


(二)环境搭建

  1. Spark主流使用Scala开发,IDEA需要安装Scala插件
  2. 官方网站下载scala包
  3. 引入Spark的Maven依赖
一、安装IDEA插件


二、下载Scala包
  1. 下载的是2.12.13版本

    从零开始学习Spark(一)环境搭建、简单Demo

  2. 通过Project导入下载好的包

三、引入maven依赖
<dependencies>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.12</artifactId>
        <version>3.0.0</version>
    </dependency>
</dependencies>

三)WordCount样例学习

给两个文件,文件内有字符串文本,要求对字符串分隔出单词,然后聚合统计每个单词出现的次数

方法一、基础方法
  1. 读取文件,读出数据行
  2. 分词,对数据行分成一个个单词
  3. 分组,将相同单词分到同一组
  4. 转换,计算出同一组的数目
  5. 打印
object Spark01_WordCount {

  def main(args: Array[String]): Unit = {

    // 1. 建立和Spark框架的连接
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparkConf)
    // 2. 执行业务操作

    // 2.1 读取文件,数据行读取
    val lines: RDD[String] = sc.textFile(path = "datas/*")
    // 2.2 分词 扁平化:将整体拆分成个体
    val words: RDD[String] = lines.flatMap(_.split(" "))
    // 2.3 分组
    val wordGroup: RDD[(StringIterable[String])] = words.groupBy(word => word)
    // 2.4 转换
    val wordToCount = wordGroup.map {
      case (word, list) => {
        (word, list.size)
      }
    }
    // 2.5 采集到控制台
    val array: Array[(StringInt)] = wordToCount.collect()
    array.foreach(println)
    // 3. 关闭连接
    sc.stop()
  }
}
方法二、利用聚合思想,提前对于每一个词设定统计值为1
  1. 读取文件,读出数据行
  2. 分词,对数据行分成一个个单词
  3. 初始化,对每一个单词,初始化值为1
  4. 分组,将相同单词分到同一组
  5. 转换,归并求和
  6. 打印
object Spark02_WordCount {

  def main(args: Array[String]): Unit = {

    // 1. 建立和Spark框架的连接
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparkConf)
    // 2. 执行业务操作

    // 2.1 读取文件,数据行读取
    val lines: RDD[String] = sc.textFile(path = "datas/*")
    // 2.2 分词 扁平化:将整体拆分成个体
    val words: RDD[String] = lines.flatMap(_.split(" "))

    // 2.3 初始化
    val wordToOne = words.map(
      word => (word, 1)
    )
    // 2.4 分组
    val wordGroup: RDD[(StringIterable[(StringInt)])] = wordToOne.groupBy(t => t._1)

    // 2.5 转换
    val wordToCount = wordGroup.map {
      case (word, list) => {
        list.reduce(
          (t1, t2) => {
            (t1._1, t1._2 + t2._2)
          }
        )
      }
    }
    // 2.6 采集到控制台
    val array: Array[(StringInt)] = wordToCount.collect()
    array.foreach(println)
    // 3. 关闭连接
    sc.stop()
  }
}
方法三、使用Spark的API,分组聚合函数(reduceByKey)
  1. 读取文件,读出数据行
  2. 分词,对数据行分成一个个单词
  3. 初始化,对每一个单词,初始化值为1
  4. 分组聚合,将相同单词分到同一组
  5. 打印


object Spark03_WordCount {

  def main(args: Array[String]): Unit = {

    // 1. 建立和Spark框架的连接
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparkConf)
    // 2. 执行业务操作

    // 2.1 读取文件,数据行读取
    val lines: RDD[String] = sc.textFile(path = "datas/*")
    // 2.2 分词 扁平化:将整体拆分成个体
    val words: RDD[String] = lines.flatMap(_.split(" "))

    // 2.3 初始化
    val wordToOne = words.map(
      word => (word, 1)
    )

    // 2.4
    // Spark:分组和聚合可以使用一个方法实现——reduceByKey:相同的key,可以对value进行reduce聚合
    // 自简原则 如果参数只被使用一次,可以使用下划线代替
    val wordToCount: RDD[(StringInt)] = wordToOne.reduceByKey(_ + _)

    // 2.5 采集到控制台
    val array: Array[(StringInt)] = wordToCount.collect()
    array.foreach(println)
    // 3. 关闭连接
    sc.stop()
  }
}


以上是关于从零开始学习Spark环境搭建简单Demo的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis学习1:从零开始搭建Mybatis环境

《从零开始搭建游戏服务器》项目发布到Linux环境

(原创)cocos lua 热更新从零开始最简单demo

mybatis学习笔记 -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)

30分钟从零搭建hadoop+spark伪分布式环境

SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程附源代码Demo