2009-09-26 10 views
51

मैं हैडोप का उपयोग कर एक प्रोजेक्ट पर काम कर रहा हूं और ऐसा लगता है कि यह मूल रूप से जावा को शामिल करता है और पायथन के लिए स्ट्रीमिंग समर्थन प्रदान करता है। क्या एक दूसरे को चुनने के लिए एक महत्वपूर्ण प्रदर्शन प्रभाव है? मैं इस प्रक्रिया में काफी जल्दी हूं जहां एक महत्वपूर्ण प्रदर्शन अंतर एक तरफ या दूसरे तरीके से हो सकता है।हैडोप पर जावा बनाम पायथन

+0

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

+0

यदि कोई मानचित्र/प्रक्रिया को कम करने में एक कुंजी को संसाधित करने में लंबा समय लग सकता है तो स्ट्रीमिंग में कुछ अन्य समस्याएं हो सकती हैं। एक देशी जावा मैपर/रेड्यूसर जॉबट्रैक को सूचित करने के लिए दिल की धड़कन भेज सकता है, लेकिन स्ट्रीमिंग मैपर/रेड्यूसर में ऐसी क्षमता नहीं है। – phsiao

+5

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

उत्तर

13

जावा पायथन से कम गतिशील है और इसे एक तेज भाषा बनाने के लिए अपने वीएम में अधिक प्रयास किया गया है। पाइथन को अपने ग्लोबल इंटरप्रेटर लॉक द्वारा भी वापस रखा जाता है, जिसका अर्थ है कि यह एक ही प्रक्रिया के थ्रेड को अलग-अलग कोर पर नहीं दबा सकता है।

चाहे यह कोई महत्वपूर्ण अंतर करता है, जो आप करना चाहते हैं उस पर निर्भर करता है। मुझे संदेह है कि दोनों भाषाएं आपके लिए काम करेंगी।

+6

पाइथन, हालांकि, एकाधिक कोर – cobbal

+0

के लिए बहुत अच्छा मल्टीप्रोसेस समर्थन है, मैंने सुना है कि वैश्विक दुभाषिया लॉक ने बहु-कोर समर्थन को लगभग धोया है, लेकिन मुझे यह सही जगह याद नहीं है कि मैंने यह सुना है, इसलिए इसे अनाज के साथ ले जाएं नमक का। –

+2

बहु-कोर प्रक्रिया सामग्री समानांतर पायथन मॉड्यूल के साथ उपयोग की जा सकती है जो आपको क्लस्टर में अन्य मशीनों पर प्रक्रियाओं को धक्का देने की अनुमति देती है। बहुत साफ और आसान। – whatnick

24

पायथन के साथ आप शायद तेज़ी से विकसित होंगे और जावा निश्चित रूप से तेज़ी से चलेंगे।

Google "बेंचमार्क संदेश" यदि आप सभी लोकप्रिय भाषाओं के बीच कुछ सटीक गति तुलना देखना चाहते हैं, लेकिन अगर मुझे सही याद है तो आप लगभग 3-5x तेज बात कर रहे हैं।

उसने कहा, कुछ चीजें प्रोसेसर इन दिनों बंधी हैं, इसलिए यदि आपको लगता है कि आप पाइथन के साथ बेहतर विकास करेंगे, तो इसमें!


जवाब में टिप्पणी करने के लिए (कैसे जावा अजगर की तुलना में तेजी हो सकता है):

सभी भाषाओं में अलग ढंग से कार्रवाई की जाती है। जावासी ++ के बाद सबसे तेज है (जो जावा के मुकाबले 5x तेज या तेज हो सकता है, लेकिन लगभग 2x तेज औसत लगता है)। बाकी 2-5 + बार धीमे हैं। जावा के बाद पाइथन तेजी से एक है। मुझे लगता है कि सी # जावा या तेज़ी से जितना तेज़ है, लेकिन बेंचमार्कसमैम में केवल मोनो था (जो एक पतला था) क्योंकि वे इसे विंडोज़ पर नहीं चलाते हैं।

इनमें से अधिकतर दावों computer language benchmarks game पर आधारित हैं जो काफी उचित हैं क्योंकि प्रत्येक भाषा में विशेषज्ञ/विशेषज्ञ अपनी विशिष्ट भाषा में लिखे गए परीक्षण को ट्विक करते हैं ताकि यह सुनिश्चित किया जा सके कि कोड अच्छी तरह से लक्षित है।

उदाहरण के लिए, this जावा बनाम सी ++ के साथ सभी परीक्षण दिखाता है और आप गति के बराबर जावा के बराबर 3x धीमी गति से देख सकते हैं (पहला कॉलम 1 और 3 के बीच है), और जावा अधिक स्मृति का उपयोग करता है!

अब this page जावा बनाम पायथन (पायथन के दृष्टिकोण से) दिखाता है। तो गति की तुलना में पाइथन 2x धीमी गति से जावा से 174x धीमी है, पाइथन आम तौर पर कोड आकार और स्मृति उपयोग में जावा को धड़कता है।

यहां एक और दिलचस्प बिंदु - परीक्षणों ने बहुत सारी मेमोरी आवंटित की, जावा वास्तव में स्मृति आकार में पाइथन से काफी बेहतर प्रदर्शन किया। मुझे पूरा यकीन है कि जावा आम तौर पर वीएम के ऊपरी हिस्से की वजह से स्मृति खो देता है, लेकिन एक बार यह कारक खत्म हो जाने पर, जावा शायद अधिक से अधिक कुशल होता है (फिर, सी के अलावा)।

यह पाइथन 3 वैसे है, अन्य पायथन प्लेटफ़ॉर्म का परीक्षण किया गया है (केवल पायथन कहा जाता है) बहुत खराब है।

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

मैंने एजिलेंट के लिए सिग्नल विश्लेषक पर काम किया (महंगे ओ-स्कोप सोचें) जहां जावा में लगभग पूरी चीज (सैंपलिंग से अलग) की गई थी। इसमें ट्रेस (एडब्ल्यूटी) सहित स्क्रीन ड्राइंग और नियंत्रण के साथ बातचीत करना शामिल है।

वर्तमान में मैं भविष्य के सभी केबल बॉक्स के लिए एक परियोजना पर काम कर रहा हूं। अधिकांश अन्य ऐप्स के साथ गाइड जावा में लिखा जाएगा।

यह पायथन से तेज क्यों नहीं होगा?

+0

जावा पाइथन से तेज कैसे हो सकता है? क्या उस पर कोई अंश है? धन्यवाद। –

+0

अपने सारांश से दूर किए बिना, ध्यान रखें कि जावा प्रोग्रामों में से अधिकतर क्वाडकोर का उपयोग करने के लिए परिवर्तित हो गए हैं - इसलिए एक मूल माप - http://shootout.alioth.debian.org/u32/index भी देखें। PHP – igouy

+0

दिलचस्प। मैंने सबसे खराब प्रदर्शन जावा कार्यक्रम (पेड़ एक) देखा था और देखा कि यह बहु-थ्रेडेड नहीं था, लेकिन आप सही हैं - कई अन्य भाषा एकल-थ्रेडेड मोड में एक आश्चर्यजनक शो बनाती हैं। नि: शुल्क पास्कल ??? एडीए ??? हम्म –

14

आप या तो "स्ट्रीमिंग" या "कस्टम जार" के रूप में हडोप मैप्रेडस ट्रांसफॉर्मेशन लिख सकते हैं। यदि आप स्ट्रीमिंग का उपयोग करते हैं, तो आप पाइथन या सी ++ समेत अपनी पसंद की किसी भी भाषा में अपना कोड लिख सकते हैं। आपका कोड बस एसटीडीआईएन और आउटपुट से STDOUT तक पढ़ा जाएगा। हालांकि, 0.21 से पहले हैडऑप संस्करणों पर, हडूप स्ट्रीमिंग केवल पाठ को स्ट्रीम करने के लिए प्रयोग की जाती थी - बाइनरी नहीं - आपकी प्रक्रियाओं के लिए। इसलिए आपकी फ़ाइलों को टेक्स्ट फाइलों की आवश्यकता होती है, जब तक कि आप कुछ फंकी एन्कोडिंग ट्रांसफॉर्मेशन न करें। लेकिन अब यह एक patch दिखाई देता है जो अब जोड़ा गया है जो अबूप स्ट्रीमिंग के साथ बाइनरी प्रारूपों के उपयोग की अनुमति देता है।

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

तो यदि आपका हैडऑप नौकरी I/O बाध्य होने जा रहा है, तो "कस्टम जार" दृष्टिकोण तेज़ होगा (क्योंकि जावा दोनों तेज हैं क्योंकि पिछले पोस्टर ने दिखाया है और डिस्क से पढ़ना भी तेज़ होगा)।

लेकिन आपको खुद से पूछना है कि आपका समय कितना मूल्यवान है। मैं पाइथन के साथ खुद को और अधिक उत्पादक पाता हूं, और मानचित्र-लिखना लिखता हूं जो एसटीडीआईएन पढ़ता है और एसटीडीओयूटी को लिखता है वास्तव में सरल है। इसलिए मैं व्यक्तिगत रूप से पाइथन मार्ग पर जाने की अनुशंसा करता हूं - भले ही आपको बाइनरी एन्कोडिंग सामान स्वयं को समझना पड़े। चूंकि हैडऑप 0.21 गैर-utf8 बाइट सरणी को संभालता है, और चूंकि पाइथन (http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/) के लिए उपयोग करने के लिए एक बाइनरी (बाइट सरणी) विकल्प है, जो कि "कस्टम जार" जावा कोड की तुलना में केवल 25% धीमी गति से पाइथन कोड दिखाता है, I निश्चित रूप से अजगर मार्ग जाना होगा।

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