分享

请教spark RDD计算

本帖最后由 SuperDove 于 2017-2-22 16:19 编辑

原贴为Spark SQL 统计分析案例介绍
现截出部分代码
[mw_shl_code=applescript,true]val spark = SparkSession.builder().appName("count201702211631").getOrCreate()
      val txtrdd = spark.sparkContext.textFile("hdfs://master:8020/tmp/download/peoplecount.txt",10)
      val rowRdd = txtrdd.map(x => x.split("\t")).map(x => Row(x(0),x(1),x(2).toInt))
      rowRdd.cache()
      println("cache................")
      val schema = StructType(
        Seq(
          StructField("id",StringType,true)
          ,StructField("sex",StringType,true)
          ,StructField("hight",IntegerType,true)
        )
      )
      val peopleDF = spark.createDataFrame(rowRdd,schema)

      //正式创建people表
      peopleDF.createOrReplaceTempView("people")

      println("计算所有人数")
      spark.sparkContext.parallelize(Array(txtrdd.count())).saveAsTextFile("hdfs://master:8020/tmp/download/allcount")
      println("1.男性中身高超过 180cm 的人数。")
      spark.sql(
        """
          |select count(*) as total2
          |  from people
          | where sex = 'M'
          |   and hight > 180
        """.stripMargin).repartition(1).write.json("hdfs://master:8020/tmp/download/M180")
      println("2.女性中身高超过 170cm 的人数。")
      spark.sql(
        """
          |select count(*) as total3
          |  from people
          | where sex = 'F'
          |   and hight > 170
        """.stripMargin).repartition(1).write.json("hdfs://master:8020/tmp/download/M170")[/mw_shl_code]

    提交到spark的standlone模式下运行    结果运行的jobs任务在UI下如下,一共有四个JOB

sparj-jobs

sparj-jobs

    但是详细进入到每个job下的stage下的task界面时,发现数据都是以ANY的形式加载读取进来的,如下

task

task

          话说spark是用的内存计算的,一个rdd被加载之后应该不会重新再加载,也就是JOB2和JOB3的rdd数据应该不是以ANY的形式加载,而是PROCESS_LOCAL的模式加载啊
难道我对spark 的 RDD做内存计算有误解?有哪位能帮忙点通一下,请指教!



已有(6)人评论

跳转到指定楼层
qcbb001 发表于 2017-2-22 17:07:26
其实这个代表task 的计算节点和 task 的输入数据的节点位置关系

  • PROCESS_LOCAL: 数据在同一个 JVM 中,即同一个 executor 上。这是最佳数据 locality。
  • NODE_LOCAL: 数据在同一个节点上。比如数据在同一个节点的另一个 executor上;或在 HDFS 上,恰好有 block 在同一个节点上。速度比 PROCESS_LOCAL 稍慢,因为数据需要在不同进程之间传递或从文件中读取
  • NO_PREF: 数据从哪里访问都一样快,不需要位置优先
  • RACK_LOCAL: 数据在同一机架的不同节点上。需要通过网络传输数据及文件 IO,比 NODE_LOCAL 慢
  • ANY: 数据在非同一机架的网络上,速度最慢

回复

使用道具 举报

qcbb001 发表于 2017-2-22 17:12:32
其实说白了,就是楼主的数据和跑任务的节点不在一个节点上,导致任务的输入数据要跑到别的节点上取数据
回复

使用道具 举报

SuperDove 发表于 2017-2-22 18:45:53
回复

使用道具 举报

langke93 发表于 2017-2-22 21:49:42
SuperDove 发表于 2017-2-22 18:45
按照你说的,我在节点slave1处用sbin/spark-submit提交了作业spark-submit --master spark://master:7077 ...

这个跟在哪提交没有关系的。
关键是任务分配在什么地方,跑任务的地方跟数据的关系。
而不是在哪提交,任务就跑在哪台机器。所以关键还是跑任务与数据的机器是否一台。
楼主有一个错误的认识,就是我在那台机器上提交,任务就会跑在哪台。其实你在哪提交是无所谓的事情。
所以还是需要从配置入手。将数据本地化,也就是任何和数据同时在一台机器上。
回复

使用道具 举报

leletuo2012 发表于 2017-2-23 13:22:45
提交在哪
任务在哪跑
数据在哪
这几个关系分清楚
回复

使用道具 举报

ledasion 发表于 2017-2-28 11:28:01
学习了  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条