wordCountRDD(笔记十)

wordCountRDD流程

1.首先我们都会这样子执行(wordCount执行在hadoop中)

val rdd = sc.textFile(“hdfs://weekday01:9000/wc”).flatMap(.split(" ")).map((,1)).reduceByKey(+)

rdd.saveAsTextFile(“hdfs://weekday01:9000/out”)

2.内部实现细节

1.textFile会产生两个RDD,1.HadoopRDD,为什么第一个是HadoopRDD,因为我们需要在hadoop里面读取数据,

读取数据的时候是以(key,value)的形式读取数据,其中的可以是偏移量,而value是一行的数据,

2.MapPartitionsRDD,以为我们调用了map方法,而这其中的map的作用是把key取消掉了,从而我们把value取出来

2.xxx.flatMap,则这个产生一个RDD,即MapPartionsRDD,

3.map((_,1)),这个是读取每一行的数据,然后在对每一行进行操作,然后在生成一个MapPartitionsRDD,

经过这个RDD之后,这个里面装的都是(key,value)类型的数据

4.reduceByKey,这个里面new了一个ShuffleRDD,要进行聚合,这个会经历两次聚合,第一聚合是在这个分区里面,

当聚合完成之后,从上游拉下来,在进行总体的聚合,这就是所谓的先分区,在总体

5…saveAsTextFile(path:String),因为这个的操作是往hdfs写数据,所以我们需要拿到hdfs的流,不过如果我们用map的话,

就相当于我的每一条数据我都会拿一个流,这样浪费资源,所以此时的我,使用的是mapPartition(),则此时是拿取一个分区里

面的数据,我们拿一个流,把这一个分区的数据都写进去

综上所述,一共产生了6个RDD

/**
  * Created by root on 2016/5/14.
  */
object WordCount {
  def main(args: Array[String]) {
    //非常重要,是通向Spark集群的入口
    val conf = new SparkConf().setAppName("WC")
      .setJars(Array("C:\\HelloSpark\\target\\hello-spark-1.0.jar"))
      .setMaster("spark://node-1.itcast.cn:7077")
    val sc = new SparkContext(conf)

    //textFile会产生两个RDD:HadoopRDD  -> MapPartitinsRDD
    sc.textFile(args(0)).cache()
      // 产生一个RDD :MapPartitinsRDD
      .flatMap(_.split(" "))
      //产生一个RDD MapPartitionsRDD
      .map((_, 1))
      //产生一个RDD ShuffledRDD
      .reduceByKey(_+_)
      //产生一个RDD: mapPartitions
      .saveAsTextFile(args(1))
    sc.stop()
  }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值