• 1. 数据分区-by 球哥
  • 2. 大数据学习网介绍我们的网址是:bigdatastudy.cn 我们提供专业的大数据学习视频,包括Hadoop,Spark,Storm,Mahout,机器学习等。 我们定价合理,让每个人都学得起大数据。
  • 3. 友情提示本系列课程主要由Learning.Spark这本书整理而来。 本系列课程主要目的,帮助想要学习Spark的同学入门。 本系列课程中的ppt可自由传播,无需任何授权,但不要用于商业用途哦。 本系列课程中的视频不要自由传播哦,如果同学们觉得课程价格不合理,欢迎在下面的群中反馈,我们会考虑调整价格的。 Spark学习交流群:368770186,371896553
  • 4. 数据分区数据分区 设计RDD的Partitioner
  • 5. 数据分区解决低效问题 我们知道userData 表比每五分钟的时间日志大很多,这浪费了很多工作。userData 每次调用的时候,都通过网络hashed和shuffled,尽管它不变化。 在userData使用partitionBy() 例子- 自定义 partitioner val sc = new SparkContext(...) val userData=sc.textFile("/home/spark/testfile/userData") .map(line=>(line.split(" ")(0),line.split(" ")(1))) .partitionBy(new HashPartitioner(100)) // 创建100 个数据分区 .persist()
  • 6. 数据分区当创建userData的时候,我们调用了partitionBy(),Spark知道它被hash-partitioned,当调用join()的时候,会充分利用这个信息。尤其,Data.join(events)的时候,Spark会只把events RDD shuffle,把events发送到包含相应userData的机器上去(userId相同)。 通常情况下,分区数至少和集群中内核数相等。 必须使用persist()方法,否则使用partitioned RDD的时候,会重新计算,相当于没有指定partitioner。
  • 7. 数据分区每次userData和events join的时候使用partitionBy()
  • 8. 数据分区事实上,许多其它的Spark操作都是自动的,使用已知的partitioning信息,返回一个RDD的。 许多不是join()的操作会充分利用partitioning信息。 例如,sortByKey()返回range-partitioned RDDs groupByKey()返回hash-partitioned RDDs
  • 9. 设计RDD的Partitioner例子: 设计一个RDD的partitioner scala> val pairs = sc.parallelize(List((1, 1), (2, 2), (3, 3))) scala> pairs.partitioner scala> val partitioned = pairs.partitionBy(new org.apache.spark.HashPartitioner(2)) scala>partitioned.persist() scala> partitioned.partitioner
  • 10. 内部使用了 Partitioner的方法使用了Partitioner的方法 cogroup(), groupWith(), join(), leftOuterJoin(), rightOuter Join(), groupByKey(), reduceByKey(), combineByKey(), and lookup(). 如果父RDD有partitioner下面的操作也会返回partitioner mapValues() flatMapValues() and filter() 如果有一个父RDD有Partitioner,那么Partitioner就是父RDD的Partitioner,如果两个父RDD都有,则是第一个的。
  • 11. 内部使用了 Partitioner的方法cogroup() 和join() 至少一个RDD(有已知Partitioner的RDD)不会被shuffle 如果两个RDDs有相同的Partitioner,并且数据在相同的机器上,或者有一个RDD还没有进行计算,那么两个RDDs都不会shuffle。
  • 12. 小结数据分区 设计RDD的Partitioner