अन्य प्रारूपों की तुलना में भोज प्रारूप के पेशेवरों और विपक्ष क्या हैं?


136

अपाचे लकड़ी की छत के लक्षण हैं:

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

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


2
इस प्रस्तुति में एक अच्छा सारांश पाया जा सकता है: लिंक
डोमिनिक

@ ऐ-मेनन लिंक मर चुका है।
सज्जाद हुसैन

@ सज्जाद हुसैन ने अपडेट किया।
ऐनी मेनन

जवाबों:


282

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

1
क्या होगा अगर मैं एक समय के लिए लकड़ी की छत का उपयोग करें? कई कॉलम (100+), प्रत्येक कॉलम अलग आवृत्ति (100hz से 0.25 hz) के साथ एक सेंसर डेटा। क्या यह एक स्मार्ट निर्णय होगा?
गिलर्मेस्क

53

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

Parquet Hadoop के लिए एक स्तंभ-आधारित संग्रहण प्रारूप है।

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

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

स्रोत


26

टॉम का जवाब काफी विस्तृत और विस्तृत है, लेकिन आप इस साधारण अध्ययन में रुचि भी ले सकते हैं , Allstate Insurance में किए गए Parquet vs Avro के बारे में, यहाँ संक्षेप में प्रस्तुत किया गया है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.