spark-運算元-分割槽運算元
partitionBy
val inputRDD = sc.parallelize(Array[(Int,Char)] ((1, 'a'),(2,'b'),(3,'C') (4,'d'),(2,'e'),(3,'f'),(2,'g'),(1, 'h')),3)
val resultRDD = inputRDD.partitionBy(new HashPartitioner (2))//使用HashPartitioner重新分割槽
val resultRDD = inputRDD.partitionBy(new RangePartitioner(2,inputRDD))//使用RangePartitioner重新分割槽
同repartition區別,partitionBy是根據partitioner,而repartition是隨機策略,不能指定partitioner
coalesce
用來改變分割槽數,根據隨機生成的key,使用隨機策略均勻的分佈資料,只能傳入分割槽數,不能指定partitioner
val sc = new SparkContext()
val inputRDD = sc.parallelize(Array[(Int, Char)]((3, 'c'), (3, 'f'), (1, 'a'), (4, 'd'), (1, 'h'), (2, 'b'), (5, 'e'), (2, 'g')), 5)
var coalesceRDD = inputRDD.coalesce(2) //圖3.19中的第1個圖
coalesceRDD = inputRDD.coalesce(6) //圖3.19中的第2個圖
coalesceRDD = inputRDD.coalesce(2, true) // 圖3.19中的第3個圖
coalesceRDD = inputRDD.coalesce(6, true) //圖3.19中的第4個圖
- 減少分割槽個數
如圖319中的第1個圖所示,rdd1的分割槽個數為5,當使用coalesce(2)減少為兩個分割槽時,spark會將相鄰的分割槽直接合並在一起,得到rdd2,形成的資料依賴關係是多對一的NarrowDependency.這種方法的缺點是,當rdd1中不同分割槽中的資料量差別較大時,直接合並容易造成資料傾斜(rdd2中某些分割槽資料量過多或過少) - 增加分割槽個數
如圖3.19中的第2個圖所示,當使用coalesce(6)將rdd1的分割槽個數增加為6時,會發現生成的rdd2的分割槽個數並沒有增加,還是5。這是因為coalesce()預設使用NarrowDependency,不能將一個分割槽拆分為多份。 - 使用Shuffle來減少分割槽個數:
如圖3.19中的第3個圖所示,為了解決資料傾斜的問題,我們可以使用coalesce(2, Shuffle = true)來減少RDD的分割槽個數。使用Shuffle = true後,Spark隨機
將資料打亂,從而使得生成的RDD中每個分割槽中的資料比較均衡。具體採用的方法是為rdd1中的每個record新增一個特殊的Key,如第3個圖中的MapPartitionsRDD,Key是 Int型別,並從[0, numPartitions)中隨機生成
,如<3,f >=><2,(3,f)>中,2是隨機生成的Key,接下來的record的Key遞增1,如<1,a> =><3,(1,a)>。這樣,Spark可以根據Key的 Hash值將rdd1中的資料分發到rdd2的不同的分割槽中,然後去掉Key即可(見最後的 MapPartitionsRDD)。 - 使用Shuffle來增加分割槽個數:
如圖3.19 中的第4個圖所示,通過使用ShuffeDepedency,可以對分割槽進行拆分和充足,解決分割槽個數不能增加的問題。
repartition = coalesce(numPartitions,true)
相關文章
- spark RDD textFile運算元 分割槽數量詳解Spark
- 運算元
- 使用運算元控制公式運算公式
- Python 影像處理 OpenCV (12): Roberts 運算元、 Prewitt 運算元、 Sobel 運算元和 Laplacian 運算元邊緣檢測技術PythonOpenCV
- Spark運算元:統計RDD分割槽中的元素及數量Spark
- RDD運算元
- 【Spark篇】---SparkStreaming中運算元中OutPutOperator類運算元Spark
- 運算元據庫
- python運算元據Python
- JavaScript運算元組JavaScript
- 運算元據庫表
- MySQL DML運算元據MySql
- jmeter運算元據庫JMeter
- DDL:運算元據庫
- onnx 運算元定義
- 什麼是運算元?
- Flink -- Operator操作運算元
- SIFT運算元總結
- Spark常用Transformations運算元(一)SparkORM
- Python運算元據庫(3)Python
- Oracle OCP(10):運算元據Oracle
- sobel運算元,matlab實現Matlab
- 3.0 常見operators運算元
- js 方法(運算元組為主JS
- 利用 Sequelize 來運算元據庫
- spark一些常用運算元Spark
- Ascend C 自定義PRelu運算元
- 三元運算+包機制
- 深入淺出PyTorch(運算元篇)PyTorch
- Spark RDD運算元(八)mapPartitions, mapPartitionsWithIndexSparkAPPIndex
- Ascend C運算元開發指南
- Flink - 運算元鏈合併方法
- python中Laplacian運算元如何使用Python
- java 運算元據庫備份Java
- Python學習:運算元據庫Python
- Python 影像處理 OpenCV (13): Scharr 運算元和 LOG 運算元邊緣檢測技術PythonOpenCV
- 影像濾波演算法整理--均值、中值、高斯、拉普拉斯運算元、梯度運算元:演算法梯度
- 遺傳演算法的改進——跳出區域性最優機制的研究(選擇運算元、交叉運算元、變異運算元的改進)演算法