内容简介:基于上一篇所提到的注意
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_VERSION
和 SBT_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 -version
和 sbt 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 复制代码
注:
-
pwd是指当前目录(Linux 虚拟机:/root/docker/projects/MyFirstScalaSpark); -
/project是映射到指容器里面的目录; -
没有使用
/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项目:
写代码
新建一个 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
执行成功。
本章到此结束。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
笨办法学Python 3
[美]泽德 A. 肖 / 王巍巍 / 人民邮电出版社 / 2018-6-1 / CNY 59.00
本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。本书是基于Python 3.6版本编写的。 本书结构非常简单,除“准备工作”之外,还包括52个习题,其中26个覆盖了输入/输出、变量和函数3个主题,另外26个......一起来看看 《笨办法学Python 3》 这本书的介绍吧!