spark系列-1、spark介绍 & wordcount

一、spark介绍

1.1、spark的特点

  • 运行速度快:使用DAG(全称 Directed Acyclic Graph, 中文为:有向无环图)执行引擎以支持循环数据流与内存计算(当然也有部分计算基于磁盘,比如shuffle)
  • 易用性好:支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell进行交互式编程
  • 通用性强:Spark提供了完整而强大的工具,包括SQL查询、流式计算、机器学习和图算法组件
  • 随处运行:可运行于独立的集群模式中,可运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源

1.2、对比hadoop

解决问题的出发点不一样

  • Hadoop用普通硬件解决存储和计算问题
  • Spark用于构建大型的、低延迟的数据处理及分析应用程序,不实现存储
  • Spark是在借鉴了MapReduce之上发展而来的,继承了其分布式并行计算的优点并改进了MapReduce明显的缺陷
  • Spark中间数据放到内存中,迭代运算效率高
  • Spark引进了弹性分布式数据集的抽象,数据对象既可以放在内存,也可以放在磁盘,容错性高,可用自动重建。
  • RDD计算时可以通过CheckPoint来实现容错
  • Hadoop只提供了Map和Reduce操作,Spark更加通用,提供的数据集操作类型有很多种,主要分为: Transformations(返回下一个RDD)和Actions(返回unit、产生动作如下载 打印)两大类

1.3、spark vs mapreduce

优点:

  • shuffle对比,不用等,用的时候再排序
    • MapReduce排序原因:硬盘按照顺序读取快,随机读取慢;
    • MapReduce中reduce拉取数据的时间较长,拉取完才能进行reduce计算
    • spark可以按照任务需求进行选择性排序(内存随机读无影响),也不需要等待数据拉取完(防止内存爆,来了就消化达到平衡状态)
  • 会的招式多,各种算子方便你处理数据
  • 可以把多次使用的数据放到内存中(MapReduce是放在磁盘中)

 缺点:

  • 过度依赖内存,内存不够用了就很难堪

 二、Wordcount

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.8</version>
        </dependency>
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * @author xiandongxie
  */
object WordCount {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf()
    conf.setMaster("local[*]")
      .setAppName("wordCount")
    val context: SparkContext = new SparkContext(conf)

    val sourceRDD: RDD[String] = context.parallelize(
      List(
        "a b c d e",
        "a b c d",
        "a b c",
        "a b",
        "a")
    )
    val wordCountRDD: RDD[(String, Int)] = sourceRDD.flatMap(f => f.split(" "))
      .map((_, 1))
      .reduceByKey(_ + _)
    wordCountRDD.foreach(f => {
      println(f)
    })
  }
}

 

posted @ 2020-05-02 00:46  abc十号  阅读(317)  评论(0)    收藏  举报