Hướng dẫn deploy Spark

spark-mesos

Việc deploy Spark là cần thiết đối với các tác vụ mang tính chu kỳ. Ví dụ, ta có thể tạo một CRON job để chương trình Spark có thể tự động tổng hợp dữ liệu cho chúng ta sau chu kỳ mỗi giờ, mỗi ngày hay mỗi tuần. spark-submit là một shell command được dùng để deploy ứng dụng Spark lên cluster. Nhờ vào cơ chế quản lý phân tán của Spark, ta không cần phải chỉnh sửa source code quá nhiều để có thể chuyển đổi từ standalone mode sang distributed mode.

Để hoàn tutorial này, bạn cần các phần mềm sau:

Sử dụng Intellij IDEA

Bạn có thể sử dụng IDE để hoàn tất mọi tiến trình tạo Spark project chỉ thông qua một vài cú click chuột. Ở đây, tôi chọn Intellij IDEA cho môi trường lập trình của mình. Bạn cần cài đặt Scala plugin để có thể tạo một Scala project.

IntelliJ IDEA Plugins

Scala plugin

Sau khi hoàn tất việc cài đặt, bạn Create New Project và chọn scala với sbt như hình bên dưới. Sau đó, click Next

Choose scala sbt

Choose scala sbt

Tại màn hình New Project, ta đặt tên cho project gồm các cấu hình như bên dưới. Lưu ý, ta bỏ chọn Use auto-import, Sources, Sources for SBT and plugins. Sau đó, click Finish.

Sau khi hoàn thành các thiết lập, ta đợi một lúc cho scala plugin phát sinh các file và folder cần thiết cho project. Lúc này, ta sẽ có được cấu trúc project như bên dưới.

./project
./project/assembly.sbt
./project/build.properties
./project/plugins.sbt
./src
./src/main
./src/main/java
./src/main/resources/people.json
./src/main/scala
./src/main/scala/SparkSQLDemo.scala
./src/main/scala-2.11

Tiếp theo, ta mở file build.sbt và add các dependencies để chạy ứng dụng Spark đơn giản. Mỗi khi file này có nội dung bị thay đổi, IntelliJ sẽ nhắc ta click vào link “refresh project” để sbt download các thư viện liên quan vào ~/.ivy2/cache/ và IntelliJ link các thư viện này vào chương trình để debug.


name := "programming_with_spark"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.1.0" % "provided",
  "org.apache.spark" %% "spark-streaming" % "2.1.0" % "provided",
  "org.apache.spark" %% "spark-sql" % "2.1.0"
)

// Configure JAR used with the assembly plug-in
assemblyJarName in assembly := "programming_with_spark.jar"

// A special option to exclude Scala itself form our assembly JAR, since Spark // already bundles Scala.
assemblyOption in assembly :=
  (assemblyOption in assembly).value.copy(includeScala = false)

resolvers ++= Seq(
  Resolver.sonatypeRepo("public"),
  Resolver.typesafeRepo("releases")
)

assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false, includeDependency = false)

assemblyMergeStrategy in assembly := {
  case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
  case m if m.startsWith("META-INF") => MergeStrategy.discard
  case PathList("javax", "servlet", xs@_*) => MergeStrategy.first
  case PathList("org", "apache", xs@_*) => MergeStrategy.first
  case PathList("org", "jboss", xs@_*) => MergeStrategy.first
  case "about.html" => MergeStrategy.rename
  case "reference.conf" => MergeStrategy.concat
  case "logback.xml" => MergeStrategy.concat
  case _ => MergeStrategy.first
}

Để tạo New scala script ta phải chuột vào thư mục src/main/scala, chọn New > Scala Script và đặt tên là SimpleSpark.scala. Ta sử dụng script bên dưới để chạy Demo.

import org.apache.spark.sql.SparkSession

/**
  * Created by hongong on 3/07/17.
  */

object SparkDemo {
  def main(args: Array[String]) {

    val sparkSession = SparkSession.builder.getOrCreate()
    println("Spark version": sparkSession.version)

  }
}

Trước khi tiến hành chạy chương trình, ta cần thiết lập các thông số bằng cách vào Run > Edit configuration. Bên góc trái trên màn hình, ta click vào dấu + để Add new configuration. Ở đây, ta chọn configuration cho Application. Ta thực hiện đặt tên cho configuration, chọn tên class chứa hàm Mainmodule cần chạy. Sau đó, click Ok để hoàn tất. Ngoài ra, ta có thể truyền tham số của Spark thông qua field VM options như sau:

VM options:-Dspark.master=local[2] -Dspark.app.name=scala_sbt -Dconfig.file=my_config.conf

Cuối cùng, ta chỉ việc click vào nút Run để tiến hành chạy chương trình.

Biên dịch chương trình bằng SBT

SBT là một chương trình quản lý dự án như Maven. SBT cho phép các developer có thể quản lý version, các dependencies ( các thư viện sử dụng trong dự án ), quản lý build, tự động download javadoc & source. Trên thực tế, việc import thư viện và các dependency giữa local, staging và production là rất vất vả. Khi sử dụng sbt, chương trình này sẽ hỗ trợ cho chúng ta tất cả các khâu rườm rà này.

Spark SQL

Trong phần ví dụ này, ta sẽ làm việc với Spark SQL. Một API của Spark giúp làm việc với dữ liệu và thực thi MapReduce quen thuộc như SQL. Giả sử, ta có file people.json bên dưới:

people.json

{"name":"Michael"}
{"name":"Andy", "age":30}
{"name":"Justin", "age":19}

Ta viết một chương trình gồm các nội dung đơn giản như load dữ liệu vào Spark DataFrame, hiển thị dữ liệu, truy vấn thông tin theo cột, theo các điều kiện ràng buộc,…

import org.apache.spark.sql.SparkSession

/**
  * Created by hongong on 3/07/17.
  */

object SparkSQLDemo {
  def main(args: Array[String]) {

    val sparkSession = SparkSession.builder.getOrCreate()

    val sqlContext = sparkSession.sqlContext
    // used file path after assemblied
    // used /src/main/resources/people.json when debugging
    val df = sqlContext.read.json("./classes/people.json")

    // Displays the content of the DataFrame to stdout
    df.show()
    // Print the schema in a tree format
    df.printSchema()
    // Select only the "name" column
    df.select("name").show()
    // Select everybody, but increment the age by 1
    df.select(df("name"), df("age") + 1).show()
    // Select people older than 21
    df.filter(df("age") > 21).show()
    // Count people by age
    df.groupBy("age").count().show()
  }
}

Ta mở command line lên và điều hướng vào project của chúng ta. Trong folder project/ ta tạo một file assembly.sbt với nội dung addSbtPlugin(“com.eed3si9n” % “sbt-assembly” % “0.14.3”). Sau đó, ta sẽ dùng lệnh sau để biên dịch chương trình.

sbt assemblyPackageDependency && sbt assembly;

Output

[info] Loading project definition from /Users/hongong/Documents/programming-with-spark/scala-sbt/project
[info] Set current project to programming_with_spark (in build file:/Users/hongong/Documents/programming-with-spark/scala-sbt/)
[info] Updating {file:/Users/hongong/Documents/programming-with-spark/scala-sbt/}scala-sbt...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/hongong/Documents/programming-with-spark/scala-sbt/target/scala-2.11/classes...
[info] Including: jackson-annotations-2.6.5.jar
[info] Including: commons-io-2.1.jar
...

[warn] Strategy 'discard' was applied to 276 files
[warn] Strategy 'first' was applied to 113 files
[warn] Strategy 'rename' was applied to a file
[info] SHA-1: fa8b322910765b3160e1fcc1483c00c270a4e02b
[info] Packaging /Users/hongong/Documents/programming-with-spark/scala-sbt/target/scala-2.11/programming_with_spark-assembly-1.0-deps.jar ...
[info] Done packaging.
[success] Total time: 88 s, completed Mar 8, 2017 5:00:52 PM
...

[info] Checking every *.class/*.jar file's SHA-1.
[info] Merging files...
[info] SHA-1: 03eb423ed89d10f665759a5cb65a7753299d7216
[info] Packaging /Users/hongong/Documents/programming-with-spark/scala-sbt/target/scala-2.11/programming_with_spark.jar ...
[info] Done packaging.
[success] Total time: 2 s, completed Mar 8, 2017 5:01:03 PM

Deploy chương trình bằng spark-submit

Khi biên dịch thành công, ta thu được 2 file *.jar nằm trong thư mục target/scala-2.11/

  1. programming_with_spark-assembly-1.0-deps.jar (chứa tất cả các thư viện của chương trình)
  2. programming_with_spark.jar (chứa nội dung chạy chương trình)

Ta dùng lệnh sau để deploy spark:

cd target/scala-2.11/

spark-submit --class SparkSQLDemo \
--master "local[2]" \
--jars ./programming_with_spark-assembly-1.0-deps.jar \
./programming_with_spark.jar

Chuỗi command full thường dùng để deploy Spark

spark-submit --class com.my.class.MyClass
--files ./test.conf
--conf 'spark.executor.extraJavaOptions=-Dconfig.fuction.conf'
--conf 'spark.driver.extraJavaOptions=-Dconfig.file=./test.conf'
--conf spark.executor.memory=1g
--conf spark.executor.cores=1
--conf spark.cores.max=1
--conf spark.drivers.cores=1
--master local[2]
./my_spark_assembly.jar

Nếu mọi thứ diễn ra thành công, ta sẽ thấy xuất hiện các đoạn in ra màn hình tương tự như bên dưới:

+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+

root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)

+-------+
|   name|
+-------+
|Michael|
|   Andy|
| Justin|
+-------+

+-------+---------+
|   name|(age + 1)|
+-------+---------+
|Michael|     null|
|   Andy|       31|
| Justin|       20|
+-------+---------+

+---+----+
|age|name|
+---+----+
| 30|Andy|
+---+----+

+----+-----+
| age|count|
+----+-----+
|null|    1|
|  19|    1|
|  30|    1|
+----+-----+

Nói thêm về SBT

  • Để đóng gói chương trình thành file JAR, ta cần dùng thêm plug-in của sbt đó là assembly.
  • Dùng “provided” khi dùng spark-submit sẽ giảm dung lượng file JAR khi compile.
  • %% trong SBT nghĩa là tự động thêm Scala version vào sau artifact name.
  • Không nên check vào Sources, Sources for SBT and plugins để tránh báo lỗi do một số library không chứa source code nên không download về được.
  • Dùng resources/ folder để chứa các file tài nguyên hệ thống như *.json, *.conf, …
  • Folder classes/ là folder resources sau khi được compiled.
  • Assembly bị lỗi thường do quá trình merge source để packaging. Ta cần chỉ định quá trình merge thông qua assemblyMergeStrategy.

Kết luận

Việc sử dụng IDE sẽ hỗ trợ cho các bạn rất nhiều trong quá trình phát triển phần mềm. Mọi khâu cài đặt, download thư viện và chạy chương trình đều được thực hiện chỉ thông qua một vài cú click chuột. Tuy nhiên, để compile ra chương trình file *.jar và deploy lên server, bạn cần làm việc trên môi trường command-line. Điều này rất hữu ích khi bạn làm việc trên môi trường không có hỗ trợ của IDE như trên môi trường server, nơi mà bạn chỉ được quyền kết nối thông qua SSH và làm việc thông qua mà hình đen. Hiểu được và sử dụng thành thạo command-line sẽ giúp quá trình compile và deploy source code lên server được thuận lợi hơn rất nhiều.

Tham khảo thêm:

Advertisements

4 thoughts on “Hướng dẫn deploy Spark

  1. Error:Error while importing SBT project:

    OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=384M; support was removed in 8.0
    [info] Loading project definition from /home/hann/IdeaProjects/Demo/project
    /home/hann/IdeaProjects/Demo/build.sbt:12: error: not found: value assemblyJarName
    assemblyJarName in assembly := "programming_with_spark.jar"
    ^
    [error] Type error in expression
    Invalid response.

    assemblyJarName là 1 Object trong thư viện hay là mình tự đặt vậy anh ?

    Liked by 1 person

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s