שימוש ב-Apache Spark עם HBase ב-Managed Service for Apache Spark

מטרות

המדריך הזה מסביר איך:

  1. יצירת אשכול Managed Service for Apache Spark, והתקנה של Apache HBase ו-Apache ZooKeeper באשכול
  2. יצירת טבלת HBase באמצעות מעטפת HBase שפועלת בצומת הראשי של אשכול Managed Service for Apache Spark
  3. שימוש ב-Cloud Shell כדי לשלוח משימת Spark ב-Java או ב-PySpark אל Managed Service for Apache Spark, שכותב נתונים לטבלת HBase ואז קורא נתונים ממנה

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

לפני שמתחילים

אם עדיין לא עשיתם זאת, צרו פרויקט ב-Google Cloud Platform.

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Dataproc and Compute Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Dataproc and Compute Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

יצירת אשכול Managed Service for Apache Spark

  1. מריצים את הפקודה הבאה במסוף של סשן Cloud Shell כדי:

    • מתקינים את הרכיבים HBase ו-ZooKeeper
    • הקצאת שלושה צמתי עובדים (מומלץ להקצות שלושה עד חמישה צמתי עובדים כדי להריץ את הקוד במדריך הזה)
    • הפעלת שער הרכיבים
    • שימוש בגרסת תמונה 2.0
    • משתמשים בדגל --properties כדי להוסיף את ההגדרה של HBase ואת הספרייה של HBase לנתיבי המחלקות של מנהל ההתקן והמבצע של Spark.
gcloud dataproc clusters create cluster-name \
    --region=region \
    --optional-components=HBASE,ZOOKEEPER \
    --num-workers=3 \
    --enable-component-gateway \
    --image-version=2.0 \
    --properties='spark:spark.driver.extraClassPath=/etc/hbase/conf:/usr/lib/hbase/*,spark:spark.executor.extraClassPath=/etc/hbase/conf:/usr/lib/hbase/*'

אימות ההתקנה של המחבר

  1. ממסוף Google Cloud או מטרמינל של סשן Cloud Shell, מתחברים באמצעות SSH לצומת הראשי של אשכול Managed Service for Apache Spark.

  2. מאמתים את ההתקנה של מחבר Apache HBase Spark בצומת הראשי:

    ls -l /usr/lib/spark/jars | grep hbase-spark
    
    פלט לדוגמה:
    -rw-r--r-- 1 root root size date time hbase-spark-connector.version.jar
    

  3. משאירים את חלון הטרמינל של סשן ה-SSH פתוח כדי:

    1. יצירת טבלת HBase
    2. (משתמשי Java): מריצים פקודות בצומת הראשי של האשכול כדי לקבוע את הגרסאות של הרכיבים שמותקנים באשכול
    3. סורקים את טבלת ה-Hbase אחרי הרצת הקוד

יצירת טבלת HBase

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

  1. פותחים את מעטפת HBase:

    hbase shell
    

  2. יוצרים את טבלת HBase ‏my-table עם קבוצת העמודות cf:

    create 'my_table','cf'
    

    1. כדי לוודא שהטבלה נוצרה, במסוף Google Cloud לוחצים על HBase בקישורים של רכיב שער המסוףGoogle Cloud כדי לפתוח את ממשק המשתמש של Apache HBase. ‫my-table מופיע בקטע טבלאות בדף דף הבית.

הצגת קוד Spark

Java

package hbase;

import org.apache.hadoop.hbase.spark.datasources.HBaseTableCatalog;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class SparkHBaseMain {
    public static class SampleData implements Serializable {
        private String key;
        private String name;


        public SampleData(String key, String name) {
            this.key = key;
            this.name = name;
        }

        public SampleData() {
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }
    }
    public static void main(String[] args) {
        // Init SparkSession
        SparkSession spark = SparkSession
                .builder()
                .master("yarn")
                .appName("spark-hbase-tutorial")
                .getOrCreate();

        // Data Schema
        String catalog = "{"+"\"table\":{\"namespace\":\"default\", \"name\":\"my_table\"}," +
                "\"rowkey\":\"key\"," +
                "\"columns\":{" +
                "\"key\":{\"cf\":\"rowkey\", \"col\":\"key\", \"type\":\"string\"}," +
                "\"name\":{\"cf\":\"cf\", \"col\":\"name\", \"type\":\"string\"}" +
                "}" +
                "}";

        Map<String, String> optionsMap = new HashMap<String, String>();
        optionsMap.put(HBaseTableCatalog.tableCatalog(), catalog);

        Dataset<Row> ds= spark.createDataFrame(Arrays.asList(
                new SampleData("key1", "foo"),
                new SampleData("key2", "bar")), SampleData.class);

        // Write to HBase
        ds.write()
                .format("org.apache.hadoop.hbase.spark")
                .options(optionsMap)
                .option("hbase.spark.use.hbasecontext", "false")
                .mode("overwrite")
                .save();

        // Read from HBase
        Dataset dataset = spark.read()
                .format("org.apache.hadoop.hbase.spark")
                .options(optionsMap)
                .option("hbase.spark.use.hbasecontext", "false")
                .load();
        dataset.show();
    }
}

Python

from pyspark.sql import SparkSession

# Initialize Spark Session
spark = SparkSession \
  .builder \
  .master('yarn') \
  .appName('spark-hbase-tutorial') \
  .getOrCreate()

data_source_format = ''

# Create some test data
df = spark.createDataFrame(
    [
        ("key1", "foo"),
        ("key2", "bar"),
    ],
    ["key", "name"]
)

# Define the schema for catalog
catalog = ''.join("""{
    "table":{"namespace":"default", "name":"my_table"},
    "rowkey":"key",
    "columns":{
        "key":{"cf":"rowkey", "col":"key", "type":"string"},
        "name":{"cf":"cf", "col":"name", "type":"string"}
    }
}""".split())

# Write to HBase
df.write.format('org.apache.hadoop.hbase.spark').options(catalog=catalog).option("hbase.spark.use.hbasecontext", "false").mode("overwrite").save()

# Read from HBase
result = spark.read.format('org.apache.hadoop.hbase.spark').options(catalog=catalog).option("hbase.spark.use.hbasecontext", "false").load()
result.show()

הרצת הקוד

  1. פותחים טרמינל של סשן Cloud Shell.

  2. משכפלים את מאגר GitHub‏ GoogleCloudDataproc/cloud-dataproc לטרמינל של סשן Cloud Shell:

    git clone https://github.com/GoogleCloudDataproc/cloud-dataproc.git
    

  3. עוברים לספרייה cloud-managed-spark/spark-hbase:

    cd cloud-managed-spark/spark-hbase
    
    פלט לדוגמה:
    user-name@cloudshell:~/cloud-managed-spark/spark-hbase (project-id)$
    

  4. שולחים את המשימה של Managed Service for Apache Spark.

Java

  1. מגדירים את גרסאות הרכיבים בקובץ pom.xml.
    1. בדף גרסאות 2.0.x של Managed Service for Apache Spark מפורטות גרסאות הרכיבים Scala,‏ Spark ו-HBase שמותקנות עם הגרסה המשנית האחרונה ועם ארבע הגרסאות המשניות האחרונות של אימג' 2.0.
      1. כדי למצוא את הגרסה המשנית של אשכול גרסת התמונה 2.0, לוחצים על שם האשכול בדף Clusters במסוףGoogle Cloud כדי לפתוח את הדף Cluster details, שבו מופיעה Image version של האשכול.
    2. לחלופין, אפשר להריץ את הפקודות הבאות בטרמינל של סשן SSH מהצומת הראשי של האשכול כדי לקבוע את גרסאות הרכיבים:
      1. בודקים את גרסת Scala:
        scala -version
        
      2. בודקים את גרסת Spark (לחיצה על Control-D כדי לצאת):
        spark-shell
        
      3. בודקים את הגרסה של HBase:
        hbase version
        
      4. מזהים את יחסי התלות בגרסאות של Spark,‏ Scala ו-HBase ב-Maven‏ pom.xml:
        <properties>
          <scala.version>scala full version (for example, 2.12.14)</scala.version>
          <scala.main.version>scala main version (for example, 2.12)</scala.main.version>
          <spark.version>spark version (for example, 3.1.2)</spark.version>
          <hbase.client.version>hbase version (for example, 2.2.7)</hbase.client.version>
          <hbase-spark.version>1.0.0(the current Apache HBase Spark Connector version)>
        </properties>
        
        הערה: hbase-spark.version היא הגרסה הנוכחית של מחבר Spark HBase. אין לשנות את מספר הגרסה הזה.
    3. עורכים את הקובץ pom.xml ב-Cloud Shell Editor כדי להוסיף את מספרי הגרסאות הנכונים של Scala,‏ Spark ו-HBase. כשמסיימים לערוך, לוחצים על Open Terminal כדי לחזור לשורת הפקודה של הטרמינל ב-Cloud Shell.
      cloudshell edit .
      
    4. עוברים ל-Java 8 ב-Cloud Shell. נדרשת גרסת ה-JDK הזו כדי לבנות את הקוד (אפשר להתעלם מהודעות אזהרה לגבי תוספים):
      sudo update-java-alternatives -s java-1.8.0-openjdk-amd64 && export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
      
    5. אימות ההתקנה של Java 8:
      java -version
      
      פלט לדוגמה:
      openjdk version "1.8..."
       
  2. יוצרים את הקובץ jar:
    mvn clean package
    
    קובץ .jar ממוקם בספריית המשנה /target (לדוגמה, target/spark-hbase-1.0-SNAPSHOT.jar).
  3. שולחים את העבודה.

    gcloud dataproc jobs submit spark \
        --class=hbase.SparkHBaseMain  \
        --jars=target/filename.jar \
        --region=cluster-region \
        --cluster=cluster-name
    
    • --jars: צריך להוסיף את השם של קובץ .jar אחרי target/‎ ולפני ‎.jar.
    • אם לא הגדרתם את נתיבי המחלקות של HBase למנהל ההתקנים ולרכיב ההרצה של Spark כשיצרתם את האשכול, אתם צריכים להגדיר אותם בכל שליחת משימה על ידי הוספת הדגל ‑‑properties הבא לפקודת שליחת המשימה:
      --properties='spark.driver.extraClassPath=/etc/hbase/conf:/usr/lib/hbase/*,spark.executor.extraClassPath=/etc/hbase/conf:/usr/lib/hbase/*'
             

  4. צופים בפלט של טבלת HBase בפלט של הטרמינל בסשן של Cloud Shell:

    Waiting for job output...
    ...
    +----+----+
    | key|name|
    +----+----+
    |key1| foo|
    |key2| bar|
    +----+----+
    

Python

  1. שולחים את העבודה.

    gcloud dataproc jobs submit pyspark scripts/pyspark-hbase.py \
        --region=cluster-region \
        --cluster=cluster-name
    
    • אם לא הגדרתם את נתיבי המחלקות של HBase למנהל ההתקנים ולרכיב ההרצה של Spark כשיצרתם את האשכול, אתם צריכים להגדיר אותם בכל שליחת משימה על ידי הוספת הדגל ‑‑properties הבא לפקודת שליחת המשימה:
      --properties='spark.driver.extraClassPath=/etc/hbase/conf:/usr/lib/hbase/*,spark.executor.extraClassPath=/etc/hbase/conf:/usr/lib/hbase/*'
             

  2. צופים בפלט של טבלת HBase בפלט של הטרמינל בסשן של Cloud Shell:

    Waiting for job output...
    ...
    +----+----+
    | key|name|
    +----+----+
    |key1| foo|
    |key2| bar|
    +----+----+
    

סריקת טבלת HBase

כדי לסרוק את התוכן של טבלת HBase, מריצים את הפקודות הבאות בטרמינל של סשן ה-SSH של הצומת הראשי שפתחתם בקטע אימות ההתקנה של המחבר:

  1. פותחים את מעטפת HBase:
    hbase shell
    
  2. סריקת הטבלה my-table:
    scan 'my_table'
    
    פלט לדוגמה:
    ROW               COLUMN+CELL
     key1             column=cf:name, timestamp=1647364013561, value=foo
     key2             column=cf:name, timestamp=1647364012817, value=bar
    2 row(s)
    Took 0.5009 seconds
    

הסרת המשאבים

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

מחיקת הפרויקט

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת האשכול

  • כדי למחוק את האשכול:
    gcloud dataproc clusters delete cluster-name \
        --region=${REGION}