Một chương trình Apache Spark siêu đơn giản

Các bài viết về Apache Spark

Phần 1: Hướng Dẫn Cài Apache Spark Trên Ubuntu
Phần 2: Một chương trình Apache Spark siêu đơn giản
Phần 3: Tạo Fat Jar cho chương trình Apache Spark


Trong bài viết này, mình hướng dẫn các bạn tạo 1 chương trình siêu đơn giản bằng ngôn ngữ Scala

Yêu cầu

Đã cài Apache Spark

1. Cài sbt

sbt là công cụ biên dịch (build tool) scala thành gói jar. Nó tương tự với Maven, Gradle mà chúng ta thường dùng để biên dịch Java.

Vào https://www.scala-sbt.org/download.html sẽ có hướng dẫn cụ thể, đúng với nền tảng bạn đang dùng (Windows, Linux, MacOS, …) . Mình khuyên các bạn nên dùng hệ điều hành Ubuntu.

Đối với Ubuntu thì câu lệnh như sau (cập nhật ngày 10 tháng 2 năm 2021) các bạn nên kiểm tra lại trong trường hợp link có thay đổi

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | sudo apt-key add
sudo apt-get update
sudo apt-get install sbt

Kiểm tra bằng câu lệnh

sbt --version

2. Tạo cấu trúc tập tin cho chương trình siêu đơn giản

build.sbt
src/main/scala/SimpleApp.scala

Bạn tạo 2 tập tin, build.sbt và SimpleApp.scala.

2.1 Nội dung build.sbt

Đây là tập tin mà sbt đọc để biên dịch jar cho bạn. Trong đó, bạn phải chọn version của spark trùng với phiên bản bạn đã cài trong Phần 1.

name := "Simple Project"

version := "1.0"

scalaVersion := "2.12.10"

// https://mvnrepository.com/artifact/org.apache.spark/spark-sql
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.0.1"


Hãy tham khảo mvnrepository để lấy mã, và xem scala version phù hợp. Ví dụ như mình đã cài spark 3.0.1

Bạn search từ khóa sau “maven spark sql” sẽ tìm ra https://mvnrepository.com/artifact/org.apache.spark/spark-sql

Chọn dòng 3.0.1, ta được như sau:

Chọn tab SBT và copy đoạn mã vào build.sbt.

Đồng thời kiểm tra mục Scala Target (2.12) phải giống với dòng scalaVersion trong build.sbt của bạn (2.12.10 cũng thuộc version 2.12, nhưng 2.11 hay 2.13 sẽ không chạy được)

2.2 Nội dung SimpleApp.scala

Đây là mã thực thi của chương trình.

/* SimpleApp.scala */
import org.apache.spark.sql.SparkSession

/*
* SimpleApp follow example on Apache Spark quick start documentation.
* Original URL: https://spark.apache.org/docs/latest/quick-start.html
*/
object SimpleApp {
  def main(args: Array[String]) {
    var mySparkHome = "/home/tt/Software/spark-3.0.1-bin-hadoop2.7"
    val logFile = mySparkHome + "/README.md" // Should be some file on your system
    val spark = SparkSession.builder.appName("Simple Application").getOrCreate()
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"log file dir is $logFile")
    println(s"Lines with a: $numAs, Lines with b: $numBs")
    spark.stop()
  }
}

3. Biên dịch và thực thi

3.1 Biên dịch

Từ thư mục gốc của chương trình (nơi chứa build.sbt) ,chạy lệnh

sbt package 

Thấy [success] là được

Tập tin được tạo

target/scala-2.12/simple-project_2.12-1.0.jar

3.2 Thực thi

/home/tt/Software/spark-3.0.1-bin-hadoop2.7/bin/spark-submit \
--class "SimpleApp" \
--master local[4]  \
target/scala-2.12/simple-project_2.12-1.0.jar

Ý nghĩa:

  • class là tên ScalaObject bạn chọn để chạy hàm main
  • master local[4] bạn nói cho spark sử dụng 4 nhân CPU
  • target/scala-2.12/simple-project_2.12-1.0.jar là đường dẫn tới file .jar bạn vừa tạo ra ở lệnh sbt package
  • Dấu xẹt \ là dấu nối dòng, rất hữu dụng để tách câu lệnh dài ra thành nhiều dòng cho dễ nhìn

Ví dụ về tách câu lệnh ra nhiều dùng bằng dấu \

Câu lệnh sau

cmd a b

Có thể được viết ra 3 dòng

cmd \
a \
b 

Ví dụ hoàn chỉnh trên Github

https://github.com/ttpro1995/ApacheSparkSimpleApp

Leave a Reply