SSSSSSSSSpark-core

一起重新开始学大数据-spark

在这里插入图片描述

什么是spark?


  Apache Spark is an open source cluster computing system that aims to make data analytics fast

  both fast to run and fast to wrtie

官网http://spark.apache.org/

为什么用spark:

Speed(速度快)
Run workloads 100x faster.

Apache Spark achieves high performance for both batch and streaming data, using a state-of-the-art DAG scheduler, a query optimizer, and a physical execution engine.
在这里插入图片描述

Ease of Use(好用)
Write applications quickly in Java, Scala, Python, R, and SQL.

Spark offers over 80 high-level operators that make it easy to build parallel apps. And you can use it interactively from the Scala, Python, R, and SQL shells.

Generality(简单,类SQL)
Combine SQL, streaming, and complex analytics.

Spark powers a stack of libraries including SQL and DataFrames, MLlib for machine learning, GraphX, and Spark Streaming. You can combine these libraries seamlessly in the same application.

Runs Everywhere(可以运行在多个平台)
Spark runs on Hadoop, Apache Mesos, Kubernetes, standalone, or in the cloud. It can access diverse data sources.
You can run Spark using its standalone cluster mode, on EC2, on Hadoop YARN, on Mesos, or on Kubernetes. Access data in HDFS, Alluxio, Apache Cassandra, Apache HBase, Apache Hive, and hundreds of other data sources.

BDAS

The Berkeley Data Analytics Stack

在这里插入图片描述

Why is Hadoop slower than Spark?

在这里插入图片描述
在这里插入图片描述

Through which modes to run Spark

有4种模式

Local------多用于测试

Standalonel

Mesosl

YARNl--------最具前景


RDD


RDD

Resilient Distributed Dataset弹性分布式数据集)

RDD五大特性

1、RDD由一组分区组成
(A list of partitions )
2、算子实际上是作用在每一个分区上的每一个切片对应一个task
(A function for computing each split )
3、RDD之间由一系列的依赖关系,有shuffle (宽依赖),没有shuffle(窄依赖)
(A list of dependencies on other RDDs )
4、ByKey类的算子只能作用在kv格式的rdd上 (reduceByKey ,groupByKey , sortByKey)
(Optionally, a Partitioner for key-value RDDs )
5、spark为task的计算提供了最佳计算位置,移动计算而不是移动数据,spark会尽量将task发送到数据所在的节点执行
(Optionally, a list of preferred locations to compute each split o)

举例:WordCount
模式为本地模式,所以本机需要Hadoop环境,且需要在bin目录下存在winutils.exe

bject Demo1WordCount {
  def main(args: Array[String]): Unit = {
    /**
      * 1、创建spark上下文对象
      *
      */
    //环境配置对象
    val conf = new SparkConf()
    //指定任务名
    conf.setAppName("wc")
    //执行运行方式
    conf.setMaster("local")

    //创建spark 环境,式写spark代码的入口
    val sc = new SparkContext(conf)
    /**
      * 统计单词数量
      * RDD: 弹性的分布式数据集(可以当成一个scala的集合使用)
      */

    //1、读取文件
    val linesRDD: RDD[String] = sc.textFile("data/words")


    //将每一行中的单词拆分出来
    val wordsRDD: RDD[String] = linesRDD.flatMap(line => line.split(","))

    //将数据转换成kv格式

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

    /**
      * reduceByKey: 对同一个key的value进行聚合计算
      * reduceByKey 会在map端进行预聚和
      * 当rdd是一个kv格式的时候,saprk会通过隐式转换动态增加reduceByKey方法
      *
      */

    //统计单词的数量
    val countRDD: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y)

    //整理数据
    val resultRDD: RDD[String] = countRDD.map(kv => {
      val word: String = kv._1
      val count: Int = kv._2

      word + "," + count
    })
    //打印数据
    resultRDD.foreach(println)
    //保存数据
    resultRDD.saveAsTextFile("data/wc")
  }
}


图解:
在这里插入图片描述

常用算子


Transformation

TransformationMeaning
map(func)返回一个新的分布式数据集,通过函数传递源的分布式数据集。
filter(func)返回一个通过选择func返回true的源代码的那些元素而形成的新数据集。
flatMap(func)类似于映射,但是每个输入项都可以映射到0个或多个输出项(因此func应该返回一个Seq,而不是单个项)。
mapPartitions(func)类似于映射,但它在RDD的每个分区(块)上单独运行,因此当func在T类型的RDD上运行时,func必须是迭代器=>迭代器类型。
mapPartitionsWithIndex(func)类似于映射分区,但也提供func表示分区索引的整数值,因此func在T类型的RDD上运行时,func必须是类型(Int、迭代器)=>迭代器
sample(withReplacement, fraction, seed)使用给定的随机数生成器种子采样是否替换数据。
union(otherDataset)返回一个数据集中包含源数据集中元素与参数联合的新数据集。
intersection(otherDataset)返回一个包含源数据集中元素与参数的交集的新RDD。
distinct([numPartitions]))返回一个包含源数据集的不同元素的新数据集。
groupByKey([numPartitions])当调用(K、V)对的数据集时,返回(K、可迭代的)对的数据集。注意:如果要分组以便对每个键执行聚合(如和或平均值),则使用还原ByKey或聚合ByKey将产生更好的性能。注意:默认情况下,输出中的并行性级别取决于父RDD的分区数量。您可以传递一个可选的数字分区参数来设置不同数量的任务。
reduceByKey(func, [numPartitions])当调用(K、V)对的数据集时,返回(K、V)对的数据集,其中使用给定的减少函数函数聚合,它必须是类型(V、V)=>V。与组BypKey一样,减少任务的数量可以通过可选的第二个参数进行配置。
aggregateByKey(zeroValue)(seqOp, combOp, [numPartitions])当调用一个(K、V)对的数据集时,返回一个(K、U)对的数据集,其中每个键的值使用给定的组合函数和一个中性的“零”值进行聚合。允许与输入值类型不同的聚合值类型,同时避免不必要的分配。与在组ByKey中一样,减少任务的数量可以通过可选的第二个参数进行配置。
sortByKey([ascending], [numPartitions])当调用K实现Ordend的(K、V)对数据集时,返回按升序、降序排序的数据集,如布尔升序参数中指定的那样。
join(otherDataset, [numPartitions])当调用类型为(K、V)和(K、W)的数据集时,返回(K、(V、W))对的数据集,其中包含每个键的所有元素对。外部连接通过左外连接、右外连接和完全外连接得到支持。
cogroup(otherDataset, [numPartitions])当调用类型为(K、V)和(K、W)的数据集时,返回一个(K,(可迭代,可迭代))元组的数据集。此操作也称为“组与”。
cartesian(otherDataset)当调用类型为T和U的数据集时,将返回一个(T、U)对(所有元素对)的数据集。
pipe(command, [envVars])通过一个shell命令管道RDD的每个分区,例如Pell或bash脚本。RDD元素被写入进程的静态输出,行输出到其静态输出将作为字符串的RDD返回。
coalesce(numPartitions)将RDD中的分区数减少为数字分区。这对于在过滤掉大型数据集后更有效地运行操作非常有用。
repartition(numPartitions)随机调整RDD中的数据,以创建更多或更少的分区,并在它们之间进行平衡。这总是会打乱网络上的所有数据。
repartitionAndSortWithinPartitions(partitioner)根据给定的分区器重新划分RDD,并在每个结果分区中,按其键对记录进行排序。这比调用重新分区,然后在每个分区内进行排序更有效,因为它可以将排序向下推到洗牌机制中。

Actions

ActionMeaning
reduce(func)使用一个函数func(它需要两个参数并返回一个参数)来收集数据集的元素。该函数应该是交换的和关联的,以便它可以正确地并行计算。
collect()在驱动程序中返回数据集的所有元素作为数组。这通常在过滤器或返回足够小的数据子集的其他操作之后很有用。
count()返回数据集中的元素的数量。
first()返回数据集的第一个元素(similar to take(1)).
take(n)返回一个包含数据集的前n个元素的数组。
takeSample(withReplacement, num, [seed])返回一个包含数据集的随机样本的数组,有或没有替换,可选择预先指定一个随机数生成器种子。
takeOrdered(n, [ordering])使用RDD的自然顺序或自定义比较器返回该RDD的前n个元素。
saveAsTextFile(path)将数据集的元素写入文本文件(或文本文件集),放在本地文件系统、HDFS或任何其他hadoop支持的文件系统的给定目录中。Spark将调用每个元素上的String,以将其转换为文件中的一行文本。
saveAsSequenceFile(path)(Java and Scala)在本地文件系统、HDFS或任何其他受hadoop支持的文件系统中,将数据集的元素写入给定路径中的hadoop序列文件。这可以在实现Hadoop可写接口的键值对的rdd上使用。在Scala中,它也可以用于隐式转换为可写的类型(Spark包括对内部类型、双类型、字符串等基本类型的转换)。
saveAsObjectFile(path) (Java and Scala)使用Java序列化以简单的格式编写数据集的元素,然后可以使用SparkContext.objectFile()加载该元素。 cuntByKey()
foreach(func)在数据集的每个元素上运行一个函数func。这通常是为了产生副作用,如更新存储器或与外部存储系统交互。注意:修改预测()之外的累积器之外的变量可能会导致未定义的行为。有关更多详细信息,请参见了解闭包。






  

在这里插入图片描述

键,下

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的动作太慢了!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值