Spark(一)

一、 Spark 概述

1、Spark 是什么

Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。

2、Spark and Hadoop

Hadoop:

  • Hadoop 是由 java 语言编写的,在分布式服务器集群上存储海量数据并运行分布式
    分析应用的开源框架
  • MapReduce 是一种编程模型,Hadoop 根据 Google 的 MapReduce 论文将其实现,
    作为 Hadoop 的分布式计算模型,是 Hadoop 的核心。基于这个框架,分布式并行
    程序的编写变得异常简单。综合了 HDFS 的分布式存储和 MapReduce 的分布式计
    算,Hadoop 在处理海量数据时,性能横向扩展变得非常容易
  • HBase 是对 Google 的 Bigtable 的开源实现,但又和 Bigtable 存在许多不同之处。
    HBase 是一个基于 HDFS 的分布式数据库,擅长实时地随机读/写超大规模数据集。
    它也是 Hadoop 非常重要的组件

Spark:

  • Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎
  • Spark Core 中提供了 Spark 最基础与最核心的功能
  • Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用
    SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据
  • Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的
    处理数据流的 API

Spark 和Hadoop 的根本差异是多个作业之间的数据通信问题 : Spark 多个作业之间数据
通信是基于内存,而 Hadoop 是基于磁盘

我们可以看出在绝大多数的数据计算场景中,Spark 确实会比 MapReduce
更有优势。但是 Spark 是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会
由于内存资源不够导致 Job 执行失败,此时,MapReduce 其实是一个更好的选择,所以 Spark
并不能完全替代 MR

3、Spark 核心模块

① Spark Core:

Spark Core 中提供了 Spark 最基础与最核心的功能,Spark 其他的功能如:Spark SQL,
Spark Streaming,GraphX, MLlib 都是在 Spark Core 的基础上进行扩展的

② Spark SQL:

Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用 SQL
或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据

③ Spark Streaming:

Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的处理
数据流的 API。

④ Spark MLlib:

MLlib 是 Spark 提供的一个机器学习算法库。MLlib 不仅提供了模型评估、数据导入等
额外的功能,还提供了一些更底层的机器学习原语

⑤ Spark GraphX:

GraphX 是 Spark 面向图计算提供的框架与算法库

二、Spark 快速上手

1、创建 Maven 项目

1.1、增加依赖关系

修改 Maven 项目中的 POM 文件,增加 Spark 框架的依赖关系。

<dependencies>
	 <dependency>
		 <groupId>org.apache.spark</groupId>
		 <artifactId>spark-core_2.12</artifactId>
		 <version>3.0.0</version>
	 </dependency>
</dependencies>

1.2、WordCount

object Spark01_WordCount {
   
  def main(args: Array[String]): Unit = {
   
    // Application
    // Spark框架

    // TODO 建立和Spark框架的连接
    // JDBC : Connection
    val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparConf)

    // TODO 执行业务操作
    // 1. 读取文件,获取一行一行的数据
    // hello world

    val lines:RDD[String] = sc.textFile("datas")

    // 2. 将一行的数据进行拆分,形成一个一个的单词(分词)
    // 扁平化操作:将整体拆分为个体的操作
    // “hello world” => hello,world,hello ,world
    val words: RDD[String] = lines.flatMap(_.split(" "))


    // 3. 将数据根据单词进行分组,便于统计
    // (hello,hello,hello),(world,world,world,world)
    val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word=>word)

    // 4. 对分组后的数组进行转换
    // (hello 3),(world 4)
    val wordToCount = wordGroup.map {
   
      case ( word,list) => {
   
        (word,list.size)
      }
    }

    // 5. 将转换结果采集到控制台打印出来
    val array: Array[(String, Int)] = wordToCount.collect()
    array.foreach(println)
    // TODO 关闭连接
    sc.stop()

  }

}

object Spark02_WordCount {
   
  def main(args: Array[String]): Unit = {
   
    // Application
    // Spark框架

    // TODO 建立和Spark框架的连接
    // JDBC : Connection
    val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparConf)

    // TODO 执行业务操作


    val lines:RDD[String] = sc.textFile("datas")

    val words: RDD[String] = lines.flatMap(_.split(" "))

    val wordToOne : RDD[(String, Int)] = words.map(
      word => (word, 1)
    )

    val wordGroup: RDD[(String, Iterable[(String, Int)])] = wordToOne.groupBy(
      t => t._1
    )

    val wordToCount = wordGroup.map {
   
      case ( word,list) => {
   
        list.reduce(
            (t1,t2) =>{
   
            (t1._1,t1._2+t2._2)
          }
        )
      }
    }

    // 5. 将转换结果采集到控制台打印出来
    val array: Array[(String, Int)] = wordToCount.collect()
    array.foreach(println)
    // TODO 关闭连接
    sc.stop()

  }

}

object Spark03_WordCount {
   
  def main(args: Array[String]): Unit = {
   
    // Application
    // Spark框架

    // TODO 建立和Spark框架的连接
    // JDBC : Connection
    val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
    val sc = new SparkContext(sparConf)

    // TODO 执行业务操作


    val lines:RDD[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值