অ্যাপাচি স্পার্ক এবং লাইটনিং ইঞ্জিনের জন্য সার্ভারলেস ব্যবহার করে স্পার্কের গতি বাড়ান

১. ভূমিকা

এই কোডল্যাবে, আপনি গুগল ক্লাউড সার্ভারলেস ফর অ্যাপাচি স্পার্ক -এর নেটিভ এক্সিকিউশন ইঞ্জিন, লাইটনিং ইঞ্জিন- এর পারফরম্যান্সগত সুবিধাগুলো সম্পর্কে জানবেন এবং পরীক্ষা করে দেখবেন যে এটি কীভাবে সার্ভারলেস ফর অ্যাপাচি স্পার্ক- এ আপনার স্পার্ক ওয়ার্কলোডগুলোকে অপ্টিমাইজ করে।

লাইটনিং ইঞ্জিন ভেলক্স এবং অ্যাপাচি গ্লুটেন ব্যবহার করে। ভেলক্স হলো ডেটা প্রসেসিংয়ের জন্য একটি উচ্চ-ক্ষমতাসম্পন্ন সি++ ইঞ্জিন। অ্যাপাচি গ্লুটেন একটি মধ্যবর্তী স্তর, যা জেভিএম-ভিত্তিক স্পার্ক জবগুলোকে সি++ কোডে রূপান্তর করার দায়িত্বে থাকে, যা ভেলক্স দ্বারা নির্বাহ করা যায়।

এই ডেমোতে TPC-DS ব্যবহার করা হয়েছে, যা ডিসিশন সাপোর্ট সিস্টেমের পারফরম্যান্স মূল্যায়নের জন্য ডিজাইন করা একটি ইন্ডাস্ট্রি-স্ট্যান্ডার্ড বেঞ্চমার্ক। আপনি স্ট্যান্ডার্ড সার্ভারলেস টায়ার ব্যবহার করে একটি নমুনা TPC-DS ডেটাসেট কোয়েরি করার জন্য একটি বেসলাইন PySpark জব সাবমিট করবেন। এরপর, আপনি লাইটনিং ইঞ্জিন সক্রিয় করে প্রিমিয়াম টায়ার ব্যবহার করে হুবহু একই জবটি চালাবেন। সবশেষে, আপনি এক্সিকিউশন টাইম তুলনা করবেন এবং হার্ডওয়্যার-অ্যাক্সিলারেটেড স্পার্ক এক্সিকিউশন গ্রাফে পার্থক্যটি দেখার জন্য Spark UI-তে প্রবেশ করবেন।

ক্লিন আপ বিভাগে বর্ণিত পদ্ধতি অনুযায়ী রিসোর্সগুলো দ্রুত পরিষ্কার করা হলে, এই কোডল্যাবটি চালানোর আনুমানিক খরচ ১.০০ মার্কিন ডলারেরও কম।

আপনি যা করবেন

  • আপনার বেঞ্চমার্ক স্ক্রিপ্ট এবং ফলাফল সংরক্ষণ করার জন্য একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন।
  • Serverless for Apache Spark Standard tier ব্যবহার করে একটি বেসলাইন PySpark ডেটা প্রসেসিং জব চালান।
  • সার্ভারলেস ফর অ্যাপাচি স্পার্ক প্রিমিয়াম টায়ার উইথ লাইটনিং ইঞ্জিন ব্যবহার করে একই কাজটি সম্পাদন করুন।
  • রানটাইম মেট্রিক্স তুলনা করুন
  • নেটিভ ফিজিক্যাল এক্সিকিউশন গ্রাফগুলো তুলনা করতে স্পার্ক হিস্ট্রি সার্ভার UI চালু করুন।

আপনার যা যা লাগবে

২. শুরু করার আগে

একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন।

ক্লাউড শেল শুরু করুন

ক্লাউড শেল হলো গুগল ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ, যা প্রয়োজনীয় টুলস সহ আগে থেকেই লোড করা থাকে।

  1. Google Cloud কনসোলের শীর্ষে থাকা Activate Cloud Shell-এ ক্লিক করুন।
  2. ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনার প্রমাণীকরণ যাচাই করুন:
    gcloud auth list
    
  3. আপনার প্রজেক্টটি কনফিগার করা হয়েছে কিনা তা নিশ্চিত করুন:
    gcloud config get project
    
  4. আপনার প্রজেক্টটি প্রত্যাশা অনুযায়ী সেট করা না থাকলে, এটি সেট করুন:
    export PROJECT_ID=<YOUR_PROJECT_ID>
    gcloud config set project $PROJECT_ID
    

এপিআই সক্ষম করুন

এই কোডল্যাবের জন্য প্রয়োজনীয় সমস্ত এপিআই (API) সক্রিয় করতে এই কমান্ডটি চালান:

gcloud services enable \
    dataproc.googleapis.com \
    storage.googleapis.com \
    compute.googleapis.com

৩. আপনার পরিবেশ প্রস্তুত করুন

এই ধাপে, আপনি এনভায়রনমেন্ট ভেরিয়েবল ইনিশিয়ালাইজ করবেন এবং একটি ক্লাউড স্টোরেজ বাকেট তৈরি করবেন। এই বাকেটটিতে সেই পাইস্পার্ক স্ক্রিপ্টটি থাকবে যা আপনি সার্ভারলেস ফর অ্যাপাচি স্পার্ক-এর উভয় টিয়ারে জমা দেবেন।

পরিবেশ ভেরিয়েবল সেট করুন

ডিফল্ট এনভায়রনমেন্ট ভেরিয়েবল সেট করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডগুলো চালান। আমরা us-central1 রিজিয়নটি ব্যবহার করব, কিন্তু আপনি চাইলে এটি পরিবর্তন করতে পারেন।

export PROJECT_ID=$(gcloud config get-value project)
export REGION="us-central1"
export BUCKET_NAME="spark-benchmark-${PROJECT_ID}-${REGION}"

gcloud config set dataproc/region ${REGION}

একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন

আপনার স্ক্রিপ্ট এবং লগ রাখার জন্য বাকেটটি তৈরি করুন:

gcloud storage buckets create gs://${BUCKET_NAME} \
    --uniform-bucket-level-access \
    --location=${REGION}

TPC-DS ডেটাসেটটি আপনার নিজের বাকেটে কপি করুন

এই ধাপে, আপনি একটি পাবলিক বাকেট থেকে TPC-DS ডেটাসেটটি আপনার নিজের ক্লাউড স্টোরেজ বাকেটে কপি করবেন। এর ফলে আপনার PySpark জবগুলো আপনার প্রজেক্ট থেকে স্থানীয়ভাবে ডেটা পড়তে পারবে।

ডেটাসেটের আকার ও ধরন বেছে নিতে এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:

export DATASET_TYPE="partitioned" # Options: partitioned, nonpartitioned
export DATASET_SIZE="1GB"         # Options: 1GB, 10GB, 100GB, 1000GB (1000GB not available for partitioned)

export SRC_PATH="gs://beam-tpcds/datasets/parquet/${DATASET_TYPE}/${DATASET_SIZE}"
export DATASET_PATH="gs://${BUCKET_NAME}/tpc-ds-dataset/${DATASET_TYPE}/${DATASET_SIZE}"

TPC-DS ডেটা আপনার নিজের বাকেটে কপি করুন:

gcloud storage cp -r ${SRC_PATH}/* ${DATASET_PATH}/

পাইস্পার্ক বেঞ্চমার্ক স্ক্রিপ্ট তৈরি করুন

আমরা একটি পাইস্পার্ক স্ক্রিপ্ট ব্যবহার করব যা আপনার ক্লাউড স্টোরেজ বাকেট থেকে স্ট্যান্ডার্ড TPC-DS টেবিলগুলো রেজিস্টার করবে এবং অ্যাপাচি স্পার্ক পাবলিক রিপোজিটরি থেকে নেওয়া ৫টি স্ট্যান্ডার্ড কোয়েরি এক্সিকিউট করবে। স্ক্রিপ্টটি আর্গুমেন্ট হিসেবে আপনার ডেটাসেটের পাথ গ্রহণ করে।

ক্লাউড শেলে benchmark.py নামে একটি ফাইল তৈরি করুন। ফাইলটি তৈরি করতে আপনি নিম্নলিখিত কমান্ডটি কপি ও পেস্ট করতে পারেন:

cat << 'EOF' > benchmark.py
import argparse
import sys
from pyspark.sql import SparkSession
import time

def main():
    parser = argparse.ArgumentParser(description='TPC-DS Benchmark')
    parser.add_argument('data_path', help='GCS base path for TPC-DS tables')
    args = parser.parse_args()

    base_path = args.data_path

    # Initialize Spark Session
    spark = SparkSession.builder \
        .appName("TPC-DS Benchmark") \
        .getOrCreate()

    print(f"Spark Session created. Registering TPC-DS tables from {base_path}...")

    # List of all 24 TPC-DS tables
    tables = [
        "call_center", "catalog_page", "catalog_returns", "catalog_sales",
        "customer", "customer_address", "customer_demographics", "date_dim",
        "household_demographics", "income_band", "inventory", "item",
        "promotion", "reason", "ship_mode", "store", "store_returns",
        "store_sales", "time_dim", "warehouse", "web_page", "web_returns",
        "web_sales", "web_site"
    ]

    # Register each table as a temporary view
    # For this subset of queries, not every table is used
    for table in tables:
        path = f"{base_path}/{table}"
        try:
            df = spark.read.parquet(path)
            df.createOrReplaceTempView(table)
        except Exception as e:
            print(f"Warning: Could not load table {table} from {path}. Error: {e}")

    print("Tables registered successfully. Starting benchmark queries from Apache Spark test suite...")

    # Standard TPC-DS Queries sourced from Apache Spark public repository:
    # https://github.com/apache/spark/tree/master/sql/core/src/test/resources/tpcds
    queries = {
        "Q1": """
            WITH customer_total_return AS (
              SELECT sr_customer_sk AS ctr_customer_sk,
                     sr_store_sk AS ctr_store_sk,
                     sum(sr_return_amt) AS ctr_total_return
              FROM store_returns, date_dim
              WHERE sr_returned_date_sk = d_date_sk
                AND d_year = 2000
              GROUP BY sr_customer_sk, sr_store_sk
            )
            SELECT c_customer_id
            FROM customer_total_return ctr1, store, customer
            WHERE ctr1.ctr_total_return > (
              SELECT avg(ctr_total_return) * 1.2
              FROM customer_total_return ctr2
              WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk
            )
              AND s_store_sk = ctr1.ctr_store_sk
              AND s_state = 'TN'
              AND ctr1.ctr_customer_sk = c_customer_sk
            ORDER BY c_customer_id
            LIMIT 100
        """,
        "Q2": """
            WITH wscs AS (
              SELECT sold_date_sk, sales_price
              FROM (
                SELECT ws_sold_date_sk AS sold_date_sk, ws_ext_sales_price AS sales_price
                FROM web_sales
                UNION ALL
                SELECT cs_sold_date_sk AS sold_date_sk, cs_ext_sales_price AS sales_price
                FROM catalog_sales
              )
            ),
            wswscs AS (
              SELECT d_week_seq,
                     sum(CASE WHEN (d_day_name='Sunday') THEN sales_price ELSE null END) AS sun_sales,
                     sum(CASE WHEN (d_day_name='Monday') THEN sales_price ELSE null END) AS mon_sales,
                     sum(CASE WHEN (d_day_name='Tuesday') THEN sales_price ELSE null END) AS tue_sales,
                     sum(CASE WHEN (d_day_name='Wednesday') THEN sales_price ELSE null END) AS wed_sales,
                     sum(CASE WHEN (d_day_name='Thursday') THEN sales_price ELSE null END) AS thu_sales,
                     sum(CASE WHEN (d_day_name='Friday') THEN sales_price ELSE null END) AS fri_sales,
                     sum(CASE WHEN (d_day_name='Saturday') THEN sales_price ELSE null END) AS sat_sales
              FROM wscs, date_dim
              WHERE d_date_sk = sold_date_sk
              GROUP BY d_week_seq
            )
            SELECT d_week_seq1,
                   round(sun_sales1/sun_sales2, 2),
                   round(mon_sales1/mon_sales2, 2),
                   round(tue_sales1/tue_sales2, 2),
                   round(wed_sales1/wed_sales2, 2),
                   round(thu_sales1/thu_sales2, 2),
                   round(fri_sales1/fri_sales2, 2),
                   round(sat_sales1/sat_sales2, 2)
            FROM (
              SELECT wswscs.d_week_seq AS d_week_seq1,
                     sun_sales AS sun_sales1, mon_sales AS mon_sales1,
                     tue_sales AS tue_sales1, wed_sales AS wed_sales1,
                     thu_sales AS thu_sales1, fri_sales AS fri_sales1,
                     sat_sales AS sat_sales1
              FROM wswscs, date_dim
              WHERE date_dim.d_week_seq = wswscs.d_week_seq
                AND d_year = 2001
            ) y,
            (
              SELECT wswscs.d_week_seq AS d_week_seq2,
                     sun_sales AS sun_sales2, mon_sales AS mon_sales2,
                     tue_sales AS tue_sales2, wed_sales AS wed_sales2,
                     thu_sales AS thu_sales2, fri_sales AS fri_sales2,
                     sat_sales AS sat_sales2
              FROM wswscs, date_dim
              WHERE date_dim.d_week_seq = wswscs.d_week_seq
                AND d_year = 2001 + 1
            ) z
            WHERE d_week_seq1 = d_week_seq2 - 53
            ORDER BY d_week_seq1
        """,
        "Q3": """
            SELECT dt.d_year,
                   item.i_brand_id AS brand_id,
                   item.i_brand AS brand,
                   sum(ss_ext_sales_price) AS sum_agg
            FROM date_dim dt,
                 store_sales,
                 item
            WHERE dt.d_date_sk = store_sales.ss_sold_date_sk
              AND store_sales.ss_item_sk = item.i_item_sk
              AND item.i_manufact_id = 436
              AND dt.d_moy = 12
            GROUP BY dt.d_year,
                     item.i_brand,
                     item.i_brand_id
            ORDER BY dt.d_year,
                     sum_agg DESC,
                     brand_id
            LIMIT 100
        """,
        "Q7": """
            SELECT i_item_id,
                   avg(ss_quantity) AS agg1,
                   avg(ss_list_price) AS agg2,
                   avg(ss_coupon_amt) AS agg3,
                   avg(ss_sales_price) AS agg4
            FROM store_sales,
                 customer_demographics,
                 date_dim,
                 item,
                 promotion
            WHERE ss_sold_date_sk = d_date_sk
              AND ss_item_sk = i_item_sk
              AND ss_cdemo_sk = cd_demo_sk
              AND ss_promo_sk = p_promo_sk
              AND cd_gender = 'M'
              AND cd_marital_status = 'S'
              AND cd_education_status = 'College'
              AND (p_channel_email = 'N' OR p_channel_event = 'N')
              AND d_year = 2000
            GROUP BY i_item_id
            ORDER BY i_item_id
            LIMIT 100
        """,
        "Q19": """
            SELECT i_item_id,
                   i_brand,
                   i_category,
                   i_class,
                   i_manufact,
                   sum(ss_ext_sales_price) AS sales,
                   sum(ss_net_profit) AS profit
            FROM date_dim,
                 store_sales,
                 item,
                 customer,
                 store
            WHERE d_date_sk = ss_sold_date_sk
              AND i_item_sk = ss_item_sk
              AND d_year = 2000
              AND d_moy = 12
              AND c_customer_sk = ss_customer_sk
              AND s_store_sk = ss_store_sk
              AND i_manager_id = 9
            GROUP BY i_item_id,
                     i_brand,
                     i_category,
                     i_class,
                     i_manufact
            ORDER BY i_item_id,
                     i_brand,
                     i_category,
                     i_class,
                     i_manufact
            LIMIT 100
        """
    }

    total_start_time = time.time()

    for query_name, query_sql in queries.items():
        print(f"\nExecuting {query_name}...")
        query_start = time.time()

        # Execute query and force action using show()
        result_df = spark.sql(query_sql)
        result_df.show(5) # Show top 5 rows

        query_end = time.time()
        print(f"{query_name} completed in {query_end - query_start:.2f} seconds.")

    total_end_time = time.time()
    print(f"\nAll benchmark queries completed in {total_end_time - total_start_time:.2f} seconds.")

    spark.stop()

if __name__ == "__main__":
    main()
EOF

স্ক্রিপ্টটি আপনার ক্লাউড স্টোরেজ বাকেটে কপি করুন যাতে সার্ভারলেস ফর অ্যাপাচি স্পার্ক এটি অ্যাক্সেস করতে পারে:

gcloud storage cp benchmark.py gs://${BUCKET_NAME}/scripts/benchmark.py

৪. বেসলাইন সার্ভারলেস জবটি চালান

Lightning Engine ছাড়া একটি বেসলাইন তুলনা করার জন্য, আপনার পূর্বে আপলোড করা PySpark বেঞ্চমার্কিং জবটি Serverless for Apache Spark Standard টিয়ারে জমা দিন। আপনার কপি করা ডেটাসেটের পাথটি আমরা একটি আর্গুমেন্ট হিসেবে পাঠিয়ে দেব।

ব্যাচ জবটি কার্যকর করতে নিম্নলিখিত কমান্ডটি চালান:

gcloud dataproc batches submit pyspark \
    gs://${BUCKET_NAME}/scripts/benchmark.py \
    --region=${REGION} \
    --version=2.3 \
    --deps-bucket=gs://${BUCKET_NAME} \
    -- ${DATASET_PATH}

কাজটি পর্যবেক্ষণ করুন

কাজটি চলার সময়, আপনি আপনার ক্লাউড শেল টার্মিনালে পাইস্পার্ক লগগুলো স্ট্রিম হতে দেখবেন। সার্ভারলেস ফর অ্যাপাচি স্পার্ক কন্টেইনার বরাদ্দ করছে, ক্লাউড স্টোরেজ থেকে টিপিসি-ডিএস পার্কেট ডেটাসেট পড়ছে এবং জটিল এসকিউএল প্ল্যানগুলো কার্যকর করছে।

স্ক্রিপ্টটি সম্পন্ন হলে, কনসোল আউটপুট পর্যবেক্ষণ করুন। আপনি সম্পাদিত প্রতিটি স্ট্যান্ডার্ড কোয়েরির ফলাফল এবং সময় দেখতে পাবেন, যা দেখতে অনেকটা নিম্নরূপ:

...
Executing Q1...
+-------------+
|c_customer_id|
+-------------+
...

Q1 completed in 18.52 seconds.
...

All benchmark queries completed in 110.94 seconds.

সম্পূর্ণ হতে মোট কত সেকেন্ড সময় লেগেছে তা লিখে রাখুন। এটাই আপনার বেসলাইন রানটাইম

৫. সার্ভারলেস প্রিমিয়াম এবং লাইটনিং ইঞ্জিন দিয়ে চালান

এরপরে, আপনি Serverless for Apache Spark- এ হুবহু একই Spark জবটি চালাবেন, কিন্তু এবার Premium টায়ার ব্যবহার করে এবং Google-এর নিজস্ব, ভেক্টরাইজড কোয়েরি ইঞ্জিন: Lightning Engine সক্রিয় করে।

স্পষ্টভাবে লাইটনিং ইঞ্জিন সক্রিয় করে বেঞ্চমার্ক জবটি সার্ভারলেস-এ জমা দিন:

gcloud dataproc batches submit pyspark \
    gs://${BUCKET_NAME}/scripts/benchmark.py \
    --region=${REGION} \
    --version=2.3 \
    --deps-bucket=gs://${BUCKET_NAME} \
    --properties="dataproc.tier=premium,spark.dataproc.lightningEngine.runtime=native" \
    -- ${DATASET_PATH}

ফলাফলগুলো তুলনা করুন

কাজটি সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করুন এবং আউটপুটটি পরীক্ষা করুন। আপনি একই কোয়েরির ফলাফল দেখতে পাবেন। সমাপ্তির সময়টি ভালোভাবে লক্ষ্য করুন:

...
All benchmark queries completed in 64.24 seconds.

বেসলাইন সার্ভারলেস রানের সাথে সার্ভারলেস লাইটনিং ইঞ্জিন রানের তুলনা করলে আপনি লক্ষ্য করবেন যে, লাইটনিং ইঞ্জিন ব্যাকএন্ডে একটি নেটিভ C++ এক্সিকিউশন লেয়ার এবং ভেক্টরাইজড প্রসেসিং ব্যবহার করার মাধ্যমে গ্রুপিং, অ্যাগ্রিগেশন এবং জয়েন অপারেশনগুলো আরও দ্রুত সম্পাদন করে, এবং এর জন্য আপনার পাইস্পার্ক অ্যাপ্লিকেশন কোডে কোনো রকম পরিবর্তনের প্রয়োজন হয় না।

ওয়ার্কলোড যত বড় হয়, লাইটনিং ইঞ্জিনের পারফরম্যান্স তত উন্নত হয়। এই উদাহরণে আমরা একটি ছোট ডেটাসেট ব্যবহার করছি, তাই পারফরম্যান্সের উন্নতি ততটা চোখে পড়ার মতো নয় যতটা হতে পারত। বেঞ্চমার্কে দেখা গেছে, একটি ১০ টেরাবাইট ডেটাসেটে ওপেন সোর্স স্পার্কের তুলনায় ৪.৩ গুণ পর্যন্ত পারফরম্যান্সের উন্নতি হয়েছে

৬. স্পার্ক UI-তে এক্সিকিউশন গ্রাফগুলো তুলনা করুন

রানটাইম হ্রাস চিত্তাকর্ষক, কিন্তু চলুন দেখি কোয়েরি নির্বাহের সময় স্পার্ক আসলে আড়ালে কী করছে। আপনি উভয় জবের জন্য স্পার্ক UI এক্সিকিউশন গ্রাফ পরীক্ষা করে এটি করতে পারেন।

  1. আপনার ব্রাউজারে গুগল ক্লাউড কনসোলটি খুলুন।
  2. Dataproc > Batches- এ যান।
  3. আপনি তালিকায় দুটি ব্যাচ দেখতে পাবেন: আপনার স্ট্যান্ডার্ড বেসলাইন রান এবং আপনার প্রিমিয়াম টিয়ার রান।
  4. আপনার চালানো প্রিমিয়াম টায়ার ব্যাচটিতে ক্লিক করুন, তারপর 'View Spark UI'-তে ক্লিক করুন এবং এরপর 'View Details'-এ ক্লিক করুন।
  5. Spark UI-তে, Jobs ট্যাবে যান।
  6. সম্পন্ন কাজ (Completed Jobs) এর অধীনে, সার্চ বক্সে Velox টাইপ করুন।
  7. আপনি অনেক চাকরির বিবরণে VeloxSparkPlanExecApi অন্তর্ভুক্ত দেখতে পাবেন। এটি Lightning Engine দ্বারা ব্যবহৃত Velox-এর নেটিভ এক্সিকিউশন ইঞ্জিনকে বোঝায়।

এখন, স্ট্যান্ডার্ড টিয়ার রানের জন্য এই প্রক্রিয়াটি পুনরাবৃত্তি করুন:

  1. সার্ভারলেস ফর অ্যাপাচি স্পার্ক ব্যাচেস পৃষ্ঠায় ফিরে যান।
  2. স্ট্যান্ডার্ড টিয়ার ব্যাচের লিঙ্কে ক্লিক করুন, তারপর 'View Spark UI'-তে ক্লিক করুন এবং তারপর 'View Details'-এ ক্লিক করুন।
  3. Spark UI-তে, Jobs ট্যাবে যান।
  4. সম্পন্ন কাজ (Completed Jobs) এর অধীনে, সার্চ বক্সে Velox টাইপ করুন।
  5. চাকরির বিবরণে ভেলক্স এপিআই-এর কোনো উল্লেখ দেখতে পাবেন না।

৭. পরিষ্কার করুন

আপনার গুগল ক্লাউড অ্যাকাউন্টে চলমান চার্জ এড়াতে, এই কোডল্যাব চলাকালীন তৈরি করা রিসোর্সগুলো মুছে ফেলুন।

ক্লাউড শেলে, ক্লাউড স্টোরেজ বাকেট এবং এর ভেতরের সবকিছু মুছে ফেলুন:

gcloud storage rm -r gs://${BUCKET_NAME}

আপনার স্থানীয় benchmark.py ফাইলটি মুছে ফেলুন:

rm benchmark.py

৮. অভিনন্দন

অভিনন্দন! আপনি সফলভাবে অ্যাপাচি স্পার্কের জন্য একটি বেঞ্চমার্কিং পরিবেশ তৈরি করেছেন এবং অ্যাপাচি স্পার্ক স্ট্যান্ডার্ডের সার্ভারলেস-এর সাথে অ্যাপাচি স্পার্ক প্রিমিয়ামের সার্ভারলেস-এর তুলনা করেছেন।

আপনি সরাসরি দেখেছেন কিভাবে অ্যাপাচি স্পার্কের নতুন লাইটনিং ইঞ্জিনের জন্য সার্ভারলেস সক্রিয় করলে আপনার স্পার্ক ওয়ার্কলোডের রানটাইম কমে যেতে পারে, এবং আপনি স্পার্ক ইউআই ঘুরে দেখেছেন কিভাবে নেটিভ কোয়েরি ইঞ্জিন ব্যবহার করে ফিজিক্যাল এক্সিকিউশন গ্রাফকে নেটিভ C++ কোডে রূপান্তরিত করা হয়।

আপনি যা শিখেছেন

  • পাইস্পার্ক ডেটাসেট বেঞ্চমার্কিং স্ক্রিপ্ট কীভাবে লিখতে হয়।
  • অ্যাপাচি স্পার্কের জন্য সার্ভারলেস-এ কীভাবে স্পার্ক জব জমা দিতে হয়।
  • কীভাবে লাইটনিং ইঞ্জিন সক্রিয় করবেন।
  • Spark UI-তে কীভাবে জব প্ল্যানগুলির তুলনা করবেন

পরবর্তী পদক্ষেপ