Please enable Javascript to view the contents

基于Docker的Hadoop集群配置Spark并简单使用

 ·  ☕ 6 分钟  ·  ✍️ Calvin Haynes · 👀... 阅读

前言

上一篇文章我写了如何利用 Docker 搭建一个 Hadoop-muti-node-cluster,从中我们得知 Hadoop 可以通过 MapReduce 机制实现一些计算任务,但是由于 MapReduce 任务需要跑很多次而且需要多次迭代,每次迭代计算结果都要存到 HDFS 中,而 HDFS 本质上就是硬盘,相当于把每次运算结果写入硬盘,而且还要考虑备份的问题,所以在 MapReduce 的传统计算中存储占用了绝大部分时间。而 Spark 不同,它是将中间计算结果存储在内存中并直接在内存中执行迭代计算,速度会更快(CPU 直接访问内存速度远远快于访问磁盘),是现在非常流行的通用云计算引擎/框架。

官网描述: Apache Spark 是用于大规模数据处理的统一分析引擎。它提供了 Java、Scala、Python 和 R 中的高级 API,以及支持通用执行图的优化引擎。它还支持一组丰富的更高级别的工具,包括SparkSQL用于 SQL 和结构化数据的处理,MLlib机器学习,GraphX用于图形处理,以及结构化流的增量计算和流处理。

1 - 搭建前注意事项

官网说明:

Spark 应用程序作为集群上的独立进程集运行,由SparkContext 主程序(称为驱动程序)中的对象协调。

具体来说,为了在集群上运行,SparkContext 可以连接到多种类型的集群管理器Spark 自己的独立集群管理器、Mesos、YARN 或 Kubernetes),它们在应用程序之间分配资源。连接后,Spark 会在集群中的节点上获取执行程序,这些进程为您的应用程序运行计算和存储数据。接下来,它将您的应用程序代码(由传递给 SparkContext 的 JAR 或 Python 文件定义)发送到执行程序。最后,SparkContext 将任务发送给执行程序以运行。

image

Spark 支持的集群管理器如下:

  • Standalone– Spark 附带的简单集群管理器,可以轻松设置集群。
  • Apache Mesos – 一个通用的集群管理器,也可以运行 Hadoop MapReduce 和服务应用程序。(已弃用)
  • Hadoop YARN – Hadoop 2 中的资源管理器。
  • Kubernetes – 一个开源系统,用于自动部署、扩展和管理容器化应用程序。

由以上说明在不同的集群模式(即选用不同的集群管理器)下,Spark 有不同的部署方法,本文选用最简单的 Standalone 模式部署(其实 Docker 和 Kubernetes 搭建更好,最近没时间学,之后再写相关文章吧)

2 - 下载 Spark&Scala

要安装 Spark Standalone 模式,您只需在集群的每个节点上放置一个编译版本的 Spark。

  • 关于 Spark 的下载,一定要寻找对应 Hadoop 版本的 Spark,否则可能会出现奇奇怪怪的问题。
    • Spark 下载网址在这里:https://spark.apache.org/downloads.html
  • 按照 Spark 下载网站上的说明下载对应的 Scala 版本(比如下面这个版本官网的说明就是建议下载 Scala2.12 版本)
    • Scala 下载网址在这里:https://www.scala-lang.org/download/

image

关于二者的下载,如果看过我上篇文章的读者,应该已经发现在上篇文的Dockerfile中我已经下载了相应版本的 Spark 和 Scala

3 - 配置环境变量

设置一下 Spark 必须用到的环境变量:(将下面这些环境变量配置的键值对写入~/.bashrc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#SCALA Variables
export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin
export PATH=$PATH:$SCALA_HOME/sbin
#SCALA Variables
#SPARK Variables
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
export SPARK_DIST_CLASSPATH=/usr/local/hadoop/bin/hadoop
export PYTHONPATH=$SPARK_HOME/python/:$SPARK_HOME/python/lib/py4j-0.10.6-src.zip:$PYTHONPATH
export PATH=$PATH:$SPARK_HOME/sbin
#SPARK Variables

更新 bash 配置

1
 source ~/.bashrc

4 - 配置 Spark 配置文件(conf 目录)

1 - spark-env.sh 文件

  • 将下面这些配置写入$SPARK_HOME/conf目录下的spark-env.sh配置文件中(其中SPARK_MASTER_HOST出换成你master的 ip 地址,或者直接写 master 应该也可以)

  • 注意,当 Spark 安装时,conf/spark-env.sh 默认是不存在的。你可以复制 conf/spark-env.sh.template 创建它(cp spark-env.sh.template spark-env.sh),其他配置文件也同理。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
export SPARK_DIST_CLASSPATH=/usr/local/hadoop/bin/hadoop
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SCALA_HOME=/usr/local/scala
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_HOST=172.18.0.2
export SPARK_HOME=/usr/local/spark
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=512m
export SPARK_WORKER_INSTANCES=2

2 - Workers

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# A Spark Worker will be started on each of the machines listed below.
# 在这里写上包括master节点在内的所有工作节点
master
slave1
slave2

3 - log4j.properties

  • 打印 Spark 运行日志,方便后期排错和检查运行情况
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Set everything to be logged to the console
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Set the default spark-shell/spark-sql log level to WARN. When running the
# spark-shell/spark-sql, the log level for these classes is used to overwrite
# the root logger's log level, so that the user can have different defaults
# for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN
log4j.logger.org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver=WARN

# Settings to quiet third party logs that are too verbose
log4j.logger.org.sparkproject.jetty=WARN
log4j.logger.org.sparkproject.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR

# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR

# For deploying Spark ThriftServer
# SPARK-34128:Suppress undesirable TTransportException warnings involved in THRIFT-4805
log4j.appender.console.filter.1=org.apache.log4j.varia.StringMatchFilter
log4j.appender.console.filter.1.StringToMatch=Thrift error occurred during processing of message
log4j.appender.console.filter.1.AcceptOnMatch=false

5 - 启动 Spark

  • 可以使用以下 shell 脚本启动或停止集群,基于 Hadoop 的部署脚本,并在$SPARK_HOME/sbin以下位置可用:

    • sbin/start-master.sh - 在执行脚本的机器上启动主实例。
    • sbin/start-workers.sh- 在conf/workers文件中指定的每台机器上启动一个工作实例。
    • sbin/start-worker.sh - 在执行脚本的机器上启动一个工作实例。
    • sbin/start-all.sh - 如上所述启动一个主节点和多个工作节点。
    • sbin/stop-master.sh- 停止通过sbin/start-master.sh脚本启动的 master 。
    • sbin/stop-worker.sh - 停止执行脚本的机器上的所有工作实例。
    • sbin/stop-workers.sh- 停止conf/workers文件中指定的机器上的所有工作实例。
    • sbin/stop-all.sh - 如上所述停止主节点和工作节点。
  • 使用jps就可以看到现在正在运行的进程了

image

image

image

6 - 启动 spark-shell 并测试运行一个简单的 Scala 字数计算程序

  • 启动 Spark-shell:
spark-shell

image

  • 完整代码如下:
1
2
3
4
5
6
7
8
# 接续上次文章中上传的文件
val textFile = sc.textFile("hdfs:///calvinhaynes/README.txt")
textFile.first()
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a,b) => a+b)
wordCount.collect()
textFile.count()
textFile.take(10)
:quit
  • 运行效果如下:

Spark-shell

Spark-shell2

结语

作为上一篇文章的补充,简单了解一下 Spark 这个现在流行的通用云计算框架。


感谢您看到最后,如果本文对您有所帮助的话,还希望给我一个一键三连(狗头保命),如果对于我和我的文章感兴趣的话,欢迎点一个关注,您会收到我回答和文章的更新通知,也欢迎加入我建立的技术交流群 QQ:725133797 讨论交流。

最后附上我的个人博客站:https://blog.calvinhaynes.top/,欢迎访问和交流

-------他日江湖相逢 再当杯酒言欢-------

Calvin Haynes
作者: Calvin Haynes ❉
Life is a journey, not a destination.


目录