במדריך הזה נסביר איך ליצור ולשלוח משימת 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-shellREPLלהריץ דוגמאות של Apache Spark ו-Hadoop שמותקנות מראש באשכול
הגדרת פרויקט ב- Google Cloud
אם עדיין לא עשיתם את זה:
לכתוב ולקמפל קוד Scala באופן מקומי
כדי להתנסות, כתבו אפליקציית Hello World ב-Scala באמצעות Scala REPL או ממשק שורת הפקודה של SBT באופן מקומי במחשב הפיתוח.
שימוש ב-Scala
- מורידים את הקבצים הבינאריים של Scala מהדף Scala Install.
פורקים את הקובץ, מגדירים את משתנה הסביבה
SCALA_HOMEומוסיפים אותו לנתיב, כמו שמוסבר בהוראות להתקנת Scala. לדוגמה:export SCALA_HOME=/usr/local/share/scala export PATH=$PATH:$SCALA_HOME/
הפעלת Scala REPL
$ scala Welcome to Scala version ... Type in expressions to have them evaluated. Type :help for more information. scala>
מעתיקים את הקוד של
HelloWorldומדביקים אותו ב-Scala REPLobject HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
שומרים את
HelloWorld.scalaויוצאים מה-REPLscala> :save HelloWorld.scala scala> :q
הידור באמצעות
scalac$ scalac HelloWorld.scala
רשימת קובצי
.classשעברו קומפילציה$ ls HelloWorld*.class HelloWorld$.class HelloWorld.class
שימוש ב-SBT
יוצרים פרויקט בשם HelloWorld, כמו שמוצג בהמשך.
$ mkdir hello $ cd hello $ echo \ 'object HelloWorld {def main(args: Array[String]) = println("Hello, world!")}' > \ HelloWorld.scalaיוצרים קובץ תצורה של
sbt.buildכדי להגדיר אתartifactName(השם של קובץ ה-jar שתיצרו בהמשך) ל-"HelloWorld.jar" (ראו שינוי פריטי מידע שנוצרו בתהליך הפיתוח (Artifact) שמוגדרים כברירת מחדל).echo \ 'artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) => "HelloWorld.jar" }' > \ build.sbtמפעילים את 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 ...
אורזים את הקוד בקובץ jar עם מניפסט שמציין את נקודת הכניסה הראשית של המחלקה (
HelloWorld), ואז יוצאים> package ... Packaging .../hello/target/scala-.../HelloWorld.jar ... ... Done packaging. [success] Total time: ... > exit
יצירת צנצנת
יוצרים קובץ jar באמצעות SBT או באמצעות הפקודה jar.
יצירת צנצנת
עם SBT
הפקודה package של SBT יוצרת קובץ jar (ראו שימוש ב-SBT).
יצירת צנצנת
באופן ידני
- משנים את הספרייה (
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
- משתמשים ב-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
משתמשים במסוף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).
לוחצים על Submit כדי להתחיל את המשימה. אחרי שהמשימה מתחילה, היא מתווספת לרשימת המשימות.
לוחצים על מזהה המשימה כדי לפתוח את הדף 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.
שימוש ב-SSH כדי להתחבר לצומת הראשי של האשכול
נכנסים לדף Clusters במסוף Google Cloud ולוחצים על שם האשכול.
בדף הפרטים של האשכול, בוחרים בכרטיסייה VM Instances ולוחצים על האפשרות SSH שמופיעה בצד ימין של שורת השם של האשכול.
ייפתח חלון דפדפן בספריית הבית בצומת הראשי.
הפעלת
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>
יוצרים RDD (קבוצה עמידה של נתונים מבוזרים) מקטע טקסט של שייקספיר שנמצא ב-Cloud Storage בענן הציבורי.
scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")מריצים mapreduce של ספירת מילים על הטקסט, ואז מציגים את התוצאה של
wordcountsscala> 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))שומרים את הספירות ב-
<bucket-name>/wordcounts-outב-Cloud Storage, ואז יוצאים מ-scala-shellscala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/") scala> exitשימוש ב-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
בדיקת התוכן של
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