Hive SQL ayrıştırma işleminin ayrıntılı açıklaması

Hive, büyük şirketlerde yaygın olarak kullanılan Hadoop tabanlı bir veri ambarı sistemidir. Meituan veri ambarı aynı zamanda, her gün yaklaşık 10.000 Hive ETL hesaplama işlemi gerçekleştiren ve her gün yüzlerce GB veri depolama ve analizinden sorumlu olan Hive'a dayanmaktadır. Hive'ın kararlılığı ve performansı, veri analizimiz için kritik öneme sahiptir.

Hive'ı birkaç kez yükseltme sürecinde, büyük ve küçük bazı sorunlarla karşılaştık. Topluluğa danışarak ve kendi çabalarımızla, bu sorunları çözerken, Hive'ın SQL'i MapReduce'ta derleme sürecini daha derin bir şekilde anlıyoruz. Bu sürecin anlaşılması, yalnızca bazı Hive hatalarını çözmemize yardımcı olmakla kalmaz, aynı zamanda Hive SQL'i optimize etmemize, Hive üzerindeki kontrolümüzü geliştirmemize ve bazı gerekli işlevleri özelleştirmemize yardımcı olur.

Temel SQL işlemlerini uygulamak için MapReduce ilkesi

MapReduce'a SQL derlemesini ayrıntılı olarak açıklamadan önce, SQL'i uygulamak için MapReduce çerçevesinin temel çalışma prensibine bir göz atalım.

Join'in gerçekleşme ilkesi

o.uid = u.uid üzerindeki kullanıcıya u katılma sırasından u.name, o.orderid seçin;

Haritanın çıktı değerinde farklı tabloların verilerini etiketleyin ve veri kaynağını azaltma aşamasındaki etikete göre değerlendirin. MapReduce süreci aşağıdaki gibidir (burada sadece en temel Join'in uygulanması, başka uygulama yöntemleri vardır)

Group By'nin gerçekleşme ilkesi

rütbe, isonline, şehir grubundan rütbeye göre sayı (*), isonline seçin;

GroupBy'nin alanlarını haritanın çıkış anahtarı değeriyle birleştirin ve farklı anahtarları ayırt etmek için azaltma aşamasında LastKey'i kaydetmek için MapReduce sıralamayı kullanın. MapReduce süreci aşağıdaki gibidir (elbette, bu sadece Azaltma tarafında Hash olmayan toplama sürecini göstermek içindir)

Distinct'in gerçekleşme ilkesi

anlaşmaya göre sipariş grubundan anlaşma kimliği, sayı (farklı kullanıcı kimliği) numarası seçin;

Yalnızca bir ayrı alan olduğunda, Harita aşamasında Karma GroupBy'yi dikkate almazsanız, yalnızca GroupBy alanını ve Distinct alanını harita çıkış anahtarı olarak birleştirmeniz, mapreduce sıralamayı kullanmanız ve aynı zamanda azaltma anahtarı olarak GroupBy alanını kullanmanız ve azaltma aşamasında LastKey'i kaydetmeniz gerekir. Tekilleştirme tamamlanabilir

Aşağıdaki SQL gibi birden çok farklı alan varsa

anlaşma kimliğine göre sipariş grubundan anlaşma kimliği, sayı (farklı kullanıcı kimliği), sayı (ayrı tarih) seçin;

Bunu başarmanın iki yolu vardır:

(1) Yukarıdaki farklı alanın yöntemini, yani aşağıdaki şeklin uygulamasını hala takip ediyorsanız, kullanıcı kimliği ve tarihe göre sıralanamaz ve LastKey tarafından tekilleştirilemez ve yine de azaltma aşamasında hafızadaki Hash ile tekilleştirilmesi gerekir.

(2) İkinci uygulama yöntemi, tüm farklı alanları numaralandırabilir ve her veri satırı için n veri satırı oluşturabilir. Daha sonra aynı alanlar ayrı ayrı sıralanacaktır. Şu anda, kopyaları kaldırmak için yalnızca LastKey'i azaltma aşamasında kaydetmeniz gerekir.

Bu uygulama, MapReduce sıralamayı iyi bir şekilde kullanır ve azaltma aşamasında tekilleştirmenin bellek tüketimini azaltır, ancak dezavantajı, karıştırma verilerinin miktarını artırmasıdır.

Bir azaltma değeri oluşturulurken, diğer farklı veri satırlarının değer alanının, ilk farklı alanın bulunduğu satır dışında boş olabileceği unutulmamalıdır.

SQL'i MapReduce'a dönüştürme süreci

MapReduce tarafından uygulanan temel SQL işlemlerini anladıktan sonra, Hive'ın SQL'i MapReduce görevlerine nasıl dönüştürdüğüne bir göz atalım.Tüm derleme süreci altı aşamaya ayrılmıştır:

  • Antlr, SQL dilbilgisi kurallarını tanımlar, SQL sözcük ve dilbilgisi analizini tamamlar ve SQL'i soyut sözdizimi ağacına dönüştürür AST Ağacı
  • AST Ağacını çaprazlayın, QueryBlock sorgusunun temel birimini soyutlayın
  • QueryBlock'u çaprazlayın ve OperatorTree'ye çevirin
  • Mantık katmanı iyileştirici, OperatorTree dönüşümü gerçekleştirir, gereksiz ReduceSinkOperator'ı birleştirir ve karıştırma verilerinin miktarını azaltır
  • OperatorTree'yi çaprazlayın ve MapReduce görevine çevirin
  • Fiziksel katman iyileştirici, MapReduce görevlerinin dönüşümünü gerçekleştirir ve son yürütme planını oluşturur
  • Altı aşama aşağıda tanıtılmıştır

    Faz1 SQL sözcük ve dilbilgisi analizi

    Antlr

    Hive, SQL sözcüksel ve gramer analizini uygulamak için Antlr kullanır. Antlr, alan dillerini oluşturmak için kullanılabilecek bir dil tanıma aracıdır.

    Antlr burada ayrıntılı olarak tanıtılmayacaktır.Sadece belirli bir dil oluşturmak için Antlr'ı kullanmanın yalnızca bir dilbilgisi dosyası yazması ve sözcük ve dilbilgisi değiştirme kurallarını tanımlaması gerektiğini anlamanız gerekir.Antlr sözcüksel analiz, dilbilgisi analizi, anlamsal analiz ve ara kod oluşturma sürecini tamamlamıştır.

    Hive'daki gramer kurallarının tanım dosyası, 0.10 sürümünden önceki bir Hive.g dosyasıydı. Dilbilgisi kuralları giderek daha karmaşık hale geldikçe, dilbilgisi kuralları tarafından oluşturulan Java ayrıştırma sınıfları, Java sınıfı dosyalarının maksimum sınırını aşabilir. Sürüm 0.11, Hive.g'yi değiştirecektir. 5 dosyaya bölün, sözcük kuralları HiveLexer.g ve dilbilgisi kuralları 4 dosya SelectClauseParser.g, FromClauseParser.g, IdentifiersParser.g, HiveParser.g.

    AST Ağacı

    Sözcüksel ve gramer analizinden sonra, ifadeyi daha fazla işlemeniz gerekiyorsa, giriş cümlesini gramer analizi sırasında soyut bir sözdizimi ağacına dönüştürmek için Antlrin Soyut Sözdizimi Ağacını kullanın ve ardından sözdizimi ağacında gezinirken sonraki adımları tamamlayın. İşleme.

    Aşağıdaki dilbilgisi bölümü, Hive SQL'de SelectStatement'ın gramer kuralıdır: SelectStatement'ın select, from, where, groupby, having, orderby ve diğer cümlecikleri içerdiği görülebilir.

    (Aşağıdaki dilbilgisi kurallarında, ok orijinal cümlenin yeniden yazıldığını gösterir. Yeniden yazdıktan sonra, belirli bir dilbilgisini belirtmek için TOK_QUERY gibi bir sorgu bloğunu belirtmek için bazı özel sözcükler eklenecektir)

    selectStatement

    :

    selectClause

    fromClause

    whereClause?

    groupByClause?

    havingClause?

    orderByClause?

    clusterByClause?

    distributeByClause?

    sortByClause?

    limitClause? - > ^ (TOK_QUERY, Madde ^ (TOK_INSERT ^ (TOK_DESTINATION ^ (TOK_DIR TOK_TMP_FILE))

    selectClause whereClause? groupByClause? havingClause? orderByClause? clusterByClause?

    distributeByClause? sortByClause? limitClause?))

    ;

    Örnek SQL

    SQL'i MapReduce'a çevirme sürecini ayrıntılı olarak açıklamak için, örnek olarak basit bir SQL burada: SQL bir alt sorgu içerir ve son olarak verileri bir tabloya yazar.

    FROM

    (

    SEÇ

    p.datekey veri anahtarı,

    p.userid kullanıcı kimliği,

    c.clienttype

    FROM

    detail.usersequence_client c

    JOIN fact.orderpayment p ON p.orderid = c.orderid

    JOIN default.user du ON du.userid = p.userid

    NEREDE p.datekey = 20131118

    ) taban

    ÜZERİNE YAZMA TABLOSUNU EKLE `test`.`customer_kpi`

    SEÇ

    base.datekey,

    base.clienttype,

    count (farklı base.userid) alıcı_sayısı

    GROUP BY base.datekey, base.clienttype

    SQL, AST Ağacı oluşturur

    Hive SQL ayrıştırma için Antlr kodu aşağıdaki gibidir: HiveLexerX ve HiveParser, Antlr Hive.g gramer dosyasını derledikten ve bu iki sınıfta karmaşık analizler yaptıktan sonra otomatik olarak oluşturulan sözcüksel ve gramatik analiz sınıflarıdır.

    HiveLexerX lexer = new HiveLexerX (yeni ANTLRNoCaseStringStream (komut)); // Sözcüksel analiz, anahtar kelimelerin durumunu yok sayarak

    TokenRewriteStream belirteçleri = new TokenRewriteStream (lexer);

    eğer (ctx! = null) {

    ctx.setTokenRewriteStream (belirteçler);

    }

    HiveParser ayrıştırıcı = new HiveParser (tokens); // Sözdizimi analizi

    parser.setTreeAdaptor (adaptör);

    HiveParser.statement_return r = null;

    Deneyin {

    r = parser.statement (); // AST Ağacına Dönüştür

    } catch (RecognitionException e) {

    e.printStackTrace ();

    yeni ParseException (parser.errors) oluştur;

    }

    Oluşturulan son AST Ağacı, aşağıdaki şeklin sağ tarafında gösterilmektedir (Antlr Works kullanılarak oluşturulmuştur, Antlr Works, Antlr tarafından sağlanan gramer dosyalarını yazmak için düzenleyicidir) Şekilde, iskeletin yalnızca birkaç düğümü genişletilmiştir, ancak tam olarak genişletilmemiştir.

    1/2 alt sorgusu, sağdaki iki parçaya 1/2 karşılık gelir.

    Burada iç alt sorgunun da bir TOK_DESTINATION düğümü oluşturacağını unutmayın. Lütfen yukarıdaki SelectStatement dilbilgisi kurallarına bakın, bu düğüm özellikle dilbilgisi yeniden yazımında eklenmiş bir düğümdür. Bunun nedeni, Hive'da sorgulanan tüm verilerin HDFS geçici dosyalarında depolanmasıdır .. İster ara bir alt sorgu isterse de sorgunun nihai sonucu olsun, Insert ifadesi sonunda verileri tablonun bulunduğu HDFS dizinine yazacaktır.

    Ayrıntılı olarak, bellek alt sorgusunun from cümlesini genişlettikten sonra, aşağıdaki AST Ağacı elde edilir: Her tablo bir TOK_TABREF düğümü oluşturur ve Birleştirme koşulu bir "=" düğümü oluşturur. Diğer SQL bölümleri benzerdir ve tek tek detaylandırılmayacaktır.

    Faz2 SQL temel birimi QueryBlock

    AST Ağacı hala çok karmaşıktır ve doğrudan MapReduce programlarına çevrilecek kadar yapılandırılmamıştır AST Ağacı QueryBlock'a dönüştürmek, SQL'i daha da soyutlamak ve yapılandırmaktır.

    QueryBlock

    QueryBlock, üç bölümden oluşan SQL'in en temel birimidir: giriş kaynağı, hesaplama süreci ve çıktı. Basitçe ifade etmek gerekirse, QueryBlock bir alt sorgudur.

    Aşağıdaki şekil, Hive'daki QueryBlock ile ilgili nesnelerin bir sınıf diyagramıdır ve şekilde birkaç önemli özelliği açıklar.

    • QB # aliasToSubq (QB sınıfının aliasToSubq özniteliğini temsil eder), alt sorgunun QB nesnesini kaydeder ve aliasToSubq anahtar değeri, alt sorgunun takma adıdır
    • QB # qbp, QBParseInfo'nun temel bir SQL birimindeki bir işlem parçası için AST Ağacı yapısını kaydettiği anlamına gelir.QBParseInfo # nameToDest'in HashMap'i sorgu biriminin çıktısını kaydeder ve anahtar inclause-i biçimindedir (Hive Multi Insert deyimlerini desteklediğinden, Çoklu çıktılar), değer karşılık gelen ASTNode düğümü, yani TOK_DESTINATION düğümüdür. QBParseInfo sınıfının kalan HashMap öznitelikleri, sırasıyla her işlemin çıktı ve ASTNode düğümü arasındaki karşılık gelen ilişkiyi depolar.
    • QBParseInfo # JoinExpr, TOK_JOIN düğümünü kaydeder. QB # QBJoinTree, Join sözdizimi ağacının bir yapılandırmasıdır.
    • QB # qbm, tablonun HDFS'deki yolu gibi her girdi tablosunun meta bilgilerini ve tablo verilerini kaydetmek için dosya formatı kaydeder.
    • QBExpr nesnesi, Birleştirme işlemini temsil etmektir.
    AST Ağacı, QueryBlock oluşturur

    AST Ağacı oluşturma QueryBlock süreci özyinelemeli bir süreçtir.AST Ağacı önce çaprazlanır ve farklı Token düğümleriyle karşılaşıldığında, bunlar esas olarak aşağıdaki işlemler dahil olmak üzere ilgili özniteliklerde depolanır.

    • TOK_QUERY = > QB nesnesi, döngü özyinelemeli alt düğümler oluşturun
    • TOK_FROM = > Tablo adının sözdizimi kısmını QB nesnesinin TOK_INSERT = 'e kaydedin > Yinelemeli alt düğümleri döngü
    • TOK_DESTINATION = > Çıktı hedefinin sözdizimi bölümünü QBParseInfo nesnesinin nameToDest özniteliğine kaydedin
    • TOK_SELECT = > Sorgu ifadesinin sözdizimi bölümünü destToAggregationExprs'e kaydedin, TOK_WHERE = > Where parçasının sözdizimini QBParseInfo nesnesinin destToWhereExpr özelliğine kaydedin

    Son örnek SQL, iki QB nesnesi oluşturur.QB nesneleri arasındaki ilişki aşağıdaki gibidir, QB1 dış sorgu ve QB2 alt sorgudur

    QB1 \ QB2

    Faz3 mantıksal operatörü Operatör

    Şebeke

    Son olarak Hive tarafından oluşturulan MapReduce görevi, Harita aşaması ve Azaltma aşaması OperatorTree'den oluşur. Mantıksal operatör, Harita aşamasında veya Azaltma aşamasında tek bir spesifik işlemi tamamlamaktır.

    Temel operatörler arasında TableScanOperator, SelectOperator, FilterOperator, JoinOperator, GroupByOperator, ReduceSinkOperator bulunur

    Her operatör tarafından tamamlanan işlevi adından tahmin edebilirsiniz.TableScanOperator, orijinal tablonun verilerini MapReduce çerçevesinin Harita arayüzünden girer, taranan tablodaki veri satırlarının sayısını kontrol eder ve orijinal tablodan verileri işaretler. JoinOperator, Birleştirme işlemini tamamlar. FilterOperator, filtreleme işlemini tamamlar

    ReduceSinkOperator, Harita tarafındaki alanların kombinasyonunu yalnızca Harita aşamasında görünebilen Kısaltma Anahtarı / Değer, Bölme Anahtarı olarak serileştirir ve ayrıca Hive tarafından oluşturulan MapReduce programında Harita aşamasının sonunu işaretler.

    Harita Azaltma aşamasında Operatör arasındaki veri aktarımı bir akış işlemidir. Her operatör bir veri satırı üzerinde işlemi tamamladıktan sonra, verileri hesaplama için childOperator'a iletir.

    Operator sınıfının ana öznitelikleri ve yöntemleri aşağıdaki gibidir

    • RowSchema, Operatörün çıktı alanını temsil eder
    • InputObjInspector outputObjInspector, giriş ve çıkış alanlarını ayrıştırır
    • processOp, üst Operatör tarafından iletilen verileri alır ve işlenen verileri işlenmek üzere alt Operatöre iletir.
    • Hive'daki her veri satırı bir Operatör tarafından işlendikten sonra, alanlar yeniden numaralandırılır. ColExprMap, geçerli Operatör işleminden önceki ve sonraki her bir ifade arasındaki ad yazışmasını kaydeder. Mantık optimizasyonunun bir sonraki aşamasında alan adını geri izlemek için kullanılır.
    • Hive'ın MapReduce programı dinamik bir program olduğundan, yani bir MapReduce İşinin hangi işlemi gerçekleştireceği belirsizdir. Join veya GroupBy olabilir. Bu nedenle Operatör, görevi göndermeden önce OperatorDesc'de çalışma zamanında gerekli tüm parametreleri kaydeder. OperatorDesc HDFS'ye seri hale getirin, HDFS'den okuyun ve MapReduce görevini yürütmeden önce seriyi kaldırın. OperatorTree'nin Harita aşamasında HDFS üzerindeki konumu Job.getConf ("hive.exec.plan") şeklindedir.
    • + "/Map.xml"
    QueryBlock, Operatör Ağacı oluşturur

    QueryBlock, aşağıdaki adımlar dahil olmak üzere önceki işlemde oluşturulan QB ve QBParseInfo nesnelerinin kaydedilmiş sözdiziminin özelliklerini geçerek Operatör Ağacı oluşturur:

    • QB # aliasToSubq = > Alt sorgular, yinelemeli çağrılar
    • QB # aliasToTabs = > TableScanOperator
    • QBParseInfo # joinExpr = > QBJoinTree = > ReduceSinkOperator + JoinOperator
    • QBParseInfo # destToWhereExpr = > Filtre Operatörü
    • QBParseInfo # destToGroupby = > ReduceSinkOperator + GroupByOperator
    • QBParseInfo # destToOrderby = > ReduceSinkOperator + ExtractOperator

    Join / GroupBy / OrderBy hepsinin Azaltma aşamasında tamamlanması gerektiğinden, ilgili işlemin Operatörü oluşturulmadan önce bir ReduceSinkOperator üretilecek ve alanlar birleştirilecek ve Reduce Key / value, Partition Key olarak serileştirilecektir.

    Ardından, örnek SQL'den OperatorTree oluşturma sürecini ayrıntılı olarak analiz edin

    Önce önceki aşamada oluşturulan QB nesnelerini çaprazlayın

  • İlk olarak alt QueryBlock TableScanOperator ("dim.user") TS TableScanOperator ("detail.usersequence_client") TS TableScanOperator ("fact.orderpayment") TS'ye göre
  • İlk önce QBJoinTree geçiş, QBJoinTree sınıfı, sol ve sağ tabloların ASTNode'unu kaydeder ve bu sorgunun takma adını kaydeder, oluşturulan son sorgu ağacı aşağıdaki gibidir
  • temel / \ p du / \ c p
  • Traverse detail.usersequence_client ve
  • Şekilde TS = TableScanOperator RS = ReduceSinkOperator JOIN = JoinOperator
  • Ara tablo ve dim.user için birleştirme işlem ağacını oluşturun
  • QB2 FilterOperator'a göre. Bu noktada, QB2 geçişi tamamlanmıştır.
  • Aşağıdaki şekilde, SelectOperator, alanın bazı senaryolarda bazı koşullara göre ayrıştırılması gerekip gerekmediğine karar verecektir.
  • Şekilde FIL = FilterOperator SEL = SelectOperator
  • QB1'den QBParseInfo # destToGroupby'ye göre ReduceSinkOperator + GroupByOperator oluşturun
  • Şekilde GBY = GroupByOperator
  • GBY, HASH kümelemesidir, yani bellekteki Hash aracılığıyla toplu işlemdir
  • Son analiz tamamlandıktan sonra, bir FileSinkOperator oluşturulacak ve veriler HDFS'ye yazılacaktır.
  • FS = Şekildeki FileSinkOperator
  • Faz4 mantık katmanı iyileştirici

  • Çoğu mantık katmanı iyileştiricisi, OperatorTree'yi dönüştürerek ve operatörleri birleştirerek MapReduce Job'u azaltma ve karıştırma verisi miktarını azaltma amacına ulaşır.
  • MapJoinProcessor
  • GroupByOptimizer
  • PredicatePushDown
  • ColumnPruner
  • isim
  • etki
  • SimpleFetchOptimizer
  • GroupBy ifadesi olmadan toplu sorguyu optimize edin
  • MapJoin, SQL'de ipucu sağlaması gerekiyor, 0.11 sürümüne artık gerek yok
  • BucketMapJoinOptimizer
  • BucketMapJoin
  • Harita tarafı toplama
  • Süzülmeyi Azaltın
  • İndirgeme oranını doğrusal OperatorTree'deki aynı bölüm / sıralama anahtarı ile birleştirin
  • Dayanak
  • CorrelationOptimizer
  • İlgili İşi HIVE-2206'yı birleştirmek için sorgudaki alaka düzeyini kullanın
  • Tarla budama
  • Tablodaki içindeki optimize ediciler, olabildiğince çok şey yapan / birleştiren tek bir İştir. Karıştırma verisinin miktarını azaltır, Azaltma bile.
  • CorrelationOptimizer optimizer çok karmaşıktır, sorgudaki korelasyondan yararlanabilir ve işleri korelasyonla birleştirebilir, bkz. Hive Correlation Optimizer
  • Örnek SQL için, onu optimize etmek için iki optimize edici vardır. Aşağıda, bu iki optimize edicinin rolü açıklanmakta ve ReduceSinkDeDuplication optimize edicinin rolünü tamamlamaktadır.
  • PredicatePushDown iyileştirici
  • Onay kararı Advance Optimizer, OperatorTree'deki FilterOperator'ı TableScanOperator'dan sonra geliştirir
  • NonBlockingOpDeDupProc iyileştirici ReduceSinkDeDuplication optimize edici
  • ReduceSinkDeDuplication, doğrusal olarak bağlı iki RS'yi birleştirebilir. Aslında, CorrelationOptimizer, doğrusal ve doğrusal olmayan RS işlemlerini birleştirebilen ReduceSinkDeDuplication'ın bir üst kümesidir, ancak önce Hive tarafından uygulanan ReduceSinkDeDuplication
  • Örneğin, aşağıdaki SQL ifadesi
  • dan (anahtar seçin, src grubundan anahtara göre değer, değer) s s.key ile s.key grubunu seçin;
  • Önceki aşamalardan sonra, aşağıdaki OperatorTree oluşturulacaktır.İki ağaç birbirine bağlanır ve burada birlikte çizilmezler.
  • Şu anda, OperatorTree'yi geçtikten sonra, birinci ve ikinci RS'lerin Anahtar değerini ve PartitionKey çıktısını aşağıdaki gibi bulabilirsiniz.
  • ebeveynRS
  • Anahtar
  • PartitionKey
  • ChildRS
  • anahtar
  • anahtar
  • anahtar, değer
  • anahtar, değer
  • ReduceSinkDeDuplication iyileştirici şunları algılar: 1. pRS Anahtarı tamamen cRS Anahtarı içerir ve sıralama düzeni tutarlıdır; 2. pRS PartitionKey tamamen cRS PartitionKey içerir. Optimizasyon koşulları karşılanırsa, yürütme planı optimize edilecektir.
  • ReduceSinkDeDuplication, Operatörü childRS ve parentheRS ve childRS arasında siler.Ayrılmış RS'nin Anahtarı anahtar ve değer alanlarıdır ve PartitionKey anahtar alandır. Birleştirilmiş OperatorTree aşağıdaki gibidir:
  • Phase5 OperatorTree, MapReduce Job sürecini oluşturur

  • OperatorTree'yi MapReduce Job'a dönüştürme süreci aşağıdaki aşamalara ayrılmıştır.
  • Çıktı tablosu için MoveTask oluştur
  • OperatorTree'nin kök düğümlerinden birinden aşağıya doğru derinlik-ilk geçiş
  • ReduceSinkOperator, Harita / Azaltma sınırlarını, birden çok İş arasındaki sınırları belirtir
  • Diğer kök düğümlerini geçin, JoinOperator ile karşılaşın ve MapReduceTask'i birleştirin
  • StatTask güncelleme meta verilerini oluştur
  • Harita ve Azaltma arasındaki operatör ilişkisini kesin
  • Çıktı tablosu için MoveTask oluştur
  • Önceki adımdan, OperatorTree yalnızca bir FileSinkOperator oluşturur, doğrudan bir MoveTask oluşturur ve oluşturulan son HDFS geçici dosyasını hedef tablo dizinine taşımayı tamamlar
  • MoveTask Taşı Operatörü Çapraz geçişi başlat
  • OperatorTree'deki tüm kök düğümleri bir toWalk dizisinde saklayın ve dizideki öğeleri döngüleyin (QB1 çıkarıldı, gösterilmiyor)
  • Son TS elemanını çıkarın

    Yığın opStack (TS

    }içinde

  • Kural # 1 TS% MapReduceTask nesnesini oluşturun ve MapWork'ü belirleyin
  • Yığındaki elemanların aşağıdaki kural R1'e (burada basitçe python koduyla ifade edilir) uygun olduğu bulundu.
  • "" .join () == "TS%"
  • Bir MapReduceTask nesnesi oluşturan MapReduceTask şunları içerir:
  • Kural # 2 TS%. * RS% Azaltma İşini Belirle
  • TS'yi geçmeye devam et

    Alt Operatör, alt Operatörü yığın opStack'e kaydedin

  • İlk RS yığına itildiğinde, yığın opStack = {TS

    , FIL, RS}, aşağıdaki R2 kuralı karşılanacaktır

  • "" .join () == "TS%. * RS%"
  • Şu anda ReduceWork özelliğine kaydedilir.
  • Kural # 3 RS%. * RS% Yeni bir MapReduceTask nesnesi oluşturun ve MapReduceTask'ı bölün
  • JOIN'in alt Operatörünü geçmeye devam edin ve alt Operatörü yığın opStack'te saklayın
  • İkinci RS yığına yerleştirildiğinde, yani yığın "" .join () == "RS%. * RS%" // opStack'in her son ek dizisi arasında döngü oluşturduğunda
  • Şu anda, MapReduceTask nesnesinin TS'sine bir referans oluşturmak için bir alt OperatorRS oluşturmak üzere yeni bir JOIN ve JOIN oluşturun.
  • Yeni oluşturulmuş
  • RS'nin alt Operatörünü geçmeye devam edin ve alt Operatörü yığın opStack'te saklayın
  • Aynısı olduğunda
  • R4 FS%, MapReduceTask ve MoveTask'ı bağlar
  • Tüm alt Operatörler nihayet yığında depolandıktan sonra, "" .join () == "FS%"
  • Şu anda, MapReduceTask'ı bağlayın ve bir
  • Aşamayı Birleştir
  • Şu anda bitmedi ve geçilmemiş iki kök düğüm var.
  • OpStack yığınını boşaltın ve toWalk'un ikinci öğesini yığına ekleyin. MapReduceTask'ı bulacak
  • OpStack = (TS,
  • RS}, R2 TS% kuralı. * RS% karşılanmıştır
  • Şu anda MapReduceTask Haritası < Şebeke,
  • MapReduceWork > MapReduceTask nesnesinde bulundu ve
  • Benzer şekilde son kök düğümden
  • Harita Küçültme aşamasını böl
  • Son aşamada, MapWork ve ReduceWork'teki OperatorTree, sınır olarak RS ile kesilir
  • OperatorTree, MapReduceTask'ın eksiksiz bir resmini oluşturur
  • Son olarak, aşağıda gösterildiği gibi toplam 3 MapReduceTasks oluşturulur
  • Phase6 fiziksel katman iyileştirici

  • Burada her bir iyileştiricinin ilkesini ayrıntılı olarak tanıtmayacağım, ancak MapJoin iyileştiricisini ayrı ayrı tanıtacağım.
  • SortMergeJoinResolver
  • CommonJoinResolver + MapJoinResolver
  • isim
  • etki
  • Vectorizer
  • HIVE-4160, 0.13'te çıkacak
  • Birleştirme sıralamasına benzer şekilde kovalarla çalışır
  • ÖrneklemeOptimizer
  • Optimize edici tarafından paralel sıralama, 0.12'de yayınlandı
  • MapJoin iyileştirici
  • MapJoin Prensibi
  • Basitçe söylemek gerekirse, MapJoin, Harita aşamasında küçük tabloları belleğe okur ve Join işlemini tamamlamak için sırayla büyük tabloları tarar.
  • Yukarıdaki resim, Facebook mühendisi Liyin Tang tarafından tanıtılan ve Join optimizasyonunu tanıtan bir dilimden Hive MapJoin'in şematik diyagramıdır. Resimden MapJoin'in iki aşamaya ayrıldığı görülebilir:
  • Küçük tabloları belleğe okumak, HashTableFiles oluşturmak ve bunları HashTableFiles'ın sıkıştırılacağı Dağıtılmış Önbelleğe yüklemek için MapReduce Local Task'ı kullanın.
  • MapReduce İşinin Harita aşamasında, her Eşleyici, Dağıtılmış Önbellekten belleğe HashTableFiles okur, büyük tabloları sırayla tarar ve doğrudan Harita aşamasında Join işlemini gerçekleştirir ve verileri bir sonraki MapReduce görevine aktarır.
  • İki Join tablosundan biri geçici bir tablo ise, işlem sırasında MapJoin kullanılıp kullanılmayacağını belirlemek için bir Koşullu Görev oluşturulacaktır.
  • CommonJoinResolver iyileştirici
  • CommonJoinResolver iyileştirici, CommonJoin'i MapJoin'e dönüştürmektir, dönüştürme işlemi aşağıdaki gibidir
  • Görev Ağacının derinlik ilk geçişi
  • Sol ve sağ tablolardaki veri miktarını belirlemek için JoinOperator'ı bulun
  • Çift ve küçük masa + büyük masa = > MapJoinTask, küçük / büyük tablo için + ara tablo = > KoşulluGörev
  • Önceki aşamada oluşturulan MapReduce görevini geçin ve JOIN'de geçici bir tablo olarak bir tablo olduğunu bulun, ilk olarak Aşama-2'nin derin bir kopyasını alın (orijinal yürütme planını Yedek olarak tutma ihtiyacı nedeniyle
  • Planlayın, işte yürütme planının bir kopyası), JoinOperator yerine bir MapJoinOperator oluşturun ve ardından HashTableFiles oluşturmak ve bunları DistributedCache'ye yüklemek için küçük tabloları okumak üzere bir MapReduceLocalWork oluşturun.
  • MapReduceTask'ın dönüştürülmüş yürütme planı aşağıdaki şekilde gösterilmektedir.
  • MapJoinResolver iyileştirici
  • MapJoinResolver iyileştirici, Görev Ağacını dolaşır ve yerel çalışma içeren tüm MapReduce Görevlerini iki Göreve böler.
  • Son MapJoinResolver işlendikten sonra, yürütme planı aşağıda gösterilir
  • Hive SQL derleme sürecinin tasarımı

  • Yukarıda bahsedilen tüm SQL derleme sürecinden, derleme sürecinin tasarımının öğrenmeye ve öğrenmeye değer birçok avantajı olduğunu görebiliriz.
    • Dilbilgisi kurallarını tanımlamak için Antlr açık kaynak yazılımını kullanmak, sözcük ve dilbilgisi derleme ve ayrıştırma sürecini büyük ölçüde basitleştirir ve yalnızca bir dilbilgisi dosyası tutması gerekir.
    • Genel fikir çok açık. Aşamalı tasarım, tüm derleme işlemi kodunun bakımını kolaylaştırarak, Hive 0.13 Vectorization'ın en son özelliği ve Tez motoru desteği gibi sonraki çeşitli optimize edicilerin takılabilir bir şekilde geçişini kolaylaştırır. Çıkardı.
    • Her Operatör, tüm MapReduce programını basitleştirerek yalnızca tek bir işlevi gerçekleştirir.

    Topluluk geliştirme yönü

  • Hive hala hızlı bir şekilde geliştiriliyor. Hive'ın performansını iyileştirmek için, hortonworks liderliğindeki Stinger planı, Hive için bir dizi iyileştirme önerdi. Daha önemli iyileştirmeler:
    • Vectorization-Hive, tek hatlı tek hatlı veri işlemeden toplu işlemeye geçerek talimat boru hattı ve önbelleğin kullanımını büyük ölçüde iyileştirdi
    • Hive on Tez-Hive'ın altındaki MapReduce hesaplama çerçevesini Tez hesaplama çerçevesiyle değiştirin. Tez, birden fazla Azaltma aşamasındaki görevlerin MRR'sini desteklemekle kalmaz, aynı zamanda yürütme planlarını tek seferde sunarak kaynakların daha iyi tahsis edilmesini sağlar.
    • Maliyet Tabanlı İyileştirici - Hive'ın en uygun Birleştirme sırasını otomatik olarak seçmesini ve sorgu hızını artırmasını sağlar
    • Tam ACID desteği ile Hive'da ekleme, güncelleme ve silme uygulayın - Birincil anahtara göre destek tablosu artımlı güncelleme

    Aynı zamanda topluluğun gelişimini takip edecek ve Hive tipi ETL sürecinin performansını iyileştirmek için kendi iş ihtiyaçlarımızı birleştireceğiz.

    Yorumu okumak, iletmek ve takip etmek için tıklayın, takipte birçok bilgi noktası olacak, sizinle paylaşın, ayrıca bana özel mesaj da gönderebilirsiniz!

    Düşünemeyeceğin hiçbir şey yok, sadece sen yapamazsın.

    Android kullanıcıları neden iPhone 7'ye geçmiyor? Gerçek Apple'ı çökertiyor
    önceki
    Akış bilgi işlem fırtınası temel bileşenleri, özellikleri ve vakaları
    Sonraki
    Apple HomePod, BAT'a meydan okumak için Çin'e girdi. Akıllı hoparlörler savaşında kazanma şansı nedir?
    Yazın en kapsamlı DIY satın alma rehberi olan Xiaobai, okuduktan sonra yardım istemeyecek
    Yasak Şehir için 80.000 bilet satıldı Kar yağıyor Yasak Şehir'i nasıl çekebilirim? "Saraya giremeyen" insanlar, arkadaş çevrelerini en üst düzeye çıkaran fotoğraflar da çekebilirler!
    Apple HomePod, BAT'a meydan okumak için Çin'e girdi. Akıllı hoparlörler savaşında kazanma şansı nedir?
    Programcılar, mükemmel yüksek maaşlı mimarlara nasıl yükseltilebilir?
    Çin Yeni Yılı'nda eve giderken birçok insan güldü ve ağladı ...
    Hangzhou Körfezi Köprüsü: Nehirden okyanusa sıçramayı gerçekleştirmek için kılıcı bileme on yıl
    OnePlus 5T, Android 9.0 güncellemesini başlattı, resmi itme hidrojen OS 9.0.1
    Yaygın web sunucusu mimarileri nelerdir?
    Pekin Festivali'nden sonra Ruixue'ye hoş geldiniz! Caochang'ın dört hutonundaki kırmızı fenerler "kar şapkaları" takıyor
    Aylık 29 + 300 dakika kira + sınırsız data, bu Telekom paketi tükendi
    Endüstri 4.0 denizaşırı birleşme ve satın almalar Zhejiang'ın çift "ejderhası" başladı
    To Top