点击蓝色“有关SQL”关注我哟

加个“星标”,天天与10000人一起快乐成长

图 | 榖依米

大数据三部曲终于完成了:

我的 Hadoop 3.2.2 之旅 【收藏夹吃灰系列】

我的 Hive 3.1.2 之旅 【收藏夹吃灰系列】

本篇是最后一部,《我的 Spark 3.1.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.

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 的权限。

chown -R hadoopadmin /opt/Spark
chown -R hadoopadmin /opt/Scala
chmod a+rwx /opt/Spark
chmod a+rwx /opt/Scala

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

[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, 即,无法指定安装路径。

但安装之后,通过

whereis scala

可以找到 scala 的安装目录。

[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 文件中,加入这些环境变量:

SPARK_HOME=/opt/Spark/Spark3.1.1
SCALA_HOME=/usr/share/scalaPATH=$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:

--spark-env.shJAVA_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 文件中。

-- workers
nodea
nodeb
  1. 通过 scp 把 /opt/Spark 复制到 nodea 和 nodeb 上

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 同时启动。

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

$SPARK_HOME/sbin/start-all.sh

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

关闭

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

$SPARK_HOME/sbin/stop-all.sh

监控页

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

image.png

A

Spark Shell 应用

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

[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 目录就建一个)

hdfs dfs -cp /user/hadoop/wordcounter/input/franklin.txt /user/hadoopadmin/

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

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.

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》的风格。接下来,有意思的事情,才刚刚上场!

--完--

往期精彩:

本号精华合集(三)

外企一道 SQL 面试题,刷掉 494 名候选人

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单

我的 Spark 3.1.1 之旅【收藏夹吃灰系列】相关推荐

  1. 小黑leetcode清爽雨天之旅,刚吃完宇飞牛肉面、麻辣烫和啤酒:112. 路径总和

    小黑自己的解法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None ...

  2. 【荤七素八之旅】 跟着吃货知已在一天之内吃透武汉

    在武汉,什么也没干,只忙着吃了!我在由重庆去武汉的路上,就接到自称是我的"吃货知已"的短信,首先代表武汉人民表达了对我的欢迎,呵呵,然后就说:"如果有需要,尽可以找我!& ...

  3. 1024程序员节,一份精华合辑送给你

    点击蓝色"有关SQL"关注我哟 加个"星标",天天与10000人一起快乐成长 写在前面 今天,10月24日. 对于程序员来说,这天意义非凡.我的公众号,提供了一 ...

  4. 活动记录(AcitveReocrd)-Yii与数据库-(5.3)深入理解YII2.0

    AcitveReocrd事件和关联操作 ActiveRecord预定义的事件,都在 yiidbBaseActiveRecord 中进行了明确: abstract class BaseActiveRec ...

  5. 超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!

    之前写过很多次关于Java学习指南.Java技术路线图的文章.但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃. 于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来, ...

  6. 东大毕业生与大数据架构师的对决(结尾附视频)

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  7. spark性能优化 -- spark工作原理

    从本篇文章开始,将开启 spark 学习和总结之旅,专门针对如何提高 spark 性能进行总结,力图总结出一些干货. 无论你是从事算法工程师,还是数据分析又或是其他与数据相关工作,利用 spark 进 ...

  8. VS2010测试功能之旅:编码的UI测试(6)- 提高UI测试稳定性的8个方法(下)

    VS2010测试功能之旅 --编码的UI测试系列之六:提高UI测试稳定性的8个方法(下) RealZhao,2011年5月11日 回顾 在之前,我们介绍了提高UI测试稳定性的8个方法的前6个,接下来介 ...

  9. VS.NET 学习方法论——我的VS.NET学习之旅

    开发工具:Microsoft Visual Studio .NET 2003 操作系统:Windows XP 作者:屠恩海   来源:http://sunhai.tianyablog.com      ...

最新文章

  1. dokcer 运行和进入容器
  2. VS中调试时不能关联源代码问题
  3. 【图文详解】Mysql8.0安装教程
  4. Eclipse里选择Servlet Run As Server后,自动生成了哪些资源?
  5. linux shell程序设计实验报告,linux的shell脚本实验报告
  6. python json方法详解_python详解json模块
  7. 最长回文子串(Longest Palindromic Substring)
  8. f3arra1n3.4.1版本_GDB 10.1版本发布了
  9. mysql 增加 date 列_mysql数据库修改添加Date格式列的方法
  10. c# excel导出png_批量导出Excel文件中的图片,用VBA代码其实很简单
  11. linux有名管道大小,Linux中的pipe与named pipe(FIFO),即管道和命名管道
  12. 不能将下载行为传输到IDM插件的解决方法
  13. w ndows10图标,Win10桌面图标没了怎么办?Win10桌面快捷方式消失了解决方法
  14. 单硬盘win10+ubuntu双系统安装教程
  15. Win10环境下安装TensorFlow 2.0简明教程
  16. springboot yml文件不是绿叶子问题
  17. 2.5.Airborne Topographic Laser Scanners 机载地形激光扫描仪
  18. cfa的pv怎么用计算机算,cfa计算器算pv使用步骤
  19. java毕业设计客观题考试mybatis+源码+调试部署+系统+数据库+lw
  20. Getting Started with ARI(ARI入门)

热门文章

  1. Gwallet小广播 | 比利时的区块链公司SettleMint启动印度业务
  2. 2020微信最新版可以修改ID号了,你的号码还那么尬么?
  3. python 如何将JSON数据原封不动的转为字符串(顺序不能变动)?
  4. VIP邮箱批量群发效果哪家最好?
  5. 物流赛道加速内卷,安迅上市能否博得更大席位?
  6. Linux journal日志文件维护
  7. 基于springboot框架的快递代取跑腿服务系统
  8. 微信小程序 api+前端实现生成分享海报
  9. 形态学 - 边界提取
  10. BuddyPress