我的 Spark 3.1.1 之旅【收藏夹吃灰系列】

2021-04-19 15:56:15 浏览数 (1)

如今使用 CDH( Cloudera Distribution Hadoop) 部署 Hadoop 成了业界常规,为什么还要费劲自己动手呢?这不浪费时间嘛!

是的。时间投入蛮大的,不算写文章,搭建过程也得有 20多个小时。白天忙公司项目,都已经焦头烂额,回到家,还得花上 2-3 小时,熬到深夜。

搭建过程,难熬的是,遇到卡点,找不到解决方法。抓狂,质疑,怀疑人生,不停对自己说放弃,但最后一刻,总能在一杯杯热咖啡的陪伴下,找到破解。

一切技术难点,都是纸糊的。我们要做的,只有埋头苦干,与等待!

浪费时间,给自己找罪受?No, 这正是我享受的地方!

初学数据库时,我把 Oracle 反复装了 50 多遍。Solaris, Redhat, CentOS,能找到的操作系统,我都装了。哪个 Linux 容易装,网络不稳定会出什么问题,磁盘不够用会有什么症状,RAC 该如何配置,等等,都经历了一遍。之后看到问题,心里才没有初学时那种慌张。

搭建大数据环境也一样。CDH/Hortonworks/MapR, 这些厂商都给封装完了,纯 UI 式安装管理,开发用得挺爽。但某天爆出一个 Hive Authentication exception, 如果不知道有 hive-site.xml 这回事,不知道 hive.server2.authentication, 处理起来,两眼一抹黑,只能傻傻等待重启了!

所以,我还是会选择,多自己动手,从 0 到 1 玩一样东西。虽然少看了很多蓝光高清电影,但这个过程是值得的!

以下是这次分享的主题:

  • 巧妇也做有米之炊: 准备安装文件
  • 买锅造炉:集群搭建
  • 生米煮成熟饭之后:集群启动与关闭
  • 真香系列:Spark Shell 独食记

A

准备安装文件

Spark 是一个分布式计算框架,通过集群部署,可以发挥并发计算的优势。

其与 Hadoop, Hive 天然集成的策略,让计算更贴近本地数据,完成快速计算,提高效率。

所以在本次实验中,我把 Spark 部署到了 Hadoop 集群中,发挥最大的优势。当然,实际运用中,完成可以有不同的部署方法。

既然是与 hadoop 结合起来运用,那么选择 Spark 版本就很重要了。

image.png

Spark 官网:https://spark.apache.org/downloads.html

对应的,Scala 版本也应该选择 Scala 2.12. Scala 是 Spark 预编译语言,用来开发 Spark 应用最自然。

总结下,完成此次部署,需要的软件有:

  • Spark 3.1.1
  • Scala 2.12

Scala 下载官网:https://www.scala-lang.org/download/

A

集群搭建

搭建 Spark ,首要的事情,是规划好 master 节点与 worker 节点。与前面的两部曲相结合,本次实验共有 3 台计算机,对应的 host 与 IP 如下:

namenode 192.168.31.10

nodea 192.168.31.11

nodeb 192.168.31.12

namenode 上运行了 HDFS 的 namenode, YARN 的 ResourceManager,还有本次的 Spark Master. nodea 和 nodeb 上运行了 HDFS 的 datanode, YARN 的 NodeManager,还有 Spark Worker.

接下来配置每台计算机的环境变量,以及 Spark 集群参数.

环境变量

环境变量,提供了快捷访问可执行文件的路径。

本次实验主要配置 Spark Home 与 Scala Home.

代码语言:javascript复制
SPARK_HOME=/opt/Spark/Spark3.1.1
SCALA_HOME=/opt/Scala/Scala2.12
export SPARK_HOME
export SCALA_HOME
PATH=$PATH:$PARK_HOME/bin:$SCALA_HOME/bin
export PATH

除了要建立相应的文件目录,目录访问权限需要单独配置。为了实验方便,设置这两目录为 HadoopAdmin 所有,并且给目录加上 777 的权限。

代码语言:javascript复制
chown -R hadoopadmin /opt/Spark
chown -R hadoopadmin /opt/Scala
chmod a rwx /opt/Spark
chmod a rwx /opt/Scala

但事实证明,Scala 的 RPM 包,不能指定目录安装,而只能随遇而安:

代码语言:javascript复制
[hadoopadmin@namenode Scala]$ rpm -qpi scala-2.12.13.rpm
Name        : scala
Version     : 2.12.13
Release     : 1
Architecture: noarch
Install Date: (not installed)
Group       : Development/Languages
Size        : 634532234
License     : BSD
Signature   : (none)
Source RPM  : scala-2.12.13-1.src.rpm
Build Date  : Tue 12 Jan 2021 10:16:51 AM EST
Build Host  : travis-job-efec1d00-ea82-450c-8151-6fc45a7e286d
Relocations : (not relocatable)
Vendor      : lightbend
URL         : http://github.com/scala/scala
Summary     : Scala Programming Language Distribution
Description :
Have the best of both worlds. Construct elegant class hierarchies for maximum code reuse and extensibility, implement their behavior using higher-order functions. Or anything in-between.

通过 rpm -qpi 查询得知,scala 的 relocations 属性为 not relocatable, 即,无法指定安装路径。

但安装之后,通过

代码语言:javascript复制
whereis scala

可以找到 scala 的安装目录。

代码语言:javascript复制
[hadoopadmin@namenode Scala]$ whereis scala
scala: /usr/bin/scala /usr/share/scala /usr/share/man/man1/scala.1.gz

所以,SCALA_HOME 指定 /usr/share/scala.

最终,在 .bashrc 文件中,加入这些环境变量:

代码语言:javascript复制
SPARK_HOME=/opt/Spark/Spark3.1.1
SCALA_HOME=/usr/share/scala

PATH=$PATH:$SPARK_HOME/bin:$SCALA_HOME/bin

集群参数配置
  1. 为了可以和 Hive 做交互,把 Hive-site.xml 复制到 $SPARK_HOME/conf 下面。
  2. 配置 spark-env.sh. 在 $SPARK_HOME/conf 下可能没有 spark-env.sh 文件,需要将 spark-env.sh.template 复制一份成 spark-env.sh:
代码语言:javascript复制
--spark-env.sh

JAVA_HOME=/opt/java/jdk8
HADOOP_HOME=/opt/Hadoop/hadoop-3.2.2
HADOOP_CONF_DIR=/opt/Hadoop/hadoop-3.2.2/etc/hadoop
YARN_CONF_DIR=/opt/Hadoop/hadoop-3.2.2/etc/hadoop
SPARK_CONF_DIR=/opt/Spark/Spark3.1.1/conf
SPARK_MASTER_HOST=namenode

  1. 将 nodea/nodeb 加入到 $SPARK_HOME/workers 文件中。
代码语言:javascript复制
-- workers
nodea
nodeb

  1. 通过 scp 把 /opt/Spark 复制到 nodea 和 nodeb 上
代码语言:javascript复制
scp -rv $SPARK_HOME hadoopadmin@nodea:$SPARK_HOME
scp -rv $SPARK_HOME hadoopadmin@nodeb:$SPARK_HOME

A

Spark 集群启动与关闭

启动

Spark 集群的启动,有两种方式。一种是可以把 Master 与 worker 分开来处理。即,先启动 master 节点,worker 节点之后一台一台手工启动;第二种是,用一个启动文件,将 master 和 worker 同时启动。

本次实验,选择第二种方法:

代码语言:javascript复制
$SPARK_HOME/sbin/start-all.sh

因为 spark 与 hadoop 装在了同一台机器上,而 hadoop 的简易启动命令文件也是 start-all.sh , 所以这里指定了下全目录文件名。

关闭

同上,stop-all.sh 和 hadoop 的关闭脚本同名,指定下全目录文件名:

代码语言:javascript复制
$SPARK_HOME/sbin/stop-all.sh
监控页

可通过本地8080端口,访问 Spark 集群的监控页。

image.png

A

Spark Shell 应用

最简单的使用 Spark 集群的方式,就是利用集成的 spark-shell 脚本

代码语言:javascript复制
[hadoopadmin@namenode bin]$ spark-shell
2021-04-11 07:56:21,588 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://namenode:4040
Spark context available as 'sc' (master = local[*], app id = local-1618142189348).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _ / _ / _ `/ __/  '_/
   /___/ .__/_,_/_/ /_/_   version 3.1.1
      /_/
         
Using Scala version 2.12.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_281)
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

现在做一个例子,把 frank_lin.txt 这个原本在 HDFS 上的文本文件,复制到 HDFS 的 /user/hadoopadmin 目录下(如果没有 hadoopadmin 目录就建一个)

代码语言:javascript复制
hdfs dfs -cp /user/hadoop/wordcounter/input/franklin.txt /user/hadoopadmin/

接着用 spark 来统计,改文件共有多少行:

代码语言:javascript复制
scala> val textfile_franklin=spark.read.textFile("franklin.txt")
textfile_franklin: org.apache.spark.sql.Dataset[String] = [value: string]

scala> textfile_franklin.count()
res1: Long = 2773

注意,这里的 spark 默认用户路径是 HDFS 上的 /user/hadoopadmin.

代码语言:javascript复制
scala> val textfile = spark.read.textFile("README.md")
org.apache.spark.sql.AnalysisException: Path does not exist: hdfs://namenode:9000/user/hadoopadmin/README.md

通过访问 namenode:4040 可看到应用的执行情况

image.png

A

小结

有了之前搭建 Hadoop/Hive 的经历后,Spark 的搭建是非常顺利的。配置都是同一个套路,指定 Master/Workder, 改变环境变量,复制到其他节点。

这大概也是多动手的好处,无形中训练了脑力肌肉。让一切变得有规律可寻。

三部曲,要是这么快,这么容易就结束,那肯定不是《有关SQL》的风格。接下来,有意思的事情,才刚刚上场!

--完--

0 人点赞