国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于MapReduce的Hive數(shù)據(jù)傾斜場景以及解決方案

這篇具有很好參考價(jià)值的文章主要介紹了基于MapReduce的Hive數(shù)據(jù)傾斜場景以及解決方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1 Hive數(shù)據(jù)傾斜的現(xiàn)象

通常認(rèn)為當(dāng)所有的map task全部完成,并且99%的reduce task完成,只剩下一個(gè)或者少數(shù)幾個(gè)reduce task一直在執(zhí)行,這種情況下一般都是發(fā)生了數(shù)據(jù)傾斜。

即為在整個(gè)計(jì)算過程中,大量相同的key被分配到了同一個(gè)reduce任務(wù)上造成。Hive的數(shù)據(jù)傾斜本質(zhì)上是MapReduce計(jì)算引擎的數(shù)據(jù)傾斜,一般來說容易發(fā)生在reduce階段,map階段的數(shù)據(jù)傾斜多是由于HDFS存儲(chǔ)數(shù)據(jù)文件源的問題,reduce階段則多是開發(fā)過程中程序員引起,需要通過手段進(jìn)行優(yōu)化。

本文僅討論基于MR引擎的Hive數(shù)據(jù)傾斜現(xiàn)象,另外Spark、Flink中的數(shù)據(jù)傾斜擇日再論。

1.1 Hive數(shù)據(jù)傾斜的場景

Hive數(shù)據(jù)傾斜是指在數(shù)據(jù)分布中存在不均勻的情況,業(yè)務(wù)問題或者業(yè)務(wù)數(shù)據(jù)本身的問題,某些數(shù)據(jù)比較集中,導(dǎo)致某些節(jié)點(diǎn)或分區(qū)上的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)大于其他節(jié)點(diǎn)或分區(qū),從而影響查詢性能和任務(wù)的均衡執(zhí)行,尤其是join。以下是一些可能導(dǎo)致Hive數(shù)據(jù)傾斜的場景:

  1. 連接操作中的鍵值傾斜:在進(jìn)行join連接操作時(shí),如果連接的鍵存在不均勻分布、數(shù)據(jù)類型不一致,會(huì)導(dǎo)致某些鍵對(duì)應(yīng)的數(shù)據(jù)量遠(yuǎn)大于其他鍵,造成傾斜。表中作為關(guān)聯(lián)條件的字段值為0或空值的較多,會(huì)造成shuffle時(shí)進(jìn)入到一個(gè)reduce任務(wù)中。為什么是空值?因?yàn)榭罩翟诟鶕?jù)hash計(jì)算分區(qū)時(shí),會(huì)在內(nèi)存中被視為同樣的hash,進(jìn)而被放入一個(gè)分區(qū)進(jìn)行計(jì)算。

  2. 分桶表和分區(qū)表的數(shù)據(jù)傾斜:如果在分桶表或分區(qū)表中,某些分桶或分區(qū)的數(shù)據(jù)量過大,超過了其他分桶或分區(qū)的數(shù)據(jù)量,就會(huì)造成傾斜。

  3. 聚合操作的傾斜:在執(zhí)行聚合操作(如GROUP BY、COUNT、SUM等)時(shí),如果被聚合的列數(shù)據(jù)分布不均勻,會(huì)導(dǎo)致聚合操作的任務(wù)負(fù)載不平衡,Count(distinct id ) 去重統(tǒng)計(jì)要慎用。

  4. 高基數(shù)列的傾斜:某些列的基數(shù)(唯一值的數(shù)量)很高,而其他列的基數(shù)較低,可能導(dǎo)致以高基數(shù)列為基準(zhǔn)進(jìn)行的連接或聚合操作產(chǎn)生數(shù)據(jù)傾斜。

  5. 隨機(jī)寫入場景:當(dāng)數(shù)據(jù)隨機(jī)寫入分區(qū)表或分桶表時(shí),可能會(huì)導(dǎo)致某些分區(qū)或分桶的數(shù)據(jù)量增長迅速,從而引發(fā)傾斜。

  6. 數(shù)據(jù)導(dǎo)入方式不均勻:如果使用了多個(gè)任務(wù)同時(shí)導(dǎo)入數(shù)據(jù),而這些任務(wù)在導(dǎo)入數(shù)據(jù)時(shí)的輸入源數(shù)據(jù)分布不均勻,就會(huì)導(dǎo)致數(shù)據(jù)傾斜。

1.2 解決數(shù)據(jù)傾斜問題的優(yōu)化思路

1.2.1 代碼層面:

  1. 檢查連接鍵和分區(qū)鍵:檢查連接和分組操作的鍵,確保數(shù)據(jù)分布均勻,避免傾斜??梢钥紤]在鍵中引入隨機(jī)數(shù),或者對(duì)鍵進(jìn)行散列操作。

  2. 使用MapJoin和Broadcast Join:對(duì)于連接操作,使用MapJoin或Broadcast Join可以將小表復(fù)制到每個(gè)節(jié)點(diǎn)上,避免數(shù)據(jù)傾斜。

  3. 檢查聚合操作:如果有聚合操作,尤其是GROUP BY,確保被聚合的列數(shù)據(jù)分布均勻,可以考慮使用采樣數(shù)據(jù)進(jìn)行預(yù)估。

  4. 調(diào)整存儲(chǔ)格式:選擇合適的列式存儲(chǔ)格式(如ORC、Parquet),可以減少數(shù)據(jù)讀取,提高性能。

  5. 數(shù)據(jù)傾斜監(jiān)控和日志:在代碼中添加數(shù)據(jù)傾斜監(jiān)控和日志,便于發(fā)現(xiàn)和定位傾斜的數(shù)據(jù)。

  6. group by 代替 distinct:當(dāng)要統(tǒng)計(jì)某一列的去重?cái)?shù)時(shí),如果數(shù)據(jù)量很大,count(distinct)就會(huì)非常慢,原因與order by類似,count(distinct)邏輯只會(huì)有很少的reducer來處理。

  7. 列裁剪和分區(qū)裁剪:所謂列裁剪就是在查詢時(shí)只讀取需要的列,分區(qū)裁剪就是只讀取需要的分區(qū)。Hive中與列裁剪優(yōu)化相關(guān)的配置項(xiàng)是hive.optimize.cp,與分區(qū)裁剪優(yōu)化相關(guān)的則是hive.optimize.pruner,默認(rèn)都是true

1.2.2 配置層面:

  1. 動(dòng)態(tài)分桶和分區(qū):對(duì)于分桶和分區(qū)表,使用動(dòng)態(tài)分桶和分區(qū)可以根據(jù)數(shù)據(jù)分布情況進(jìn)行自動(dòng)優(yōu)化。

  2. 并行度設(shè)置:根據(jù)集群的規(guī)模和硬件配置,適當(dāng)調(diào)整并行度,避免某些任務(wù)負(fù)載過重。

  3. 調(diào)整資源分配:分配合適的資源給任務(wù),避免資源爭奪導(dǎo)致傾斜。

1.2.3 參數(shù)調(diào)整:

  1. 調(diào)整shuffle參數(shù):調(diào)整shuffle相關(guān)的參數(shù),如mapreduce.reduce.shuffle.input.buffer.percent、mapreduce.reduce.shuffle.parallelcopies等。

  2. 調(diào)整內(nèi)存參數(shù):根據(jù)任務(wù)的實(shí)際需求,調(diào)整內(nèi)存參數(shù),避免內(nèi)存不足引發(fā)傾斜。

1.2.4 其他思路:

  1. 數(shù)據(jù)抽樣分析:使用抽樣數(shù)據(jù)進(jìn)行分析,了解數(shù)據(jù)分布情況,有助于更好地優(yōu)化查詢。

  2. 使用中間表:將復(fù)雜的查詢過程分解成多個(gè)步驟,將中間結(jié)果保存在臨時(shí)表中,減少大查詢的復(fù)雜性。

  3. 使用UDF和UDAF:編寫自定義函數(shù)和聚合函數(shù),對(duì)傾斜數(shù)據(jù)進(jìn)行特殊處理,分散數(shù)據(jù)分布。

  4. 數(shù)據(jù)重分布:通過數(shù)據(jù)重分布操作,將傾斜數(shù)據(jù)均勻地分布到不同節(jié)點(diǎn)上。

  5. 增加節(jié)點(diǎn)數(shù):如果集群規(guī)模允許,可以考慮增加節(jié)點(diǎn)數(shù),從而分擔(dān)負(fù)載,減輕數(shù)據(jù)傾斜。

2 解決Hive數(shù)據(jù)傾斜問題的方法

解決方案需要具體問題具體分析,綜合考慮資源、數(shù)據(jù)量等多種因素,以下方案有相互交叉的內(nèi)容,需要研判考慮:

2.1 開啟負(fù)載均衡

-- map端的Combiner,默認(rèn)為ture
set hive.map.aggr=true;
-- 開啟負(fù)載均衡
set hive.groupby.skewindata=true (默認(rèn)為false)

這行代碼是在Hive中用于處理數(shù)據(jù)傾斜的配置代碼。它的作用是開啟Hive中的負(fù)載均衡優(yōu)化,以應(yīng)對(duì)數(shù)據(jù)傾斜的情況。

具體來說:

  1. hive.map.aggr=true:默認(rèn)情況下,Hive在執(zhí)行聚合操作時(shí)(如GROUP BY、SUM、AVG等),會(huì)在Map端進(jìn)行部分聚合(Partial Aggregation),以減少數(shù)據(jù)的傳輸量。這個(gè)配置項(xiàng)開啟了Map端的部分聚合,可以在Map階段對(duì)部分?jǐn)?shù)據(jù)進(jìn)行聚合,減少數(shù)據(jù)傳輸?shù)絉educer的量。

  2. hive.groupby.skewindata=true:這個(gè)配置項(xiàng)是為了應(yīng)對(duì)數(shù)據(jù)傾斜的情況。數(shù)據(jù)傾斜指的是在進(jìn)行聚合操作時(shí),部分?jǐn)?shù)據(jù)分布不均勻,導(dǎo)致部分Reducer處理的數(shù)據(jù)量遠(yuǎn)大于其他Reducer。開啟此配置項(xiàng)會(huì)在數(shù)據(jù)傾斜的情況下,將數(shù)據(jù)傾斜的Key單獨(dú)劃分到一個(gè)Reducer,以實(shí)現(xiàn)負(fù)載均衡,減少單個(gè)Reducer的負(fù)載。

總體來說,這兩個(gè)配置項(xiàng)的作用是在MapReduce過程中,優(yōu)化聚合操作和應(yīng)對(duì)數(shù)據(jù)傾斜,從而提高作業(yè)的執(zhí)行效率和穩(wěn)定性。但是,這只是配置項(xiàng)的作用描述,具體的優(yōu)化效果還需要根據(jù)實(shí)際數(shù)據(jù)和作業(yè)情況進(jìn)行實(shí)驗(yàn)和觀察。

2.2 引入隨機(jī)性

通過在連接鍵或分區(qū)鍵中引入隨機(jī)數(shù)、數(shù)據(jù)加鹽等方式,將傾斜的數(shù)據(jù)打散,使其分布均勻化,減少傾斜。

  1. 使用隨機(jī)前綴:
-- 創(chuàng)建分桶表,內(nèi)部外部表也行
CREATE TABLE skewed_table (
    id INT,
    value STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS;

-- 插入數(shù)據(jù)到分桶表
INSERT INTO TABLE skewed_table
SELECT id, value FROM source_data;

-- 添加隨機(jī)前綴列
-- 這里使用FLOOR(rand() * 100)生成一個(gè)0到99的隨機(jī)整數(shù),作為隨機(jī)前綴
SELECT id, value, FLOOR(rand() * 100) AS random_prefix
FROM skewed_table;
  1. 使用哈希函數(shù):
-- 創(chuàng)建分桶表,內(nèi)部外部表也行
CREATE TABLE skewed_table (
    id INT,
    value STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS;

-- 插入數(shù)據(jù)到分桶表
INSERT INTO TABLE skewed_table
SELECT id, value FROM source_data;

-- 使用哈希函數(shù)生成分桶列
-- 這里使用MD5哈希函數(shù)將id列哈希為一個(gè)字符串,然后將哈希字符串轉(zhuǎn)換為整數(shù)
SELECT id, value, CAST(CONV(SUBSTRING(MD5(CAST(id AS STRING)), 1, 8), 16, 10) % 4 AS INT) AS hash_bucket
FROM skewed_table;
  1. 使用窗口函數(shù)和隨機(jī)數(shù):
-- 創(chuàng)建分桶表,內(nèi)部外部表也行
CREATE TABLE skewed_table (
    id INT,
    value STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS;

-- 插入數(shù)據(jù)到分桶表
INSERT INTO TABLE skewed_table
SELECT id, value FROM source_data;

-- 使用窗口函數(shù)和隨機(jī)數(shù)生成分桶列
-- 這里使用ROW_NUMBER()窗口函數(shù)和FLOOR(rand() * 4)生成一個(gè)隨機(jī)分桶號(hào)
SELECT id, value, FLOOR(rand() * 4) AS random_bucket
FROM (
    SELECT id, value, ROW_NUMBER() OVER (PARTITION BY id) AS row_num
    FROM skewed_table
) t;
  1. 使用分桶表解決連接數(shù)據(jù)傾斜:
-- 創(chuàng)建兩個(gè)分桶表
CREATE TABLE table1 (
    id INT,
    value STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS;

CREATE TABLE table2 (
    id INT,
    data STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS;

-- 插入數(shù)據(jù)到分桶表
INSERT INTO TABLE table1
SELECT id, value FROM source_data1;

INSERT INTO TABLE table2
SELECT id, data FROM source_data2;

-- 使用分桶表解決連接數(shù)據(jù)傾斜
-- 對(duì)兩個(gè)表都使用相同的分桶列,并且分桶數(shù)也相同,可以減少連接時(shí)的數(shù)據(jù)傾斜
SELECT t1.id, t1.value, t2.data
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id;

2.3 使用MapJoin或Broadcast Join

對(duì)于連接操作,reduce join 轉(zhuǎn)換成 MapJoin,使用MapJoin或Broadcast Join可以將小表復(fù)制到每個(gè)節(jié)點(diǎn)上,避免數(shù)據(jù)傾斜。

Map-side Join(MapJoin)是一種用于處理數(shù)據(jù)傾斜問題的方法,特別適用于一個(gè)小表和一個(gè)大表進(jìn)行連接的場景。在MapJoin中,小表被緩存在內(nèi)存中,并與大表進(jìn)行連接操作,以減少大表的數(shù)據(jù)復(fù)制和數(shù)據(jù)傾斜問題。以下是如何使用MapJoin來解決數(shù)據(jù)傾斜問題的步驟:

  1. 準(zhǔn)備數(shù)據(jù): 假設(shè)有一個(gè)大表big_table和一個(gè)小表small_table,需要根據(jù)某個(gè)共同的列進(jìn)行連接。

  2. 設(shè)置MapJoin: 在Hive中,可以通過設(shè)置參數(shù)來啟用MapJoin。

-- 設(shè)置MapJoin
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=25000000; -- 小表的大小閾值,單位為字節(jié)
set hive.auto.convert.join.noconditionaltask=true; -- 僅進(jìn)行MapJoin,不使用Reduce階段
  1. 對(duì)小表進(jìn)行Bucket操作: 將小表進(jìn)行Bucket操作,使其和大表具有相同的Bucket數(shù)量。
-- 對(duì)小表進(jìn)行Bucket操作
CREATE TABLE small_table_bucketed
CLUSTERED BY (join_column) INTO N BUCKETS
AS
SELECT * FROM small_table;
  1. 執(zhí)行MapJoin查詢: 編寫查詢語句,使用MapJoin來連接大表和經(jīng)過Bucket操作的小表。
SELECT /*+ MAPJOIN(small_table_bucketed) */ big_table.*, small_table_bucketed.*
FROM big_table
JOIN small_table_bucketed ON big_table.join_column = small_table_bucketed.join_column;

在這個(gè)過程中,MapJoin會(huì)將小表的數(shù)據(jù)加載到內(nèi)存中,并在Map階段進(jìn)行連接操作,從而避免了大表的數(shù)據(jù)復(fù)制和數(shù)據(jù)傾斜問題。需要注意的是,MapJoin適用于小表和大表的大小閾值適當(dāng)?shù)那闆r下,如果小表過大,可能會(huì)導(dǎo)致內(nèi)存不足的問題。

總之,MapJoin是一種有效的方法來解決數(shù)據(jù)傾斜問題,特別適用于小表和大表的連接操作,通過在Map階段進(jìn)行連接,減少了數(shù)據(jù)復(fù)制和數(shù)據(jù)傾斜的可能性。

2.4 調(diào)整數(shù)據(jù)存儲(chǔ)格式

調(diào)整存儲(chǔ)格式,如使用ORC或Parquet等列式存儲(chǔ)格式,或者開啟輸出壓縮,可以減少不必要的數(shù)據(jù)讀取,改善數(shù)據(jù)傾斜。

// 開啟Map端輸出壓縮
Configuration conf = job.getConfiguration();
conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec", GzipCodec.class, CompressionCodec.class);

這行代碼是在MapReduce程序中使用Hadoop的Configuration類來配置Map端的輸出壓縮。雖然這行代碼本身并不直接處理數(shù)據(jù)傾斜,但它可以在一定程度上優(yōu)化作業(yè)的性能,從而減輕數(shù)據(jù)傾斜造成的影響。

數(shù)據(jù)傾斜可能導(dǎo)致部分Reducer的負(fù)載過重,而啟用Map端輸出壓縮可以在一定程度上減小傳輸數(shù)據(jù)量,從而減輕Reducer的負(fù)擔(dān)。具體來說,這段代碼的作用是:

  1. conf.setBoolean("mapreduce.map.output.compress", true);:這一行代碼啟用了Map端輸出的壓縮。MapReduce作業(yè)產(chǎn)生的中間數(shù)據(jù)(Map輸出數(shù)據(jù))在傳輸?shù)絉educer之前可以進(jìn)行壓縮,減小數(shù)據(jù)的傳輸量,從而加快數(shù)據(jù)傳輸速度。

  2. conf.setClass("mapreduce.map.output.compress.codec", GzipCodec.class, CompressionCodec.class);:這一行代碼指定了使用的壓縮編解碼器。在這個(gè)例子中,使用的是Gzip壓縮編解碼器(GzipCodec.class),它可以對(duì)中間數(shù)據(jù)進(jìn)行Gzip壓縮。

通過開啟Map端輸出壓縮,可以減小Map輸出數(shù)據(jù)的傳輸量,從而減輕了網(wǎng)絡(luò)傳輸?shù)膲毫Α_@在數(shù)據(jù)傾斜的情況下可能會(huì)有一定的幫助,因?yàn)閿?shù)據(jù)傾斜往往會(huì)導(dǎo)致部分Reducer需要處理較多的數(shù)據(jù),通過減小傳輸數(shù)據(jù)量,可以加快數(shù)據(jù)的傳輸速度,從而在一定程度上減輕了數(shù)據(jù)傾斜帶來的影響。然而,需要注意的是,這只是優(yōu)化的一部分,實(shí)際情況可能還需要結(jié)合其他優(yōu)化策略來解決數(shù)據(jù)傾斜問題。

2.5 分桶表、分區(qū)表

通過調(diào)整查詢計(jì)劃,如使用分桶表、分區(qū)表等,可以將任務(wù)負(fù)載均衡分配,減少數(shù)據(jù)傾斜。

分桶表是Hive中一種用于優(yōu)化查詢性能的技術(shù),它可以在一定程度上幫助解決數(shù)據(jù)傾斜問題。分桶表將數(shù)據(jù)按照指定的列進(jìn)行哈希分桶存儲(chǔ),每個(gè)分桶都包含了一部分?jǐn)?shù)據(jù),使得數(shù)據(jù)更加均勻地分布在不同的分桶中。當(dāng)進(jìn)行Join操作時(shí),如果參與Join的兩個(gè)表都是分桶表并且使用相同的分桶列,那么可以通過哈希分桶的方式來提高Join的效率,減輕數(shù)據(jù)傾斜問題。

下面是分桶表如何解決Join中的數(shù)據(jù)傾斜問題的基本步驟:

  1. 選擇合適的分桶列: 首先,需要根據(jù)實(shí)際情況選擇合適的列作為分桶列。通常情況下,可以選擇參與Join的列作為分桶列。

  2. 創(chuàng)建分桶表: 將需要進(jìn)行Join的表創(chuàng)建為分桶表,并指定分桶列和分桶數(shù)量。分桶數(shù)量應(yīng)該根據(jù)數(shù)據(jù)量來合理設(shè)置,以確保數(shù)據(jù)能夠均勻地分布在各個(gè)分桶中。

-- 創(chuàng)建分桶表A,指定分桶列bucket_col和分桶數(shù)量4
CREATE TABLE table_A (
    id INT,
    value STRING
)
CLUSTERED BY (bucket_col) INTO 4 BUCKETS;

-- 創(chuàng)建分桶表B,同樣指定分桶列bucket_col和分桶數(shù)量4
CREATE TABLE table_B (
    id INT,
    data STRING
)
CLUSTERED BY (bucket_col) INTO 4 BUCKETS;
  1. 插入數(shù)據(jù): 將數(shù)據(jù)插入到分桶表中。Hive會(huì)根據(jù)分桶列的哈希值將數(shù)據(jù)均勻地分配到不同的分桶中。
-- 插入數(shù)據(jù)到分桶表A
INSERT INTO TABLE table_A
SELECT id, value FROM source_data_A;

-- 插入數(shù)據(jù)到分桶表B
INSERT INTO TABLE table_B
SELECT id, data FROM source_data_B;
  1. 進(jìn)行Join操作: 當(dāng)需要進(jìn)行Join操作時(shí),如果兩個(gè)參與Join的表都是分桶表并且使用相同的分桶列,Hive會(huì)自動(dòng)利用分桶信息來進(jìn)行優(yōu)化。在Join時(shí),Hive會(huì)根據(jù)分桶列的哈希值將相同哈希值的數(shù)據(jù)分配到同一個(gè)節(jié)點(diǎn)上,從而減少數(shù)據(jù)的傳輸和傾斜的問題。
-- 進(jìn)行基于分桶表的Join操作
SELECT a.id, a.value, b.data
FROM table_A a
JOIN table_B b ON a.id = b.id;

在這個(gè)示例中,我們創(chuàng)建了兩個(gè)分桶表table_A和table_B,分別用于存儲(chǔ)兩個(gè)數(shù)據(jù)源的數(shù)據(jù)。然后通過插入數(shù)據(jù),將源數(shù)據(jù)插入到分桶表中。最后,我們進(jìn)行了一個(gè)基于分桶表的Join操作,通過分桶列id來進(jìn)行Join。由于兩個(gè)表都是分桶表,Hive會(huì)根據(jù)分桶列的哈希值將相同哈希值的數(shù)據(jù)分配到同一個(gè)節(jié)點(diǎn)上,從而優(yōu)化Join操作。

請注意,實(shí)際使用中需要根據(jù)數(shù)據(jù)的特點(diǎn)和需求來選擇分桶列和分桶數(shù)量。分桶表的使用需要結(jié)合具體場景來考慮,以達(dá)到優(yōu)化查詢性能的目的。

分桶表的優(yōu)勢在于,通過合理設(shè)置分桶數(shù)量和選擇適當(dāng)?shù)姆滞傲?,可以使?shù)據(jù)更加均勻地分布在不同的分桶中,從而減輕數(shù)據(jù)傾斜的影響。但需要注意的是,分桶表并不能完全消除數(shù)據(jù)傾斜,特別是在數(shù)據(jù)分布不均勻的情況下,仍然可能會(huì)出現(xiàn)傾斜的問題。在實(shí)際應(yīng)用中,還可以結(jié)合其他優(yōu)化技術(shù),如使用Combiner、調(diào)整分桶數(shù)量、使用隨機(jī)前綴等,來更全面地解決數(shù)據(jù)傾斜的影響。

2.6 使用抽樣數(shù)據(jù)進(jìn)行優(yōu)化

對(duì)于大數(shù)據(jù)表,可以先對(duì)數(shù)據(jù)進(jìn)行抽樣,分析抽樣數(shù)據(jù)的分布情況,再進(jìn)行優(yōu)化,避免全表掃描導(dǎo)致的傾斜。

// 采樣數(shù)據(jù)
InputSampler.writePartitionFile(job, new InputSampler.RandomSampler(0.1, 10000));

這段代碼是在MapReduce程序中使用Hadoop的InputSampler來采樣數(shù)據(jù),用于優(yōu)化數(shù)據(jù)傾斜問題。具體來說,這段代碼的作用是:

  1. InputSampler.writePartitionFile(job, new InputSampler.RandomSampler(0.1, 10000));:這行代碼使用隨機(jī)采樣器來創(chuàng)建一個(gè)分區(qū)文件。分區(qū)文件包含了采樣的數(shù)據(jù)信息以及相應(yīng)的分區(qū)信息,這可以用來指導(dǎo)MapReduce作業(yè)在進(jìn)行Shuffle操作時(shí)將數(shù)據(jù)分配到不同的Reducer上。

在優(yōu)化數(shù)據(jù)傾斜時(shí),采樣數(shù)據(jù)的目的是識(shí)別哪些數(shù)據(jù)可能會(huì)導(dǎo)致傾斜。通過對(duì)數(shù)據(jù)進(jìn)行采樣,可以分析采樣數(shù)據(jù)的分布情況,進(jìn)而確定哪些數(shù)據(jù)量較大或者分布不均勻。在這個(gè)例子中,使用了隨機(jī)采樣器,從輸入數(shù)據(jù)中隨機(jī)選擇一定比例的數(shù)據(jù)(0.1,即10%),并采樣的數(shù)據(jù)量為10000條。

通過分析采樣數(shù)據(jù),可以有助于識(shí)別數(shù)據(jù)傾斜的情況,從而采取相應(yīng)的優(yōu)化策略。例如,可以根據(jù)采樣數(shù)據(jù)的分布情況來調(diào)整分區(qū)策略,使得數(shù)據(jù)更加均勻地分配到不同的Reducer上,從而減輕數(shù)據(jù)傾斜問題。

需要注意的是,雖然采樣數(shù)據(jù)可以幫助識(shí)別數(shù)據(jù)傾斜問題,但它并不是解決數(shù)據(jù)傾斜的唯一方法。在實(shí)際應(yīng)用中,可能還需要結(jié)合其他優(yōu)化策略,如使用Combiner、使用合適的分區(qū)鍵、使用隨機(jī)前綴等,來更全面地解決數(shù)據(jù)傾斜的影響。

2.7 過濾傾斜join單獨(dú)進(jìn)行join

假設(shè)有兩個(gè)表:orderscustomers,其中 orders 表中的 customer_id 列是高基數(shù)列,可能導(dǎo)致數(shù)據(jù)傾斜。我們可以使用過濾傾斜Key單獨(dú)進(jìn)行Join的方式來解決這個(gè)問題。

下面是一個(gè)示例的SQL代碼:

-- 識(shí)別傾斜Key
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 10000; -- 舉例,根據(jù)實(shí)際情況設(shè)定閾值

-- 拆分傾斜Key
CREATE TABLE skewed_orders AS
SELECT *
FROM orders
WHERE customer_id IN (identified_skewed_keys);

CREATE TABLE non_skewed_orders AS
SELECT *
FROM orders
WHERE customer_id NOT IN (identified_skewed_keys);

-- 單獨(dú)處理傾斜Key
CREATE TABLE skewed_result AS
SELECT o.*, c.name
FROM skewed_orders o
JOIN customers c ON o.customer_id = c.customer_id;

CREATE TABLE non_skewed_result AS
SELECT o.*, c.name
FROM non_skewed_orders o
JOIN customers c ON o.customer_id = c.customer_id;

-- 合并結(jié)果
CREATE TABLE final_result AS
SELECT * FROM skewed_result
UNION ALL
SELECT * FROM non_skewed_result;

在這個(gè)示例中,我們首先識(shí)別出可能導(dǎo)致數(shù)據(jù)傾斜的 customer_id 值。然后,我們根據(jù)傾斜和非傾斜的情況,分別創(chuàng)建了兩個(gè)臨時(shí)表。接下來,對(duì)傾斜數(shù)據(jù)和非傾斜數(shù)據(jù)分別進(jìn)行Join操作,并將結(jié)果存儲(chǔ)在臨時(shí)表中。最后,我們通過 UNION ALL 合并了傾斜和非傾斜數(shù)據(jù)的結(jié)果,得到最終的查詢結(jié)果。

這種方法也適用于處理空值,思路是用where將空值過濾掉,再使用union all將帶空值的數(shù)據(jù)進(jìn)行關(guān)聯(lián)。文章來源地址http://www.zghlxwxcb.cn/news/detail-647295.html

到了這里,關(guān)于基于MapReduce的Hive數(shù)據(jù)傾斜場景以及解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • hive/spark數(shù)據(jù)傾斜解決方案

    hive/spark數(shù)據(jù)傾斜解決方案

    數(shù)據(jù)傾斜主要表現(xiàn)在,mapreduce程序執(zhí)行時(shí),reduce節(jié)點(diǎn)大部分執(zhí)行完畢,但是有一個(gè)或者幾個(gè)reduce節(jié)點(diǎn)運(yùn)行很慢,導(dǎo)致整個(gè)程序的處理時(shí)間很長,這是因?yàn)槟骋粋€(gè)key的條數(shù)比其他key多很多(有時(shí)是百倍或者千倍之多),這條Key所在的reduce節(jié)點(diǎn)所處理的數(shù)據(jù)量比其他節(jié)點(diǎn)就大很多,

    2024年02月11日
    瀏覽(26)
  • 第十六章 Hive生產(chǎn)環(huán)境優(yōu)化&數(shù)據(jù)傾斜解決方案

    第十六章 Hive生產(chǎn)環(huán)境優(yōu)化&數(shù)據(jù)傾斜解決方案

    Hive調(diào)優(yōu)作用:在保證業(yè)務(wù)結(jié)果不變的前提下,降低資源的使用量,減少任務(wù)的執(zhí)行時(shí)間。 1、調(diào)優(yōu)須知 (1)對(duì)于大數(shù)據(jù)計(jì)算引擎來說:數(shù)據(jù)量大不是問題, 數(shù)據(jù)傾斜是個(gè)問題。 (2)Hive的復(fù) 雜HQL底層會(huì)轉(zhuǎn)換成多個(gè)MapReduce Job并行或者串行執(zhí)行 ,Job數(shù)比較多的作業(yè)運(yùn)行效 率相

    2024年02月12日
    瀏覽(32)
  • Hive表鎖機(jī)制原理以及各種場景的解決方案

    hive 鎖機(jī)制(S鎖,X鎖) 是由hive的事務(wù)管理器出發(fā),鎖的原理是 一張表簡稱A表,我們對(duì)A表做查詢操作的時(shí)候,就會(huì)獲取到?A表的S鎖(共享鎖), 如果對(duì)A表做alter 等其他操作就會(huì)獲取A表的X鎖(排他鎖) 如果A表同時(shí)擁有S鎖和X鎖,A表就會(huì)死鎖。死鎖后的現(xiàn)象就是做drop truncate 等操作會(huì)

    2024年02月02日
    瀏覽(22)
  • 基于Hadoop的MapReduce網(wǎng)站日志大數(shù)據(jù)分析(含預(yù)處理MapReduce程序、hdfs、flume、sqoop、hive、mysql、hbase組件、echarts)

    基于Hadoop的MapReduce網(wǎng)站日志大數(shù)據(jù)分析(含預(yù)處理MapReduce程序、hdfs、flume、sqoop、hive、mysql、hbase組件、echarts)

    需要本項(xiàng)目的可以私信博主?。?! 本項(xiàng)目包含:PPT,可視化代碼,項(xiàng)目源碼,配套Hadoop環(huán)境(解壓可視化),shell腳本,MapReduce代碼,文檔以及相關(guān)說明教程,大數(shù)據(jù)集! 本文介紹了一種基于Hadoop的網(wǎng)站日志大數(shù)據(jù)分析方法。本項(xiàng)目首先將網(wǎng)站日志上傳到HDFS分布式文件系統(tǒng)

    2024年02月16日
    瀏覽(110)
  • Hive-數(shù)據(jù)傾斜

    在計(jì)算各省份的GMV時(shí),有可能會(huì)發(fā)生數(shù)據(jù)傾斜,解決辦法如下: 分組聚合 預(yù)聚合思想 map-side(預(yù)聚合在map里面) skew-groupby(多個(gè)reduce階段進(jìn)行匯總):先對(duì)傾斜的key加上隨機(jī)數(shù),均勻分發(fā)到不同的reduce,進(jìn)行一次聚合,然后去掉隨機(jī)數(shù),再發(fā)到一個(gè)reduce進(jìn)行聚合。 表與表的

    2024年02月14日
    瀏覽(22)
  • Hive 數(shù)據(jù)傾斜

    數(shù)據(jù)傾斜:數(shù)據(jù)分布不均勻,造成數(shù)據(jù)大量的集中到一點(diǎn),造成數(shù)據(jù)熱點(diǎn)。主要表現(xiàn)為任務(wù)進(jìn)度長時(shí)間維持在 99%或者 100%的附近,查看任務(wù)監(jiān)控頁面,發(fā)現(xiàn)只有少量 reduce 子任務(wù)未完成,因?yàn)槠涮幚淼臄?shù)據(jù)量和其他的 reduce 差異過大。 單一 reduce 處理的記錄數(shù)和平均記錄數(shù)相差

    2024年04月28日
    瀏覽(23)
  • Hive & Spark & Flink 數(shù)據(jù)傾斜

    絕大部分任務(wù)都很快完成,只有一個(gè)或者少數(shù)幾個(gè)任務(wù)執(zhí)行的很慢甚至最終執(zhí)行失敗, 這樣的現(xiàn)象為數(shù)據(jù)傾斜現(xiàn)象。 任務(wù)進(jìn)度長時(shí)間維持在 99%或者 100%的附近,查看任務(wù)監(jiān)控頁面,發(fā)現(xiàn)只有少量 reduce 子任務(wù)未完成,因?yàn)槠涮幚淼臄?shù)據(jù)量和其他的 reduce 差異過大。 單一 redu

    2024年02月07日
    瀏覽(31)
  • (15)Hive調(diào)優(yōu)——數(shù)據(jù)傾斜的解決指南

    (15)Hive調(diào)優(yōu)——數(shù)據(jù)傾斜的解決指南

    目錄 前言 一、什么是數(shù)據(jù)傾斜 二、發(fā)生數(shù)據(jù)傾斜的表現(xiàn) 2.1 MapReduce任務(wù) 2.2 Spark任務(wù) 三、如何定位發(fā)生數(shù)據(jù)傾斜的代碼 四、發(fā)生數(shù)據(jù)傾斜的原因 3.1?key分布不均勻 3.1.1?某些key存在大量相同值 3.1.2?存在大量異常值或空值 3.2?業(yè)務(wù)數(shù)據(jù)本身的特性 3.3?SQL語句本身就有數(shù)據(jù)傾斜

    2024年04月14日
    瀏覽(35)
  • Spark數(shù)據(jù)傾斜解決方案一:源數(shù)據(jù)預(yù)處理和過濾傾斜key

    Spark數(shù)據(jù)傾斜解決方案一:源數(shù)據(jù)預(yù)處理和過濾傾斜key

    為什么把源數(shù)據(jù)預(yù)處理和過濾掉傾斜的key兩種處理傾斜的方式寫到一起? 因?yàn)檫@兩種方式在實(shí)際的項(xiàng)目中場景較少而且單一,對(duì)于數(shù)據(jù)源預(yù)處理,比如原本要在spark中進(jìn)行聚合或join的操作,提前到hive中去做,這種方式雖然解決了spark中數(shù)據(jù)傾斜的問題,但是hive中依然也會(huì)存

    2024年02月09日
    瀏覽(22)
  • Spark數(shù)據(jù)傾斜場景及解決思路

    絕大多數(shù) task 執(zhí)行得都非???,但個(gè)別 task 執(zhí)行極慢。 在進(jìn)行 shuffle 的時(shí)候,必須將各個(gè)節(jié)點(diǎn)上相同的 key 拉取到某個(gè)節(jié)點(diǎn)上的一個(gè) task 來進(jìn)行處理,比如按照 key 進(jìn)行聚合或 join 等操 作。此時(shí)如果某個(gè) key 對(duì)應(yīng)的數(shù)據(jù)量特別大的話,就會(huì)發(fā)生數(shù)據(jù)傾斜。 因此出現(xiàn)數(shù)據(jù)傾斜的

    2023年04月24日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包