在Spark集羣上運行你的第一個程序

前言

經過這篇文章你能學習到什麼,用簡單的一句話描述就是:html

打包你的第一個Scala程序,並丟到以前建立好的Spark集羣上運行。java

往復雜了說就是:git

Docker 部分

  • 繼續學習Docker經常使用操做,如:映射端口,掛載目錄,傳送變量等;github

  • 繼續深刻學習Dockerfile,熟悉ARG,ENV,RUN,WORKDIR,CMD等指令;sql

Scala 部分

  • Scala基礎語法,Scala編寫第一個Spark應用程序;
  • SBT經過配置清單,打包應用程序。

Spark 部分

  • 提交編寫好的Scala應用程序,--class主類。

配置Scala運行環境

安裝

Spark是用Scala編寫的,因此這裏我採用Scala語言進行編寫程序。docker

基於上一篇所提到的openjdk鏡像,繼續編寫Dockerfileapache

#
# Scala and sbt Dockerfile
#
# https://github.com/spikerlabs/scala-sbt (based on https://github.com/hseeberger/scala-sbt)
#

# Pull base image
FROM  openjdk:8-alpine

ARG SCALA_VERSION
ARG SBT_VERSION

ENV SCALA_VERSION ${SCALA_VERSION:-2.12.8}
ENV SBT_VERSION ${SBT_VERSION:-1.2.7}

RUN \ echo "$SCALA_VERSION $SBT_VERSION" && \ mkdir -p /usr/lib/jvm/java-1.8-openjdk/jre && \ touch /usr/lib/jvm/java-1.8-openjdk/jre/release && \ apk add --no-cache bash && \ apk add --no-cache curl && \ curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /usr/local && \ ln -s /usr/local/scala-$SCALA_VERSION/bin/* /usr/local/bin/ && \ scala -version && \ scalac -version 
RUN \ curl -fsL https://github.com/sbt/sbt/releases/download/v$SBT_VERSION/sbt-$SBT_VERSION.tgz | tar xfz - -C /usr/local && \ $(mv /usr/local/sbt-launcher-packaging-$SBT_VERSION /usr/local/sbt || true) \ ln -s /usr/local/sbt/bin/* /usr/local/bin/ && \ sbt sbt-version || sbt sbtVersion || true 
WORKDIR /project 
CMD "/usr/local/bin/sbt" 複製代碼

注意Dockerfile開頭的兩個參數:SCALA_VERSIONSBT_VERSION是能夠用戶指定的。vim

接着編譯該Dockerfilebash

# 注意最後的"."——當前目錄
docker build -t vinci/scala-sbt:latest \
    --build-arg SCALA_VERSION=2.12.8 \
    --build-arg SBT_VERSION=1.2.7 \
    .
複製代碼

須要一段時間請耐心等待app

測試

創建一個新的臨時交互式容器進行測試:

docker run -it --rm vinci/scala-sbt:latest /bin/bash
複製代碼

依次輸入:scala -versionsbt sbtVersion

當容器裏面的界面返回以下信息則說明安裝成功。

bash-4.4# scala -version
Scala code runner version 2.12.8 -- Copyright 2002-2018, LAMP/EPFL and Lightbend, Inc.
bash-4.4# sbt sbtVersion
[warn] No sbt.version set in project/build.properties, base directory: /local
[info] Set current project to local (in build file:/local/)
[info] 1.2.7
複製代碼

掛載本地文件

爲了讓咱們可以訪問咱們的本地文件,咱們須要將一個卷從咱們的工做目錄安裝到正在運行的容器上的某個位置。

咱們只需在run指令里加上-v選項,以下所示:

mkdir -p /root/docker/projects/MyFirstScalaSpark
cd /root/docker/projects/MyFirstScalaSpark
docker run -it --rm -v `pwd`:/project vinci/scala-sbt:latest
複製代碼

注:

  1. pwd是指當前目錄(Linux 虛擬機:/root/docker/projects/MyFirstScalaSpark);
  2. /project是映射到指容器裏面的目錄;
  3. 沒有使用/bin/bash,能夠直接登陸到SBT控制檯。

仔細看以前的Dockerfile配置,最後一行指定了默認執行的命令,倒數第二行指定了工做目錄

登錄成功以後會返回以下信息:

[root@localhost project]# docker run -it --rm -v `pwd`:/project vinci/scala-sbt:latest
[warn] No sbt.version set in project/build.properties, base directory: /local
[info] Set current project to local (in build file:/local/)
[info] sbt server started at local:///root/.sbt/1.0/server/05a53a1ec23bec1479e9/sock
sbt:local>
複製代碼

第一個程序

配置環境

下面即可以開始編寫你的第一個Spark程序了。

可是從上節的輸出之中還能夠看到[warn],緣由是沒有設置sbt版本,也就是配置文件的問題。

那麼咱們在剛纔建立的project目錄下面新建——build.sbt,內容參考官方文檔

name := "MyFirstScalaSpark"
version := "0.1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.0"
複製代碼

這爲咱們提供了一個最小的項目定義。

注意:咱們已經將Scala版本指定爲2.11.12,由於Spark是針對Scala 2.11編譯的,但容器上的Scala版本是2.12。 在SBT控制檯中,運行reload命令以使用新的構建設置刷新SBT項目:

image-20190406170420561

寫代碼

新建一個SSH鏈接到CentOS

建立目錄:

mkdir -p /root/docker/projects/MyFirstScalaSpark/src/main/scala/com/example
cd /root/docker/projects/MyFirstScalaSpark/src/main/scala/com/example
vim MyFirstScalaSpark.scala
複製代碼

內容以下:

package com.example
import org.apache.spark.sql.SparkSession
object MyFirstScalaSpark {
  def main(args: Array[String]) {
    val SPARK_HOME = sys.env("SPARK_HOME")
    val logFile = s"${SPARK_HOME}/README.md"
    val spark = SparkSession.builder
      .appName("MyFirstScalaSpark")
      .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"Lines with a: $numAs, Lines with b: $numBs")
    spark.stop()
  }
}
複製代碼

打包

進入到sbt容器,輸入

package
複製代碼

等待很長一段時間,便會出現以下界面,說明打包成功:

打包

提交任務

打包好的 jar包在:/root/docker/projects/MyFirstScalaSpark/target/scala-2.11目錄下

啓動Spark集羣(詳見第一章):

cd /root/docker/spark
docker-compose up --scale spark-worker=2
複製代碼

啓動Spark客戶端容器

cd /root/docker/projects/MyFirstScalaSpark
docker run --rm -it -e SPARK_MASTER="spark://spark-master:7077" \
  -v `pwd`:/project --network spark_spark-network \
  vinci/spark:latest /bin/bash
複製代碼

提交任務

進入到Spark客戶端容器,輸入如下語句:

spark-submit --master $SPARK_MASTER \
	--class com.example.MyFirstScalaSpark \
    /project/target/scala-2.11/myfirstscalaspark_2.11-0.1.0.jar
複製代碼

結果輸出:

Lines with a: 62, Lines with b: 31

執行成功。

本章到此結束。

相關文章
相關標籤/搜索