欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Hadoop中的兩表是什么

這篇文章主要介紹“Hadoop中的兩表是什么”,在日常操作中,相信很多人在Hadoop中的兩表是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hadoop中的兩表是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)貴定免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

Common Join

最為普通的join策略,不受數(shù)據(jù)量的大小影響,也可以叫做reduce side join ,最沒效率的一種join 方式. 它由一個(gè)mapreduce job 完成.

首先將大表和小表分別進(jìn)行map 操作, 在map shuffle 的階段每一個(gè)map output key 變成了table_name_tag_prefix + join_column_value , 但是在進(jìn)行partition 的時(shí)候它仍然只使用join_column_value 進(jìn)行hash.

每一個(gè)reduce 接受所有的map 傳過來的split , 在reducce 的shuffle 階段,它將map output key 前面的table_name_tag_prefix 給舍棄掉進(jìn)行比較. 因?yàn)閞educe 的個(gè)數(shù)可以由小表的大小進(jìn)行決定,所以對于每一個(gè)節(jié)點(diǎn)的reduce 一定可以將小表的split 放入內(nèi)存變成hashtable. 然后將大表的每一條記錄進(jìn)行一條一條的比較.

Map Join

Map Join 的計(jì)算步驟分兩步,將小表的數(shù)據(jù)變成hashtable廣播到所有的map 端,將大表的數(shù)據(jù)進(jìn)行合理的切分,然后在map 階段的時(shí)候用大表的數(shù)據(jù)一行一行的去探測(probe) 小表的hashtable. 如果join key 相等,就寫入HDFS.

map join 之所以叫做map join 是因?yàn)樗械墓ぷ鞫荚趍ap 端進(jìn)行計(jì)算.

hive 在map join 上做了幾個(gè)優(yōu)化:

  • hive 0.6 的時(shí)候默認(rèn)認(rèn)為寫在select 后面的是大表,前面的是小表, 或者使用 /*+mapjoin(map_table) */ 提示進(jìn)行設(shè)定. hive 0.7 的時(shí)候這個(gè)計(jì)算是自動(dòng)化的,它首先會(huì)自動(dòng)判斷哪個(gè)是小表,哪個(gè)是大表,這個(gè)參數(shù)由(hive.auto.convert.join=true)來控制. 然后控制小表的大小由(hive.smalltable.filesize=25000000L)參數(shù)控制(默認(rèn)是25M),當(dāng)小表超過這個(gè)大小,hive 會(huì)默認(rèn)轉(zhuǎn)化成common join. 你可以查看HIVE-1642.

    首先小表的Map 階段它會(huì)將自己轉(zhuǎn)化成MapReduce Local Task ,然后從HDFS 取小表的所有數(shù)據(jù),將自己轉(zhuǎn)化成Hashtable file 并壓縮打包放入DistributedCache 里面.

    目前hive 的map join 有幾個(gè)限制,一個(gè)是它打算用BloomFilter 來實(shí)現(xiàn)hashtable , BloomFilter 大概比hashtable 省8-10倍的內(nèi)存, 但是BloomFilter 的大小比較難控制.

    現(xiàn)在DistributedCache 里面hashtable默認(rèn)的復(fù)制是3份,對于一個(gè)有1000個(gè)map 的大表來說,這個(gè)數(shù)字太小,大多數(shù)map 操作都等著DistributedCache 復(fù)制.

     

    Bucket Map Join

    hive 建表的時(shí)候支持hash 分區(qū)通過指定clustered by (col_name,xxx ) into number_buckets buckets 關(guān)鍵字.

    當(dāng)連接的兩個(gè)表的join key 就是bucket column 的時(shí)候,就可以通過

    hive.optimize.bucketmapjoin= true

    來控制hive 執(zhí)行bucket map join 了, 需要注意的是你的小表的number_buckets 必須是大表的倍數(shù). 無論多少個(gè)表進(jìn)行連接這個(gè)條件都必須滿足.(其實(shí)如果都按照2的指數(shù)倍來分bucket, 大表也可以是小表的倍數(shù),不過這中間需要多計(jì)算一次,對int 有效,long 和string 不清楚)

    Bucket Map Join 執(zhí)行計(jì)劃分兩步,第一步先將小表做map 操作變成hashtable 然后廣播到所有大表的map端,大表的map端接受了number_buckets 個(gè)小表的hashtable并不需要合成一個(gè)大的hashtable,直接可以進(jìn)行map 操作,map 操作會(huì)產(chǎn)生number_buckets 個(gè)split,每個(gè)split 的標(biāo)記跟小表的hashtable 標(biāo)記是一樣的, 在執(zhí)行projection 操作的時(shí)候,只需要將小表的一個(gè)hashtable 放入內(nèi)存即可,然后將大表的對應(yīng)的split 拿出來進(jìn)行判斷,所以其內(nèi)存限制為小表中最大的那個(gè)hashtable 的大小.

    Bucket Map Join 同時(shí)也是Map Side Join 的一種實(shí)現(xiàn),所有計(jì)算都在Map 端完成,沒有Reduce 的都被叫做Map Side Join ,Bucket 只是hive 的一種hash partition 的實(shí)現(xiàn),另外一種當(dāng)然是值分區(qū).

    create table a  (xxx) partition by (col_name)

    不過一般hive 中兩個(gè)表不一定會(huì)有同一個(gè)partition key, 即使有也不一定會(huì)是join key. 所以hive 沒有這種基于值的map side join, hive 中的list partition 主要是用來過濾數(shù)據(jù)的而不是分區(qū). 兩個(gè)主要參數(shù)為(hive.optimize.cp = true 和 hive.optimize.pruner=true)

    hadoop 源代碼中默認(rèn)提供map side join 的實(shí)現(xiàn), 你可以在hadoop 源碼的src/contrib/data_join/src 目錄下找到相關(guān)的幾個(gè)類.  其中TaggedMapOutput 即可以用來實(shí)現(xiàn)hash 也可以實(shí)現(xiàn)list , 看你自己決定怎么分區(qū). Hadoop Definitive Guide 第8章關(guān)于map side join 和side data distribution 章節(jié)也有一個(gè)例子示例怎樣實(shí)現(xiàn)值分區(qū)的map side join.

     

    Sort Merge Bucket Map Join

    Bucket Map Join 并沒有解決map join 在小表必須完全裝載進(jìn)內(nèi)存的限制, 如果想要在一個(gè)reduce 節(jié)點(diǎn)的大表和小表都不用裝載進(jìn)內(nèi)存,必須使兩個(gè)表都在join key 上有序才行,你可以在建表的時(shí)候就指定sorted by join key 或者使用index 的方式.

    set hive.optimize.bucketmapjoin = true;

    set hive.optimize.bucketmapjoin.sortedmerge = true;

    set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

    Bucket columns == Join columns == sort columns

    這樣小表的數(shù)據(jù)可以每次只讀取一部分,然后還是用大表一行一行的去匹配,這樣的join 沒有限制內(nèi)存的大小. 并且也可以執(zhí)行全外連接.

     

    Skew Join

    真實(shí)數(shù)據(jù)中數(shù)據(jù)傾斜是一定的, hadoop 中默認(rèn)是使用

    hive.exec.reducers.bytes.per.reducer = 1000000000

    也就是每個(gè)節(jié)點(diǎn)的reduce 默認(rèn)是處理1G大小的數(shù)據(jù),如果你的join 操作也產(chǎn)生了數(shù)據(jù)傾斜,那么你可以在hive 中設(shè)定

    set hive.optimize.skewjoin = true; 
    set hive.skewjoin.key = skew_key_threshold (default = 100000)

    hive 在運(yùn)行的時(shí)候沒有辦法判斷哪個(gè)key 會(huì)產(chǎn)生多大的傾斜,所以使用這個(gè)參數(shù)控制傾斜的閾值,如果超過這個(gè)值,新的值會(huì)發(fā)送給那些還沒有達(dá)到的reduce, 一般可以設(shè)置成你

    (處理的總記錄數(shù)/reduce個(gè)數(shù))的2-4倍都可以接受.

    傾斜是經(jīng)常會(huì)存在的,一般select 的層數(shù)超過2層,翻譯成執(zhí)行計(jì)劃多于3個(gè)以上的mapreduce job 都很容易產(chǎn)生傾斜,建議每次運(yùn)行比較復(fù)雜的sql 之前都可以設(shè)一下這個(gè)參數(shù). 如果你不知道設(shè)置多少,可以就按官方默認(rèn)的1個(gè)reduce 只處理1G 的算法,那么  skew_key_threshold  = 1G/平均行長. 或者默認(rèn)直接設(shè)成250000000 (差不多算平均行長4個(gè)字節(jié))

     

    Left Semi Join

    hive 中沒有in/exist 這樣的子句,所以需要將這種類型的子句轉(zhuǎn)成left semi join. left semi join 是只傳遞表的join key給map 階段 , 如果key 足夠小還是執(zhí)行map join, 如果不是則還是common join.

     

  • join 策略中的難點(diǎn)

    大多數(shù)只適合等值連接(equal join) ,

    范圍比較和全外連接沒有合適的支持

    提前分區(qū),零時(shí)分區(qū),排序,多種不同執(zhí)行計(jì)劃很難評價(jià)最優(yōu)方案.

    沒有考慮IO 比如臨時(shí)表,網(wǎng)絡(luò)消耗和網(wǎng)絡(luò)延遲時(shí)間,CPU時(shí)間,

    最優(yōu)的方案不代表系統(tǒng)資源消耗最少.

到此,關(guān)于“Hadoop中的兩表是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

分享題目:Hadoop中的兩表是什么
標(biāo)題路徑:http://www.chinadenli.net/article48/jogdep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)電子商務(wù)商城網(wǎng)站企業(yè)建站微信小程序自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)