2016-04-24 9 views
48

अपाचे लकड़ी के लक्षण हैं:अन्य प्रारूपों की तुलना में लकड़ी के प्रारूप के पेशेवरों और विपक्ष क्या हैं?

  • स्व का वर्णन
  • स्तंभ प्रारूप
  • भाषा-स्वतंत्र

एवरो, अनुक्रम फ़ाइलें, आर सी की तुलना फ़ाइल आदि में मैं एक सिंहावलोकन चाहते प्रारूपों का। मैंने पहले से ही पढ़ा है: How Impala Works with Hadoop File Formats, यह प्रारूपों पर कुछ अंतर्दृष्टि देता है लेकिन मैं यह जानना चाहता हूं कि इन प्रारूपों में से प्रत्येक डेटा में डेटा & डेटा का संग्रहण कैसे किया जाता है। दूसरों पर कैसे लकड़ी का लाभ है?

+1

एक अच्छा सारांश इस प्रस्तुति में पाया जा सकता है: [कड़ी] (http://www.slideshare.net/StampedeCon/choosing-an-hdfs-data-storage-format-avro-vs- लकड़ी की छत और अधिक-स्टैम्पडेकॉन-2015) – Dominik

उत्तर

97

मुझे लगता है कि मुख्य अंतर मैं वर्णन कर सकता हूं रिकॉर्ड उन्मुख बनाम कॉलम उन्मुख प्रारूपों से संबंधित है। रिकॉर्ड उन्मुख प्रारूप हैं जो हम सभी का उपयोग करते हैं - टेक्स्ट फाइलें, सीएसवी, टीएसवी जैसे सीमित प्रारूप। एवीआरओ उनसे थोड़ा कूलर है क्योंकि यह समय के साथ स्कीमा बदल सकता है, उदा। रिकॉर्ड से कॉलम जोड़ना या निकालना। विभिन्न प्रारूपों (विशेष रूप से संपीड़न सहित) की अन्य चालें शामिल हैं कि प्रारूप को विभाजित किया जा सकता है - यानी, क्या आप डेटासेट में कहीं से भी रिकॉर्ड्स का ब्लॉक पढ़ सकते हैं और अभी भी इसकी स्कीमा जान सकते हैं? लेकिन यहां परक्वार्ट जैसे स्तंभ स्तंभों पर अधिक जानकारी दी गई है।

लकड़ी की छत, और अन्य स्तंभ प्रारूप एक सामान्य हडोप स्थिति को बहुत कुशलता से संभालते हैं। टेबल (डेटासेट्स) में एक से अधिक कॉलम होने के समान सामान्य है, जो आप एक अच्छी तरह से डिज़ाइन किए गए रिलेशनल डेटाबेस में अपेक्षा करेंगे - सौ या दो सौ कॉलम असामान्य नहीं हैं। ऐसा इसलिए है क्योंकि हम अक्सर को हडोप का उपयोग संबंधपरक प्रारूपों से डेटा के रूप में करते हैं - हां, आपको कई बार दोहराए गए मान मिलते हैं और कई तालिकाओं को एक ही में फ़्लैट किया जाता है। लेकिन यह पूछना बहुत आसान हो जाता है क्योंकि सभी शामिल काम किए जाते हैं। अन्य फायदे हैं जैसे राज्य-समय-समय पर डेटा को बनाए रखना। तो वैसे भी एक टेबल में कॉलम का बोतलबंद होना आम बात है।

मान लें कि 132 कॉलम हैं, और उनमें से कुछ वास्तव में लंबे टेक्स्ट फ़ील्ड हैं, प्रत्येक अलग-अलग कॉलम एक दूसरे के बाद हैं और प्रति रिकॉर्ड 10K का उपयोग कर सकते हैं।

एसक्यूएल स्टैंडपॉइंट के साथ इन तालिकाओं को पूछना आसान है, यह आम बात है कि आप केवल कुछ सौ-कॉलम कॉलम के आधार पर कुछ रिकॉर्ड प्राप्त करना चाहेंगे। उदाहरण के लिए, आप बिक्री के साथ ग्राहकों के लिए फरवरी और मार्च में सभी रिकॉर्ड चाहते हैं> $ 500।

इसे पंक्ति प्रारूप में करने के लिए क्वेरी को डेटासेट के प्रत्येक रिकॉर्ड को स्कैन करने की आवश्यकता होगी। पहली पंक्ति पढ़ें, फ़ील्ड (कॉलम) में रिकॉर्ड को पार्स करें और तिथि और बिक्री कॉलम प्राप्त करें, अगर यह स्थिति को पूरा करता है तो इसे अपने परिणाम में शामिल करें। दोहराएँ। यदि आपके पास इतिहास के 10 साल (120 महीने) हैं, तो आप उन महीनों में से 2 को खोजने के लिए हर एक रिकॉर्ड पढ़ रहे हैं। बेशक यह साल और महीने में विभाजन का उपयोग करने का एक शानदार अवसर है, लेकिन फिर भी, आप उन दो महीनों के लिए प्रत्येक रिकॉर्ड/पंक्ति के 10K को पढ़ रहे हैं और पार्स कर रहे हैं, यह पता लगाने के लिए कि ग्राहक की बिक्री> $ 500 है या नहीं।

कॉलम प्रारूप में, रिकॉर्ड के प्रत्येक कॉलम (फ़ील्ड) को अपने प्रकार के अन्य लोगों के साथ संग्रहीत किया जाता है, डिस्क पर कई अलग-अलग ब्लॉक - साल के लिए कॉलम, महीने के लिए कॉलम, ग्राहक कर्मचारी के लिए कॉलम हैंडबुक (या अन्य लंबे पाठ), और अन्य सभी जो डिस्क पर अपनी अलग जगह पर, और निश्चित रूप से बिक्री के लिए स्तंभों को रिकॉर्ड करते हैं। खैर बिल्ली, तारीख और महीने संख्याएं हैं, और इसलिए बिक्री हैं - वे केवल कुछ बाइट हैं। क्या यह अच्छा नहीं होगा अगर हमें प्रत्येक रिकॉर्ड के लिए केवल कुछ बाइट्स पढ़ना पड़े, यह निर्धारित करने के लिए कि कौन से रिकॉर्ड हमारी क्वेरी से मेल खाते हैं? बचाव के लिए कॉलमर भंडारण!

विभाजन के बिना भी, हमारी क्वेरी को पूरा करने के लिए आवश्यक छोटे क्षेत्रों को स्कैन करना सुपर-फास्ट है - वे सभी रिकॉर्ड द्वारा क्रमबद्ध हैं, और सभी समान आकार, इसलिए डिस्क शामिल रिकॉर्ड के लिए बहुत कम डेटा जांच की मांग करती है। उस कर्मचारी पुस्तिका और अन्य लंबे टेक्स्ट फ़ील्ड के माध्यम से पढ़ने की आवश्यकता नहीं है - बस उन्हें अनदेखा करें। इसलिए, पंक्तियों के बजाय, एक-दूसरे के साथ कॉलम समूह करके, आप लगभग हमेशा कम डेटा स्कैन कर सकते हैं। जीत!

लेकिन प्रतीक्षा करें, यह बेहतर हो जाता है। यदि आपकी क्वेरी को केवल उन मानों और कुछ और जानने के लिए जरूरी है (चलिए 132 कॉलम में से 10 कहते हैं) और उस कर्मचारी हैंडबुक कॉलम की परवाह नहीं की, एक बार जब उसने वापस लौटने के लिए सही रिकॉर्ड उठाए, तो अब इसे केवल जाना होगा हमारे डेटासेट में 132 के अन्य 122 को अनदेखा करते हुए परिणामों को प्रस्तुत करने के लिए आवश्यक 10 कॉलम पर वापस जाएं। फिर, हम बहुत सी पढ़ाई छोड़ देते हैं।

(नोट: इस कारण से, कॉलर प्रारूप सीधे परिवर्तन करते समय एक लुभावनी पसंद हैं, उदाहरण के लिए, यदि आप एक से अधिक दो टेबलों में शामिल हो रहे हैं तो एक बड़े (ger) परिणाम सेट करें कि आप एक नए के रूप में बचत कर रहे हैं तालिका, स्रोतों को पूरी तरह से स्कैन करने जा रहे हैं, इसलिए पढ़ने के प्रदर्शन में बहुत लाभ नहीं है, और क्योंकि कॉलर प्रारूपों को कहां सामान के बारे में अधिक याद रखने की आवश्यकता है, वे समान पंक्ति प्रारूप की तुलना में अधिक स्मृति का उपयोग करते हैं)।

कॉलमर का एक और लाभ: डेटा चारों ओर फैल गया है। एक रिकॉर्ड प्राप्त करने के लिए, आपके पास 132 ब्लॉक डेटा पर 132 अलग-अलग स्थानों से डेटा पढ़ने और लिखने के लिए 132 कर्मचारी हो सकते हैं। समानांतरता के लिए हाँ!

और अब क्लीनर के लिए: संपीड़न एल्गोरिदम दोहराए जाने वाले पैटर्न ढूंढने पर बहुत बेहतर काम करता है। आप AABBBBBBCCCCCCCCCCCCCCCC को 2A6B16C के रूप में संपीड़ित कर सकते हैं लेकिन ABCABCBCBCBCCCCCCCCCCCCCC छोटे नहीं होंगे (वास्तव में, वास्तव में, इस मामले में यह होगा, लेकिन मेरा विश्वास करें :-))। तो एक बार फिर, कम पढ़ना। और भी लिखना।

इसलिए हम सामान्य प्रश्नों के उत्तर देने के लिए बहुत कम डेटा पढ़ते हैं, यह समानांतर में पढ़ने और लिखने के लिए संभावित रूप से तेज़ है, और संपीड़न बहुत बेहतर काम करता है।

कॉलमर बहुत अच्छा है जब आपका इनपुट पक्ष बड़ा होता है, और आपका आउटपुट फ़िल्टर किए गए सबसेट होता है: बड़े से छोटे से बहुत अच्छा होता है। जब इनपुट और आउटपुट समान होते हैं तो फायदेमंद नहीं होते हैं।

लेकिन हमारे मामले में, इंपला ने हमारे पुराने हाइव प्रश्नों को 5, 10, 20 या 30 मिनट में चलाया, और कुछ सेकंड या एक मिनट में समाप्त हो गया।

आशा है कि इससे आपके प्रश्न के कम से कम हिस्से का उत्तर देने में मदद मिलेगी!

+1

उत्कृष्ट। धन्यवाद। क्या एक बहुत ही उपयोगी सारांश है जो कई अपाचे प्रोजेक्ट डॉक्स से गुम है .. आप उल्लेख करते हैं: "छोटे फ़ील्ड ... रिकॉर्ड के अनुसार सभी हैं"। मान लीजिए मेरे पास उपयोगकर्ता आईडी की एक साधारण तालिका है: लंबी और आयु: int, और कुछ उम्र के बीच सभी उपयोगकर्ताओं को ढूंढना चाहते हैं। यहां मेरे पास दो कॉलम हैं। क्या मुझे ऑर्डर करने के लिए इंडेक्स कब निर्दिष्ट करना है, या सभी कॉलम कुशलता से अनुक्रमित हैं? – user48956

+0

सबसे अच्छा मैंने अभी तक पढ़ा है। धन्यवाद टॉम !!! –

10

टॉम की जवाब काफी विस्तृत और व्यापक है, लेकिन आप भी this simple study लकड़ी बनाम एवरो Allstate बीमा पर किया के बारे में में रुचि रखते हैं, यहाँ संक्षेप किया जा सकता है:

"कुल मिलाकर, लकड़ी से पता चला है कि हर परीक्षण पर या तो समान या बेहतर परिणाम [से एवरो]। पैराक्वेट के पक्ष में बड़े डेटासेट पर क्वेरी-प्रदर्शन अंतर आंशिक रूप से संपीड़न परिणामों के कारण हैं; विस्तृत डेटासेट से पूछताछ करते समय स्पार्क को एवरो की तुलना में लकड़ी के लिए 3.5x कम डेटा पढ़ना पड़ा। एवरो ने प्रोसेस करते समय अच्छा प्रदर्शन नहीं किया संदिग्ध के रूप में, संपूर्ण डेटासेट। "

19

एवरो हडोप के लिए एक पंक्ति आधारित भंडारण प्रारूप है।

पैराक्वेट हडोप के लिए कॉलम-आधारित स्टोरेज प्रारूप है।

यदि आपका उपयोग केस आम तौर पर प्रत्येक क्वेरी में एक पंक्ति में सभी क्षेत्रों को स्कैन या पुनर्प्राप्त करता है, तो एवरो आमतौर पर सबसे अच्छा विकल्प होता है।

यदि आपके डेटासेट में कई कॉलम हैं, और आपके उपयोग मामले में आम तौर पर पूरे रिकॉर्ड के बजाय उन स्तंभों के सबसेट के साथ काम करना शामिल है, तो इस तरह के काम के लिए लकड़ी को अनुकूलित किया गया है।

Source

संबंधित मुद्दे