Docker構建學習環境(3)-部署Spark並提交WordCount任務

Spark概述

Apache Spark是一個開源集羣運算框架,最初是由加州大學柏克萊分校AMPLab所開發。相對於Hadoop的MapReduce會在運行完工作後將中介數據存放到磁盤中,Spark使用了存儲器內運算技術,能在數據尚未寫入硬盤時即在存儲器內分析運算。Spark在存儲器內運行程序的運算速度能做到比Hadoop MapReduce的運算速度快上100倍,即便是運行程序於硬盤時,Spark也能快上10倍速度。[1]Spark允許用戶將數據加載至集羣存儲器,並多次對其進行查詢,非常適合用於機器學習算法。摘自維基百科。總結一下就是,hadoop的mapreduce是將中間結果存在磁盤上,而spark是將中間結果存在主存中,所以速度比Hadoop的mapreduce快。

準備工作

環境選擇
  • 宿主機系統:win10
  • hadoop版本:3.1.1(構建基於HDFS的spark)
  • Spark版本:2.4.5
  • 容器系統:ubuntu16
  • jdk:1.8
準備
  • 下載jdk1.8下載地址放入E:/docker/spark目錄下
  • 下載Hadoop下載地址放入E:/docker/spark目錄下,這一步不是必須的,只是因爲我部署hdfs的時候選擇了版本3.1.1不想重新部署,所以下載Spark時選擇了Pre-build with user-provided Apache Haddop,啥意思呢?就是自定義版本的Hadoop,如果選擇的Spark版本是Pre-build for Apache Haddop 2.6/2.7,那就不需要單獨下載Hadoop,因爲下載的Spark已經預編譯了。
  • 下載spark下載地址放入E:/docker/spark目錄下,選擇好自己的版本,如果已經安裝了Hadoop2.6/2.7建議直接下載預編譯了Hadoop的版本,不需要後續配置環境參數。
  • 關於Hadoop集羣的部署可以參考Docker部署Hadoop集羣
編寫Dockerfile文件
FROM ubuntu:16.04
MAINTAINER houwanfei

# 安裝openssh-server
RUN  apt-get update && apt-get install -y openssh-server

# 配置ssh免密登陸
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 複製jdk和配置jdk環境
RUN mkdir /usr/lib/jvm/
ADD openjdk-8u40-b25-linux-x64-10_feb_2015.tar.gz /usr/lib/jvm/
ENV JAVA_HOME /usr/lib/jvm/java-se-8u40-ri/ 
ENV PATH $PATH:$JAVA_HOME/bin

# 複製hadoop和配置hadoop配置
RUN mkdir /usr/local/hadoop/
ADD hadoop-3.1.1.tar.gz /usr/local/hadoop/
ENV HADOOP_HOME /usr/local/hadoop/hadoop-3.1.1
ENV PATH $PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 複製spark和配置spark環境
RUN mkdir /usr/local/spark
ADD spark-2.4.5-bin-without-hadoop.tgz /usr/local/spark
ENV SPARK_HOME=/usr/local/spark/spark-2.4.5-bin-without-hadoop
ENV PATH=$PATH:$SPARK_HOME/bin
ENV SPARK_MASTER_PORT 7077
ENV SPARK_MASTER_WEBUI_PORT 8080
ENV SPARK_MASTER_LOG /tmp/logs
ENV SPARK_WORKER_LOG /tmp/logs
ENV SPARK_VERSION 2.4.5

# 複製配置文件
COPY config/* /tmp/
RUN mv /tmp/spark-config.sh  $SPARK_HOME/sbin && \
	mv /tmp/spark-env.sh $SPARK_HOME/conf
# 暴露端口
EXPOSE 8080 7077 6066

CMD [ "sh", "-c", "service ssh start; bash"]
配置配置文件
# 將兩個文件放入E:/docker/spark/config目錄下
# spark-env.sh
export SPARK_DIST_CLASSPATH=$(${HADOOP_HOME}/bin/hadoop classpath)


# spark-config.sh 這裏複製出來一個文件然後在最後加上這一句
export JAVA_HOME=/usr/lib/jvm/java-se-8u40-ri/
構建鏡像
# cd切換目錄到E:/docker/spark目錄
docker build -t hou/spark .

啓動

運行鏡像

鏡像已經構建完成下面開始啓動鏡像並啓動spark

# 因爲要利用hdfs,所以我將它和hadoop放入同一個網段
docker run -dit --name spark-master --net hadoop --hostname spark-master hou/spark

# 進入容器
docker exec -it spark-master /bin/bash

# 進入spark解壓目錄/usr/local/spark 進入sbin目錄運行start-all.sh啓動
./start-all.sh
驗證
# 瀏覽器輸入,將ip換成自己對應的ip,spark的web ui端口默認是8080
http://172.19.0.5:8080/

執行第一計算任務

創建一個java的maven空項目

在這裏插入圖片描述

填寫groupid等信息

在這裏插入圖片描述

配置spark開發jar依賴

需要下載的jar相關依賴很多,可能要等很久看個人網速

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>2.4.5</version>
</dependency>
編寫計算任務代碼

這裏我是寫的一個詞頻統計的

package com.hou.test;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;


import java.util.Arrays;

/**
 * @Description
 * @auther houwf
 * @create 2020-04-29 10:50
 */
public class WordCountJob {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setMaster("local").setAppName("WordCountApp");
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> input = sc.textFile("hdfs://172.19.0.2:9000/user/root/learn/madame_bovary");
        System.out.println("inputs line:" + input.count());
        JavaRDD<String> words = input.flatMap(s -> Arrays.asList(s.split(" ")).iterator());
        JavaPairRDD<String, Integer> wordAndOne = words.mapToPair(word -> new Tuple2<>(word, 1));
        JavaPairRDD<String, Integer> result = wordAndOne.reduceByKey((a, b) -> a+b);
        JavaPairRDD<Integer, String> swap = result.mapToPair(Tuple2::swap);
        JavaPairRDD<Integer, String> sorted = swap.sortByKey(false);
        JavaPairRDD<String, Integer> sortResult = sorted.mapToPair(Tuple2::swap);
        System.out.println("words:" + sortResult.count());
        sortResult.saveAsTextFile("hdfs://172.19.0.2:9000/user/root/learn/madame_bovary_word_count");
        sc.stop();
    }
}
編譯打包
mvn clean package
複製到spark容器
docker cp study.word.count-1.0-SNAPSHOT.jar spark-master:/tmp
提交任務到spark執行

如果沒有明顯報錯信息,就說明執行成功。

# spark/bin目錄下
 ./spark-submit --class com.hou.test.WordCountJob --master local /tmp/study.word.count-1.0-SNAPSHOT.jar 
查看運行結果

在hdfs上查看運行結果,如果看到madame_bovary_word_count目錄,點進去如果有結果說明詞頻統計以完成並將結果寫入了HDFS。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章