מבוא ל- Apache Beam

1. סקירה כללית

במדריך זה נציג את Apache Beam ונחקור את מושגי היסוד שלה.

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

2. מה זה אפאצ'י קרן?

Apache Beam (Batch + strEAM) הוא מודל תכנות מאוחד עבור עבודות עיבוד נתונים באצווה וזרם. הוא מספק ערכת פיתוח תוכנה להגדרה ולבנייה של צינורות לעיבוד נתונים וכן לרצים לביצועם.

Apache Beam נועד לספק שכבת תכנות ניידת. למעשה, Bunn Pipeline Runners מתרגמים את צינור עיבוד הנתונים ל- API התואם את ה- backend שבחר המשתמש. נכון לעכשיו, תומכי עיבוד מבוזרים אלה נתמכים:

  • אפאצ'י איפקס
  • אפאצ'י פלינק
  • Apache Gearpump (דגירה)
  • אפאצ'י סמזה
  • Apache Spark
  • זרימת נתונים בענן של גוגל
  • סילון הלוז

3. מדוע קרן אפאצ'י?

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

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

קיימים Java, Python, Go ו- Scala SDKs עבור Apache Beam. ואכן, כל הצוות יכול להשתמש בו בשפת הבחירה שלהם.

4. מושגי יסוד

בעזרת Apache Beam נוכל לבנות גרפים של זרימת עבודה (צינורות) ולבצע אותם. מושגי המפתח במודל התכנות הם:

  • PCollection - מייצג מערך נתונים שיכול להיות אצווה קבועה או זרם נתונים
  • PTransform - פעולת עיבוד נתונים שלוקחת אחת או יותר PCollections ויציאות אפס ומעלה PCollectionס
  • צנרת - מייצג גרף אצטלי מכוון של PCollection ו PTransformולכן מכיל את כל עבודת עיבוד הנתונים
  • PipelineRunner - מבצע א צנרת על backend עיבוד מבוזר שצוין

במילים פשוטות, א PipelineRunner מבצע א צנרת, ו צנרת מכיל PCollection ו PTransform.

5. דוגמה לספירת מילים

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

5.1. בניית צינור קרן

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

  1. קרא את הטקסט ממקור.
  2. פצל את הטקסט לרשימת מילים.
  3. אותיות קטנות של כל המילים.
  4. חתוך פיסוק.
  5. סנן מילות עצירה.
  6. ספרו כל מילה ייחודית.

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

5.2. תלות

לפני שנוכל ליישם את גרף זרימת העבודה שלנו, עלינו להוסיף את התלות הליבה של Apache Beam לפרויקט שלנו:

 org.apache.beam beam-sdks-java-core $ {beam.version} 

רצי צינור קרן מסתמכים על גיבוי עיבוד מבוזר לביצוע משימות. בואו נוסיף DirectRunner כתלות זמן ריצה:

 org.apache.beam beam-runners-direct-java $ {beam.version} זמן ריצה 

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

5.3. יישום

Apache Beam משתמש בפרדיגמת התכנות Map-Reduce (זהה ל- Java Streams). למעשה, זה רעיון טוב שיהיה לך מושג בסיסי לְהַפחִית(), לְסַנֵן(), לספור(), מַפָּה(), ו flatMap () לפני שנמשיך.

ליצור צנרת הוא הדבר הראשון שאנחנו עושים:

אפשרויות PipelineOptions = PipelineOptionsFactory.create (); צינור p = Pipeline.create (אפשרויות);

כעת אנו מיישמים את משימת ספירת המילים שלנו בת שישה שלבים:

PCollection wordCount = p .apply ("(1) קרא את כל השורות", TextIO.read (). from (inputFilePath)) .apply ("(2) Flatmap to a list of words", FlatMapElements.into (TypeDescriptors.strings () ) .via (שורה -> Arrays.asList (line.split ("\ s")))). החל ("(3) אותיות קטנות הכל", MapElements.into (TypeDescriptors.strings ()) .via (word - > word.toLowerCase ())) .apply ("(4) חתוך פיסוק", MapElements.into (TypeDescriptors.strings ()) .via (word -> trim (word))) .apply ("(5) מילות עצירה מסננות ", Filter.by (word ->! IsStopWord (word))). החל (" (6) ספירת מילים ", Count.perElement ());

הטיעון הראשון (האופציונלי) של להגיש מועמדות() הוא חוּט זה רק לקריאות טובה יותר של הקוד. הנה מה שכל אחד מהם להגיש מועמדות() עושה בקוד לעיל:

  1. ראשית, אנו קוראים קובץ טקסט קלט שורה אחר שורה באמצעות TextIO.
  2. אם אנו מפצלים כל שורה לפי רווחים לבנים, אנו ממפים אותה לרשימת מילים.
  3. ספירת מילים אינה רגישה לאותיות רישיות, ולכן אנו מקטינים את כל המלים באותיות קטנות.
  4. מוקדם יותר, חילקנו שורות לפי חלל לבן, ובסופו של דבר מילים כמו "מילה!" ו"מילה? ", אז אנו מסירים פיסוק.
  5. מילות עצירה כמו "is" ו- "by" שכיחות כמעט בכל טקסט באנגלית, ולכן אנו מסירים אותן.
  6. לבסוף, אנו סופרים מילים ייחודיות באמצעות הפונקציה המובנית Count.perElement ().

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

ראשית, אנו ממירים את שלנו PCollection ל חוּט. ואז, אנו משתמשים TextIO לכתוב את הפלט:

wordCount.apply (MapElements.into (TypeDescriptors.strings ()) .via (count -> count.getKey () + "->" + count.getValue ())). החל (TextIO.write (). to ( outputFilePath));

עכשיו שלנו צנרת ההגדרה שלמה, אנו יכולים לרוץ ולבדוק אותה.

5.4. ריצה ובדיקה

עד כה הגדרנו א צנרת למשימה ספירת מילים. בשלב זה, בואו ננהל את צנרת:

p.run (). waitUntilFinish ();

בשורת קוד זו, Apache Beam ישלח את המשימה שלנו למספר רב DirectRunner מקרים. כתוצאה מכך, בסוף ייווצרו מספר קבצי פלט. הם יכילו דברים כמו:

... אפאצ'י -> 3 קורות -> 5 סלעים -> 2 ...

הגדרה והפעלה של עבודה מבוזרת ב- Apache Beam היא פשוטה ואקספרסיבית כמו זו. לשם השוואה, יישום ספירת מילים זמין גם ב- Apache Spark, Apache Flink ו- Hazelcast Jet.

6. לאן נלך מכאן?

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

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

7. מסקנה

במדריך זה למדנו מהו Apache Beam ומדוע הוא עדיף על פני חלופות. הדגמנו גם מושגים בסיסיים של Apache Beam עם דוגמה לספירת מילים.

הקוד עבור הדרכה זו זמין באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found