2025, Oct 18 04:31

Python 3.11 AWS Lambda पर pyarrow की समस्या और समाधान

Python 3.11 AWS Lambda इमेज पर pyarrow इंस्टॉलेशन में glibc 2.26 और कम्पाइलर की कमी से होने वाली विफलता के कारण व समाधान: numpy पिनिंग, संगत व्हील, विकल्प

AWS Lambda बेस इमेज में pyarrow स्थापित करना तब तक सहज लगता है, जब तक निर्भरताओं की श्रृंखला सिस्टम-स्तरीय बाधाओं से नहीं टकराती। एक आम स्थिति: Python 3.11 Lambda इमेज पर numpy को 2.3.0 से नीचे पिन करना और फिर pyarrow जोड़ना—इसके बाद भी pip numpy 2.3.2 लाने की कोशिश करता है और बिल्ड के दौरान असफल हो जाता है। मसले की जड़ केवल Python निर्भरताएँ नहीं हैं—कंटेनर के भीतर glibc का संस्करण और कम्पाइलर का न होना असली कारण है।

न्यूनतम पुनरुत्पादन

नीचे दिया सेटअप Python 3.11 AWS Lambda इमेज पर समस्या को दिखाता है। पहला चरण सीमित संस्करण वाला numpy इंस्टॉल करता है, दूसरा s3 एक्स्ट्रा के साथ pyarrow जोड़ता है।

FROM public.ecr.aws/lambda/python:3.11
RUN python -m pip install "numpy<2.3.0"
RUN python -m pip install "pyarrow[s3]"

Pip कुछ इस तरह आगे बढ़ता है:

Collecting numpy>=1.25
  Downloading numpy-2.3.2.tar.gz (20.5 MB)
  ...

असल में हो क्या रहा है

pyarrow की स्थापना प्रक्रिया कंटेनर के अंदर स्रोत से बिल्ड करने पर उतर आती है। यह इसलिए विफल होती है क्योंकि इमेज में C कम्पाइलर मौजूद नहीं है। शुरू में स्रोत से बिल्ड की नौबत आने का मूल कारण बेस इमेज का glibc स्तर है। Python 3.11 AWS Lambda इमेज glibc 2.26 का उपयोग करती है। pyarrow 21.0.0 के पूर्वनिर्मित व्हील्स के लिए कम से कम glibc 2.28 चाहिए, इसलिए pip व्हील का उपयोग नहीं कर पाता और कंपाइल करने का प्रयास करता है।

भले ही numpy को 2.3.0 से कम पर पिन किया गया हो, pyarrow अपनी निर्भरता numpy>=1.25 बताता है। रिजॉल्वर pyarrow इंस्टॉलेशन के दौरान numpy को नए संस्करण पर ले जाने की कोशिश कर सकता है, और glibc 2.26 पर pyarrow के लिए अनुकूल व्हील उपलब्ध न होने से प्रक्रिया स्रोत-आधारित बिल्ड की ओर जाती है और टूट जाती है।

पर्यावरण के अनुरूप उपाय

यदि उद्देश्य Python 3.11 और वही Lambda बेस इमेज बनाए रखना है, तो ऐसा pyarrow संस्करण लें जिसके व्हील पुराने glibc के संग अनुकूल हों। pyarrow को 20.0.0 पर पिन करने से इस इमेज पर स्रोत से बिल्ड की जरूरत नहीं पड़ती और इंस्टॉलेशन साफ़-सुथरे ढंग से हो जाता है।

FROM public.ecr.aws/lambda/python:3.11
RUN python -m pip install "numpy<2.3.0"
RUN python -m pip install "pyarrow[s3]==20.0.0"

दूसरा रास्ता यह है कि नया glibc वाला बेस इमेज चुनें ताकि ताज़ा pyarrow व्हील इस्तेमाल हो सकें। Python 3.12 AWS Lambda इमेज glibc 2.34 का उपयोग करता है और हालिया pyarrow रिलीज़ के साथ काम करता है।

FROM public.ecr.aws/lambda/python:3.12
RUN python -m pip install "numpy<2.3.0"
RUN python -m pip install "pyarrow[s3]==21.0.0"

जब न pyarrow का संस्करण बदलना संभव हो और न ही Python बेस इमेज, तो बचा विकल्प है—उसी या उससे पुराने glibc पर आधारित वातावरण में pyarrow को स्रोत से कंपाइल कर glibc 2.26 के अनुरूप व्हील बनाना, फिर उस व्हील को Lambda इमेज में कॉपी कर इंस्टॉल करना। pyarrow को बिल्ड करने के आधिकारिक निर्देश Apache Arrow के Linux और macOS हेतु बिल्ड दस्तावेज़ में उपलब्ध हैं।

व्यवहार में, कई बार निर्भरताओं का समाधान तब अधिक अनुमानित ढंग से होता है जब पैकेज एक साथ इंस्टॉल किए जाते हैं। numpy और pyarrow को एक ही pip कमांड में साथ इंस्टॉल करना, या दोनों प्रविष्टियों वाला requirements.txt उपयोग करना, रिजॉल्वर को शुरुआत में ही सभी बाध्यताओं का पूरा संदर्भ दिखाने में मदद कर सकता है। यह केवल कार्य-प्रवाह में वैकल्पिक सुधार है; सही glibc के अनुरूप pyarrow व्हील मिलाने की आवश्यकता का स्थानापन्न नहीं।

यह क्यों महत्वपूर्ण है

Python पैकेजिंग अक्सर यह तथ्य छिपा देती है कि नेटिव एक्सटेंशन सिस्टम लाइब्रेरीज़ पर निर्भर होते हैं। जब glibc उस स्तर से पुरानी हो जो किसी पूर्वनिर्मित व्हील को चाहिए, तो pip स्रोत से बिल्ड पर लौट आता है। इमेज में कम्पाइलर टूलचेन न होने पर बिल्ड विफल होता है। बेस इमेज के glibc, व्हील संगतता और pyarrow की बाइनरी डिस्ट्रीब्यूशन के रिश्ते को समझना बताता है कि केवल numpy को पिन करना मूल समस्या का समाधान क्यों नहीं है।

मुख्य निष्कर्ष

यदि आप Python 3.11 Lambda इमेज पर हैं और pyarrow तुरंत चाहिए, तो इसे 20.0.0 पर पिन करें। यदि Python 3.12 पर जा सकते हैं, तो वर्तमान pyarrow का उपयोग जारी रखें और व्हील सीधे इंस्टॉल करें। यदि संस्करण अन्य कारणों से तय हैं, तो लक्षित glibc के विरुद्ध pyarrow को कंपाइल करें और बने हुए व्हील को अपने Lambda कंटेनर में इंस्टॉल करें। निर्भरताओं के स्पष्ट समाधान के लिए numpy और pyarrow को एक ही pip कमांड या requirements.txt के ज़रिये साथ इंस्टॉल करने पर विचार करें, पर ध्यान रहे कि निर्णायक कारक glibc और व्हील की संगतता ही है।

यह लेख StackOverflow पर प्रश्नFlo द्वारा — और Nick ODell के उत्तर पर आधारित है।