ניהול יחסי תלות בין צינורות ב-Dataflow

הרבה צינורות עיבוד נתונים של Apache Beam יכולים לפעול באמצעות סביבות זמן הריצה של Dataflow שמוגדרות כברירת מחדל. עם זאת, יש תרחישי שימוש מסוימים בעיבוד נתונים שבהם כדאי להשתמש בספריות או במחלקות נוספות. במקרים כאלה, יכול להיות שתצטרכו לנהל את התלות של הצינור.

ברשימה הבאה מפורטות כמה סיבות שבגללן יכול להיות שתצטרכו לנהל את התלויות של צינור הנתונים:

  • התלות שסופקה על ידי סביבת זמן הריצה שמוגדרת כברירת מחדל לא מספיקה לתרחיש השימוש שלכם.
  • יכול להיות שיש התנגשויות בין הגרסאות של יחסי התלות שמוגדרים כברירת מחדל, או שיש מחלקות וספריות שלא תואמות לקוד של צינור הנתונים.
  • צריך להצמיד לגרסאות ספציפיות של הספריות בצינור.
  • יש לכם צינור Python שצריך לפעול עם קבוצה עקבית של תלות.

האופן שבו מנהלים יחסי תלות תלוי בשפה שבה משתמשים בצינור – Java,‏ Python או Go.

Java

שימוש במחלקות ובספריות לא תואמות עלול לגרום לבעיות בתלות ב-Java. אם צינור הנתונים מכיל קוד והגדרות ספציפיים למשתמש, הקוד לא יכול להכיל גרסאות מעורבות של ספריות.

בעיות בתלות ב-Java

אם יש בעיות בתלות של צינור הנתונים ב-Java, יכול להיות שתיתקלו באחת מהשגיאות הבאות:

  • NoClassDefFoundError: השגיאה הזו מתרחשת כשמחלקה שלמה לא זמינה במהלך זמן הריצה.
  • NoSuchMethodError: השגיאה הזו מתרחשת כשהמחלקה בנתיב המחלקה משתמשת בגרסה שלא מכילה את השיטה הנכונה, או כשהחתימה של השיטה השתנתה.
  • NoSuchFieldError: השגיאה הזו מתרחשת כשהמחלקה בנתיב המחלקה משתמשת בגרסה שאין בה שדה שנדרש במהלך זמן הריצה.
  • FATAL ERROR: השגיאה הזו מתרחשת כשאי אפשר לטעון תלות מובנית בצורה תקינה. כשמשתמשים בקובץ uber JAR (מוצלל), לא כוללים בספרייה חתימות שמשמשות באותו קובץ JAR, כמו Conscrypt.

ניהול יחסי תלות

כדי לפשט את ניהול יחסי התלות בצינורות Java, ‏ Apache Beam משתמש בארטיפקטים של Bill of Materials (BOM). רשימת ה-BOM עוזרת לכלים לניהול תלות לבחור שילובים תואמים של תלות. מידע נוסף זמין במאמר Apache Beam SDK for Java dependencies בתיעוד של Apache Beam.

כדי להשתמש ב-BOM עם צינור העברת הנתונים ולהוסיף באופן מפורש יחסי תלות אחרים לרשימת יחסי התלות, מוסיפים את המידע הבא לקובץ pom.xml של ארטיפקט ה-SDK. כדי לייבא את ה-BOM הנכון של הספריות, משתמשים ב-beam-sdks-java-google-cloud-platform-bom.

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-sdks-java-google-cloud-platform-bom</artifactId>
      <version>LATEST</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-core</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
  </dependency>
</dependencies>

ארטיפקט beam-sdks-java-core מכיל רק את ה-SDK הבסיסי. צריך להוסיף באופן מפורש לרשימת התלות תלויות אחרות, כמו קלט/פלט ורצים.

Python

כשמריצים משימות Dataflow באמצעות Apache Beam Python SDK, ניהול תלויות שימושי בתרחישים הבאים:

  • צינור עיבוד הנתונים משתמש בחבילות ציבוריות מאינדקס החבילות של Python‏ (PiPy), ואתם רוצים להפוך את החבילות האלה לזמינות מרחוק.
  • אתם רוצים ליצור סביבה שניתן לשחזר.
  • כדי לקצר את זמן ההפעלה, כדאי להימנע מהתקנת תלות בעובדים בזמן הריצה.

הגדרת יחסי תלות של צינורות Python

אפשר להשתמש במחברת או בסקריפט Python יחיד כדי לכתוב צינור עיבוד נתונים של Apache Beam, אבל במערכת האקולוגית של Python, תוכנות מופצות לרוב כחבילות. כדי להקל על התחזוקה של צינור הנתונים, אם קוד צינור הנתונים משתרע על פני כמה קבצים, כדאי לקבץ את קובצי צינור הנתונים כחבילת Python.

  • מגדירים את יחסי התלות של צינור עיבוד הנתונים בקובץ setup.py של החבילה.
  • מעבירים את החבילה לעובדים באמצעות האפשרות --setup_file pipeline.

כשהעובדים מרחוק מתחילים, הם מתקינים את החבילה שלכם. לדוגמה, אפשר לעיין ב-juliaset ב-GitHub של Apache Beam.

כדי ליצור מבנה של צינור העברת הנתונים כחבילת Python, פועלים לפי השלבים הבאים:

  1. יוצרים קובץ setup.py לפרויקט. בקובץ setup.py, כוללים את הארגומנט install_requires כדי לציין את קבוצת התלות המינימלית של הצינור. בדוגמה הבאה מוצג קובץ setup.py בסיסי.

    import setuptools
    
    setuptools.setup(
      name='PACKAGE_NAME',
      version='PACKAGE_VERSION',
      install_requires=[],
      packages=setuptools.find_packages(),
    )
    
  2. מוסיפים את קובץ setup.py, את קובץ זרימת העבודה הראשי ואת הספרייה עם שאר הקבצים לספריית הבסיס של הפרויקט. הקיבוץ הזה של קבצים הוא חבילת Python של הצינור. מבנה הקובץ נראה כמו בדוגמה הבאה:

    root_dir/
      package_name/
        __init__.py
        my_pipeline_launcher.py
        my_custom_transforms.py
        ...other files...
      setup.py
      main.py
    
  3. כדי להריץ את צינור עיבוד הנתונים, צריך להתקין את החבילה בסביבת השליחה. משתמשים באפשרות --setup_file pipeline כדי להכין את החבילה לעובדים. לדוגמה:

    python -m pip install -e .
    python main.py --runner DataflowRunner --setup_file ./setup.py  <...other options...>
    

השלבים האלה מפשטים את תחזוקת הקוד של צינור עיבוד הנתונים, במיוחד כשהקוד גדל בגודל ובמורכבות. במאמר Managing Python pipeline dependencies (ניהול תלות של צינורות Python) במסמכי העזרה של Apache Beam מוסברות דרכים נוספות לציין תלויות.

שימוש בקונטיינרים מותאמים אישית כדי לשלוט בסביבת זמן הריצה

כדי להריץ צינור עיבוד נתונים באמצעות Apache Beam Python SDK, לעובדי Dataflow נדרשת סביבת Python שמכילה מתורגמן, את Apache Beam SDK ואת התלות של צינור עיבוד הנתונים. קובצי אימג' של קונטיינרים של Docker מספקים את הסביבה המתאימה להרצת קוד צינור עיבוד הנתונים.

תמונות קונטיינר סטנדרטיות מתפרסמות עם כל גרסה של Apache Beam SDK, והתמונות האלה כוללות את התלויות של Apache Beam SDK. מידע נוסף זמין במאמר Apache Beam SDK for Python dependencies במסמכי התיעוד של Apache Beam.

כאשר צינור הנתונים דורש תלות שלא נכללת בקובץ אימג' של קונטיינר המוגדר כברירת מחדל, יש להתקין את התלות בזמן הריצה. להתקנת חבילות בזמן ריצה יכולות להיות ההשלכות הבאות:

  • זמן ההפעלה של העובד מתארך בגלל פתרון תלות, הורדה והתקנה.
  • כדי להפעיל את הצינור, צריך חיבור לאינטרנט.
  • אי-דטרמיניזם מתרחש בגלל מהדורות תוכנה בתלות.

כדי להימנע מהבעיות האלה, צריך לספק את סביבת זמן הריצה בקובץ אימג' מותאם אישית של קונטיינר Docker. השימוש בקובץ אימג' של קונטיינר Docker מותאם אישית שבו מותקנים מראש יחסי התלות של צינור עיבוד הנתונים מציע את היתרונות הבאים:

  • האפשרות הזו מבטיחה שבכל פעם שמפעילים את משימת Dataflow, סביבת זמן הריצה של צינור העיבוד תכלול את אותה קבוצה של תלות.
  • אפשר לשלוט בסביבת זמן הריצה של צינור עיבוד הנתונים.
  • הדבר מאפשר להימנע מפתרון תלות שעלול לקחת זמן רב בזמן ההפעלה.

כשמשתמשים בקובצי אימג' מותאמים אישית של קונטיינרים, כדאי לפעול לפי ההנחיות הבאות:

  • אל תשתמשו בתג :latest עם תמונות בהתאמה אישית. מומלץ לתייג את הגרסאות שלכם בתאריך, בגרסה או במזהה ייחודי. השלב הזה מאפשר לחזור לתצורה מוכרת שעובדת, אם צריך.
  • להשתמש בסביבת הפעלה שתואמת לקובץ אימג' של קונטיינר. הנחיות נוספות לגבי שימוש בקונטיינרים מותאמים אישית זמינות במאמר יצירת קובץ אימג' של קונטיינר.

פרטים על התקנה מראש של יחסי תלות ב-Python זמינים במאמר התקנה מראש של יחסי תלות ב-Python.

שליטה בסביבת ההשקה באמצעות תבניות Dataflow

אם יש עוד תלות בצינור העיבוד, יכול להיות שתצטרכו להתקין אותה גם בסביבת זמן הריצה וגם בסביבת ההפעלה. בסביבת ההשקה פועלת גרסת הייצור של צינור עיבוד הנתונים. סביבת ההשקה צריכה להיות תואמת לסביבת זמן הריצה, ולכן צריך להשתמש באותן גרסאות של יחסי תלות בשתי הסביבות.

כדי ליצור סביבת הפעלה בקונטיינר שאפשר לשחזר, משתמשים בתבניות Flex של Dataflow. למידע נוסף, ראו שימוש בתבניות Flex כדי לארוז צינור עיבוד נתונים ב-Dataflow לצורך פריסה. כשמשתמשים בתבניות Flex, חשוב לקחת בחשבון את הגורמים הבאים:

  • אם מגדירים את צינור העברת הנתונים כחבילה, צריך להתקין את החבילה בקובץ ה-Dockerfile של התבנית. כדי להגדיר את תבנית ה-Flex, מציינים FLEX_TEMPLATE_PYTHON_SETUP_FILE. מידע נוסף זמין במאמר הגדרת משתני סביבה נדרשים ב-Dockerfile.
  • אם אתם משתמשים בקובץ אימג' של קונטיינר מותאם אישית בצינור עיבוד הנתונים, אתם צריכים לספק אותו כשאתם מפעילים את התבנית. מידע נוסף זמין במאמר שימוש במאגר מותאם אישית ליחסי תלות.
  • כדי ליצור קובץ אימג' של Docker לתבנית Flex של Dataflow, משתמשים באותו קובץ אימג' של קונטיינר בהתאמה אישית כקובץ אימג' הבסיסי. מידע נוסף זמין במאמר בנושא שימוש בתמונות קונטיינר בהתאמה אישית.

המבנה הזה מאפשר לשחזר את סביבת ההשקה וגם להתאים אותה לסביבת זמן הריצה.

דוגמה לשיטה הזו מופיעה במדריך Flex Template for a pipeline with dependencies and a custom container ב-GitHub.

מידע נוסף זמין במאמרים התאמת סביבת ההשקה לסביבת זמן הריצה ושליטה בתלויות שבהן נעשה שימוש בצינור במסמכי התיעוד של Apache Beam.

Go

כשמריצים משימות Dataflow באמצעות Apache Beam Go SDK, נעשה שימוש במודולים של Go כדי לנהל את יחסי התלות. הקובץ הבא מכיל את יחסי התלות שמוגדרים כברירת מחדל בזמן ההידור ובזמן הריצה, שבהם משתמש צינור עיבוד הנתונים:

https://raw.githubusercontent.com/apache/beam/vVERSION_NUMBER/sdks/go.sum

מחליפים את VERSION_NUMBER בגרסת ה-SDK שבה אתם משתמשים.

מידע על ניהול יחסי תלות בצינור Go זמין במאמר ניהול יחסי תלות במסמכי התיעוד של Go.