Docker Spark 历险记(二)

栏目: 服务器 · 发布时间: 5年前

内容简介:基于上一篇所提到的注意

Spark 是用 Scala 编写的,所以这里我采用 Scala 语言进行编写程序。

基于上一篇所提到的 openjdk 镜像,继续编写 Dockerfile

#
# 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 是可以用户指定的。

接着编译该 Dockerfile

# 注意最后的"."——当前目录
docker build -t vinci/scala-sbt:latest \
    --build-arg SCALA_VERSION=2.12.8 \
    --build-arg SBT_VERSION=1.2.7 \
    .
复制代码

需要一段时间请耐心等待

测试

建立一个新的临时交互式容器进行测试:

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项目:

Docker Spark 历险记(二)

写代码

新建一个 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
复制代码

等待很长一段时间,便会出现如下界面,说明打包成功:

Docker Spark 历险记(二)

提交任务

打包好的 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

执行成功。

本章到此结束。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

别怕,Excel VBA其实很简单

别怕,Excel VBA其实很简单

Excel之家 (Excel Home) / 人民邮电出版社 / 2012-10-1 / 49.00元

《别怕,excel vba其实很简单》考虑到大多数读者没有编程基础的实际情况,用浅显易懂的语言和生动形象的比喻,并配合大量插画,介绍excel中看似复杂的概念和代码、从简单的宏录制、vba编程环境和基础语法的介绍,到常用对象的操作与控制、excel事件的调用与控制、用户界面设计、代码调试与优化、都进行了形象的介绍。 《别怕,excel vba其实很简单》适合想提高工作效率的办公人员,特别是经......一起来看看 《别怕,Excel VBA其实很简单》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码