כתיבה והרצה של משימות Spark Scala ב-Managed Service for Apache Spark

במדריך הזה נסביר איך ליצור ולשלוח משימת Spark Scala לאשכול Managed Service for Apache Spark, כולל איך:

  • לכתוב ולקמפל אפליקציית Spark Scala "Hello World" במכונה מקומית משורת הפקודה באמצעות Scala REPL (Read-Evaluate-Print-Loop או מפרש אינטראקטיבי) או כלי ה-build של SBT.
  • חבילה של מחלקות Scala שעברו קומפילציה לקובץ jar עם מניפסט
  • לשלוח את קובץ ה-JAR של Scala למשימת Spark שפועלת באשכול של Managed Service for Apache Spark
  • בדיקת הפלט של משימת Scala במסוף Google Cloud

במדריך הזה מוסבר גם איך:

  • לכתוב ולהריץ משימת MapReduce של WordCount ב-Spark Scala ישירות באשכול של Managed Service for Apache Spark באמצעות spark-shell REPL

  • להריץ דוגמאות של Apache Spark ו-Hadoop שמותקנות מראש באשכול

הגדרת פרויקט ב- Google Cloud

אם עדיין לא עשיתם את זה:

  1. להגדרת פרויקט
  2. יצירת קטגוריה של Cloud Storage
  3. יצירת אשכול Managed Service for Apache Spark

לכתוב ולקמפל קוד Scala באופן מקומי

כדי להתנסות, כתבו אפליקציית Hello World ב-Scala באמצעות Scala REPL או ממשק שורת הפקודה של SBT באופן מקומי במחשב הפיתוח.

שימוש ב-Scala

  1. מורידים את הקבצים הבינאריים של Scala מהדף Scala Install.
  2. פורקים את הקובץ, מגדירים את משתנה הסביבה SCALA_HOME ומוסיפים אותו לנתיב, כמו שמוסבר בהוראות להתקנת Scala. לדוגמה:

    export SCALA_HOME=/usr/local/share/scala
    export PATH=$PATH:$SCALA_HOME/
    

  3. הפעלת Scala REPL

    $ scala
    Welcome to Scala version ...
    Type in expressions to have them evaluated.
    Type :help for more information.
    scala>
    

  4. מעתיקים את הקוד של HelloWorld ומדביקים אותו ב-Scala REPL

    object HelloWorld {
      def main(args: Array[String]): Unit = {
        println("Hello, world!")
      }
    }

  5. שומרים את HelloWorld.scala ויוצאים מה-REPL

    scala> :save HelloWorld.scala
    scala> :q
    

  6. הידור באמצעות scalac

    $ scalac HelloWorld.scala
    

  7. רשימת קובצי .class שעברו קומפילציה

    $ ls HelloWorld*.class
    HelloWorld$.class   HelloWorld.class
    

שימוש ב-SBT

  1. הורדת SBT

  2. יוצרים פרויקט בשם HelloWorld, כמו שמוצג בהמשך.

    $ mkdir hello
    $ cd hello
    $ echo \
    'object HelloWorld {def main(args: Array[String]) = println("Hello, world!")}' > \
    HelloWorld.scala
    

  3. יוצרים קובץ תצורה של sbt.build כדי להגדיר את artifactName (השם של קובץ ה-jar שתיצרו בהמשך) ל-"HelloWorld.jar" (ראו שינוי פריטי מידע שנוצרו בתהליך הפיתוח (Artifact) שמוגדרים כברירת מחדל).

    echo \
    'artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
    "HelloWorld.jar" }' > \
    build.sbt
    

  4. מפעילים את SBT ומריצים את הקוד

    $ sbt
    [info] Set current project to hello ...
    > run
    ... Compiling 1 Scala source to .../hello/target/scala-.../classes...
    ... Running HelloWorld
    Hello, world!
    [success] Total time: 3 s ...
    

  5. אורזים את הקוד בקובץ jar עם מניפסט שמציין את נקודת הכניסה הראשית של המחלקה (HelloWorld), ואז יוצאים

    > package
    ... Packaging .../hello/target/scala-.../HelloWorld.jar ...
    ... Done packaging.
    [success] Total time: ...
    > exit
    

יצירת צנצנת

יוצרים קובץ jar באמצעות SBT או באמצעות הפקודה jar.

יצירת צנצנת

עם SBT

הפקודה package של SBT יוצרת קובץ jar (ראו שימוש ב-SBT).

יצירת צנצנת

באופן ידני

  1. משנים את הספרייה (cd) לספרייה שמכילה את קובצי ה-HelloWorld*.class שעברו הידור, ואז מריצים את הפקודה הבאה כדי לארוז את קובצי ה-class לקובץ jar עם מניפסט שמציין את נקודת הכניסה של ה-class הראשי (HelloWorld).
    $ jar cvfe HelloWorld.jar HelloWorld HelloWorld*.class
    added manifest
    adding: HelloWorld$.class(in = 637) (out= 403)(deflated 36%)
    adding: HelloWorld.class(in = 586) (out= 482)(deflated 17%)
    

העתקת קובץ ה-JAR ל-Cloud Storage

  1. משתמשים ב-Google Cloud CLI כדי להעתיק את קובץ ה-JAR לקטגוריה של Cloud Storage בפרויקט.
$ gcloud storage cp HelloWorld.jar gs://<bucket-name>/
Copying file://HelloWorld.jar [Content-Type=application/java-archive]...
Uploading   gs://bucket-name/HelloWorld.jar:         1.46 KiB/1.46 KiB

שליחת קובץ ה-JAR למשימה ב-Managed Service for Apache Spark

  1. משתמשים במסוףGoogle Cloud כדי לשלוח את קובץ ה-JAR למשימה ב-Managed Service for Apache Spark. ממלאים את השדות בדף Submit a job באופן הבא:

    • Select compute type for job: Spark on Compute Engine
    • פרטי המשימה באשכול:
      • Cluster: בוחרים את שם האשכול מרשימת האשכולות.
    • קבצים ופריטי מידע שנוצרו בתהליך הפיתוח (Artifact):

      • סוג העבודה:‏ Spark (Scala / Java)
      • Driver configuration: בוחרים באפשרות Main jar URI, ובשדה Main jar מציינים את נתיב ה-URI של Cloud Storage לקובץ ה-JAR של HelloWorld (gs://your-bucket-name/HelloWorld.jar).

        אם קובץ ה-JAR לא כולל מניפסט שמציין את נקודת הכניסה לקוד ("Main-Class: HelloWorld"), בוחרים באפשרות Main class בקטע Driver configuration, מזינים את שם המחלקה הראשית ("HelloWorld") בשדה Main class וממלאים בשדה Jar files את נתיב ה-URI לקובץ ה-JAR (gs://your-bucket-name/HelloWorld.jar).

  2. לוחצים על Submit כדי להתחיל את המשימה. אחרי שהמשימה מתחילה, היא מתווספת לרשימת המשימות.

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

כתיבה והרצה של קוד Spark Scala באמצעות spark-shell REPL של האשכול

יכול להיות שתרצו לפתח אפליקציות Scala ישירות באשכול של Managed Service for Apache Spark. ‫Hadoop ו-Spark מותקנים מראש באשכולות של Managed Service for Apache Spark, והם מוגדרים עם החיבור ל-Cloud Storage, שמאפשר לקוד שלכם לקרוא ולכתוב נתונים ישירות מ-Cloud Storage ואליו.

בדוגמה הזו מוסבר איך משתמשים ב-SSH כדי להתחבר לצומת הראשי של אשכול Managed Service for Apache Spark, ואז משתמשים ב-REPL של spark-shell כדי ליצור ולהריץ אפליקציית mapreduce של ספירת מילים ב-Scala.

  1. שימוש ב-SSH כדי להתחבר לצומת הראשי של האשכול

    1. נכנסים לדף Clusters במסוף Google Cloud ולוחצים על שם האשכול.

    2. בדף הפרטים של האשכול, בוחרים בכרטיסייה VM Instances ולוחצים על האפשרות SSH שמופיעה בצד ימין של שורת השם של האשכול.

      ייפתח חלון דפדפן בספריית הבית בצומת הראשי.

  2. הפעלת spark-shell

    $ spark-shell
    ...
    Using Scala version ...
    Type in expressions to have them evaluated.
    Type :help for more information.
    ...
    Spark context available as sc.
    ...
    SQL context available as sqlContext.
    scala>
    

  3. יוצרים RDD (קבוצה עמידה של נתונים מבוזרים) מקטע טקסט של שייקספיר שנמצא ב-Cloud Storage בענן הציבורי.

    scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")
    

  4. מריצים mapreduce של ספירת מילים על הטקסט, ואז מציגים את התוצאה של wordcounts

    scala> val wordCounts = text_file.flatMap(line => line.split(" ")).map(word =>
    (word, 1)).reduceByKey((a, b) => a + b)
    scala> wordCounts.collect
    ... Array((call,1), (What's,1), (sweet.,1), (we,1), (as,1), (name?,1), (any,1), (other,1),
    (rose,1), (smell,1), (name,1), (a,2), (would,1), (in,1), (which,1), (That,1), (By,1))
    

  5. שומרים את הספירות ב-<bucket-name>/wordcounts-out ב-Cloud Storage, ואז יוצאים מ-scala-shell

    scala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/")
    scala> exit
    

  6. שימוש ב-CLI של gcloud כדי להציג את רשימת קובצי הפלט ואת תוכן הקבצים

    $ gcloud storage ls gs://bucket-name/wordcounts-out/
    gs://spark-scala-demo-bucket/wordcounts-out/
    gs://spark-scala-demo-bucket/wordcounts-out/_SUCCESS
    gs://spark-scala-demo-bucket/wordcounts-out/part-00000
    gs://spark-scala-demo-bucket/wordcounts-out/part-00001
    

  7. בדיקת התוכן של gs://<bucket-name>/wordcounts-out/part-00000

    $ gcloud storage cat gs://bucket-name/wordcounts-out/part-00000
    (call,1)
    (What's,1)
    (sweet.,1)
    (we,1)
    (as,1)
    (name?,1)
    (any,1)
    (other,1)
    

הרצת הקוד לדוגמה שהותקן מראש

צומת המאסטר של האשכול מכיל קובצי JAR שניתן להריץ, עם דוגמאות סטנדרטיות של Apache Hadoop ו-Spark.

סוג הצנצנת Master node /usr/lib/ location מקור ב-GitHub מסמכי תיעוד של Apache
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar קישור למקור מדריך MapReduce
Spark spark/lib/spark-examples.jar קישור למקור דוגמאות ל-Spark

שליחת דוגמאות לאשכול משורת הפקודה

אפשר לשלוח דוגמאות ממחשב הפיתוח המקומי באמצעות כלי שורת הפקודה gcloud של Google Cloud CLI (ראו שימוש במסוף Google Cloud כדי לשלוח משימות ממסוף Google Cloud ).

דוגמה ל-Hadoop WordCount

gcloud dataproc jobs submit hadoop --cluster=cluster-name \
    --region=region \
    --jars=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
    --class=org.apache.hadoop.examples.WordCount \
    -- URI of input file URI of output file

דוגמה ל-Spark WordCount

gcloud dataproc jobs submit spark --cluster=cluster-name \
    --region=region \
    --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \
    --class=org.apache.spark.examples.JavaWordCount \
    -- URI of input file

כיבוי האשכול

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

כדי להשבית אשכול:

gcloud dataproc clusters delete cluster-name \
    --region=region

כדי למחוק את קובץ ה-JAR של Cloud Storage:

gcloud storage rm gs://bucket-name/HelloWorld.jar

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

gcloud storage rm gs://bucket-name/ --recursive

המאמרים הבאים