大数据学习之路,Spark的介绍、部署以及wordcount实例的实现(1)

2023-10-31

Spark简介

什么是Spark?

Apache Spark是一种多语言引擎,用于在单节点机器或集群上执行数据工程、数据科学和机器学习。

Spark的安装

检查

检查HDFS、YARN环境

[vagary@vagary ~]$ jps
4736 NameNode
5490 NodeManager
5106 SecondaryNameNode
4870 DataNode
5881 Jps
5375 ResourceManager

检查Java环境

[vagary@vagary ~]$ java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

Scala部署

下载Scala安装包

这些安装包在官网上都有
https://www.scala-lang.org/download/all.html,然后这里我们安装2.12.15版本的Scala

[vagary@vagary software]$ wget https://downloads.lightbend.com/scala/2.12.15/scala-2.12.15.tgz
解压Scala安装包
[vagary@vagary software]$ tar -zxvf scala-2.12.15.tgz -C ../app
创建软连接
[vagary@vagary app]$ ln -s scala-2.12.15 scala
配置环境变量

编辑全局变量文件,/etc/profile

[root@vagary ~]# vi /etc/profile

然后将环境变量加入

export SCALA_HOME=/home/vagary/app/scala
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin:$PATH

配置完成退出后,使环境变量生效:

[root@vagary ~]# source /etc/profile

然后验证一下,出现版本号就表示配置成功:

[root@vagary ~]# scala -version
Scala code runner version 2.12.15 -- Copyright 2002-2021, LAMP/EPFL and Lightbend, Inc.

Spark部署

首先下载Spark安装包,从官网https://spark.apache.org/downloads.html上看版本很多,这里我们选择3.2.1的版本进行下载
在这里插入图片描述
注:我们Hadoop版本是3.1.3,然后这里下的spark是3.2.1,因为是自己学的,可以这么去用,如果服务器级别的开发是不能这么下载的,还是要下对应版本,或者预编译的。

预编译版的Spark

预编译好的,没有我们要的版本,所以我们要下载,从官网上下
https://spark.apache.org/downloads.html,版本很多,这里我们就用3.2.1,然后选择包类型为Source code,然后进行下载
在这里插入图片描述
解压之后进入dev目录下,修改make-distribution.sh文件

[vagary@vagary dev]$ vi make-distribution.sh

限定好版本

VERSION=3.2.1
SCALA_VERSION=2.12.15
SPARK_HADOOP_VERSION=3.1.3
SPARK_HIVE=1

修改Scala版本

[vagary@vagary dev]$ ./change-scala-version.sh 2.12

然后进行编译就可以了,这个过程会有点漫长~

[vagary@vagary spark-3.2.1]$ ./dev/make-distribution.sh --name 3.2.1-hadoop3.1.3 --tgz -Phive -Phive-thriftserver -Pyarn -Dhadoop.version=3.1.3 -Dscala.version=2.12.15
解压

将安装包解压在app目录下

[vagary@vagary software]$ tar -zxvf spark-3.2.1-bin-hadoop3.2.tgz -C ../app
创建软连接
[vagary@vagary app]$ ln -s spark-3.2.1-bin-hadoop3.2  spark
配置环境变量

编辑全局变量文件,/etc/profile

[root@vagary ~]# vi /etc/profile

然后将环境变量加入

export SPARK_HOME=/home/vagary/app/spark
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SCALA_HOME/bin:$SPARK_HOME/bin:$PATH

配置完成退出后,使环境变量生效:

[root@vagary ~]# source /etc/profile

然后验证一下,出现版本号就表示配置成功:

[root@vagary ~]# scala -version
Scala code runner version 2.12.15 -- Copyright 2002-2021, LAMP/EPFL and Lightbend, Inc.
开始添加Spark配置信息

进入spark/conf文件夹,会看到所有文件都是template,一般情况都是拷贝一个,然后进行修改(避免修改错误,尽量保存原本文件,随时恢复)

[vagary@vagary conf]$ cp spark-env.sh.template spark-env.sh

然后打开spark-env.sh文件添加配置

SPARK_CONF_DIR=/home/vagary/app/spark/conf
HADOOP_CONF_DIR=/home/vagary/app/hadoop/etc/hadoop
YARN_CONF_DIR=/home/vagary/app/hadoop/etc/hadoop
添加MySQL驱动

这里直接拿之前hive的MySQL驱动包就行了

[vagary@vagary lib]$ cp mysql-connector-java-5.1.27-bin.jar ../../spark/jars/
添加hive配置文件

将之前的hive的conf/hive-site.xml文件,拷贝到spark/conf下就行了

[vagary@vagary spark]$ cp ../hive/conf/hive-site.xml ./conf/
测试是否安装部署完成

运行一个测试圆周率的实例,如果出现结果,就说明部署完成

./bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn /home/sqq/app/spark/examples/jars/spark-examples*.jar 10

在这里插入图片描述
其实在跑一个实例任务的时候,会一闪而过一个web端的,但是任务结束就消失了,所以我们需要取启动History Server ,保留跑完的服务;

配置History Server

复制一份spark-defaults.conf出来,进行修改

[vagary@vagary conf]$ cp spark-defaults.conf.template spark-defaults.conf

我们先去hdfs上创建一个目录,存放spark的日志文件

[vagary@vagary conf]$ hdfs dfs -mkdir hdfs://vagary:9000/spark-log
[vagary@vagary conf]$ hdfs dfs -ls hdfs://vagary:9000/
Found 5 items
drwxr-xr-x   - vagary supergroup          0 2022-03-20 17:45 hdfs://vagary:9000/delete
drwxr-xr-x   - vagary supergroup          0 2022-04-10 02:46 hdfs://vagary:9000/spark-log

将这两个配置信息的注释符去掉,然后将目录修改为我们刚刚创建的那个目录

spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://vagary:9000/spark-log

然后修改spark-env.sh文件,加上History Server的配置

export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://vagary:9000/spark-log -Dspark.history.ui.port=7777"

查看当前状态下的启动的服务有哪些


[vagary@vagary conf]$ jps
1377 SecondaryNameNode
6433 Jps
1121 DataNode
988 NameNode
1822 NodeManager
1662 ResourceManager

到sbin目录下,启动History Server


[vagary@vagary sbin]$ ./start-history-server.sh
starting org.apache.spark.deploy.history.HistoryServer, logging to /home/vagary/app/spark/logs/spark-vagary-org.apache.spark.deploy.history.HistoryServer-1-vagary.out

jps查看一下,可以看到History Server是启动好的

[vagary@vagary sbin]$ jps
1377 SecondaryNameNode
1121 DataNode
6723 HistoryServer
988 NameNode
6797 Jps
1822 NodeManager
1662 ResourceManager

然后再去web端查看一下,可以看到是启动成功了
在这里插入图片描述
这里再跑一下实例,查看web端状态,可以看到刚跑的实例在这里是记录日志得了。
在这里插入图片描述

wordcount实例

先将文件上传到hdfs上

[vagary@vagary ~]$ hdfs dfs -put  /home/vagary/wcdata.txt   hdfs://vagary:9000/data/
2022-04-10 03:21:34,402 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false

然后到bin目录下,启动spark-shell.sh脚本

[vagary@vagary bin]$ ./spark-shell

读一个文件将结果打印出来

scala> sc.textFile("/data/wcdata.txt").foreach(println)
aaa;bbb;ccc                                                         (0 + 2) / 2]
aaa;bbb;ddd
aaa;java;hadoop
hadoop;java;spark;scala
scala;spark;java

以分号进行切割,然后打印出来


scala> sc.textFile("/data/wcdata.txt").flatMap(_.split(";")).foreach(println)
aaa
bbb
ccc
aaa
bbb
ddd
aaa
java
hadoop
hadoop
java
spark
scala
scala
spark
java

等同于这样子写法

scala> sc.textFile("/data/wcdata.txt").flatMap(x => x.split(";")).foreach(println)
aaa
bbb
ccc
aaa
bbb
ddd
aaa
java
hadoop
hadoop
java
spark
scala
scala
spark
java

拆成k-v键值对形式


scala> sc.textFile("/data/wcdata.txt").flatMap(x => x.split(";")).map((_,1)).foreach(println)
(scala,1)
(spark,1)
(java,1)
(aaa,1)
(bbb,1)
(ccc,1)
(aaa,1)
(bbb,1)
(ddd,1)
(aaa,1)
(java,1)
(hadoop,1)
(hadoop,1)
(java,1)
(spark,1)
(scala,1)

最后进行值汇总

scala>  sc.textFile("/data/wcdata.txt").flatMap(x => x.split(";")).map((_,1)).reduceByKey(_+_).foreach(println)
(scala,2)
(bbb,2)
(ddd,1)
(java,3)
(spark,2)
(hadoop,2)
(ccc,1)
(aaa,3)

注释:其中flatMap类似于 map,但每个输入项可以映射到 0 个或更多输出项(因此func应该返回一个 Seq 而不是单个项);
foreach,对数据集的每个元素运行函数func。这通常是针对副作用进行的,例如更新累加器或与外部存储系统交互。

yarn-client/yarn-cluster

最大区别:Driver运行地方不同;
client运行在本地客户端,Spark-submit启动Driver线程;
Cluster模式下,启动,会将任务丢给yarn,向yarn申请一台机器运行;

Driver/Executor

Driver:
①、driver进程就是应用的main()函数并且构建sparkContext对象,当我们提交了应用之后,便会启动一个对应的driver进程, driver本身 会根据我们设置的参数占有一定的资源(主要指cpu core和memory),
②、driver可以运行在master上,也可以运行worker上(根据部署模式的不同)。
③、driver首先会向集群管理者(standalone、 yarn, mesos) 申请spark应用所需的资源,也就是executor, 然后集群管理者会根据spark应用所设置的参数在各个worker上分配一定数量 的executor,每个executor都占用-定数星的cpu和memory。在申请到应用所需的资源以后,driver就开始调度和执行我们编写的应用代码了。
④、driver进程 会将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批tasks, 然后将这些tasks分配到各个executor中执行。
Executor:
executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor持有一个线程池,每个线程可以执行一个task, executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。此外executor还有 一个功能就是为应用程序中要求缓存的RDD提供内存式存储,RDD是直接缓存在executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据学习之路,Spark的介绍、部署以及wordcount实例的实现(1) 的相关文章

随机推荐

  • 程序员工作之后如何提升自己?

    IT行业人士里有不少人似乎从来就没晋升过 年复一年 他们工作在同一岗位上 停留在同一职位上 我不知道他们是否得到过晋升机会 你认识这样的人吗 这事居然出人意料地常见 如果你不想终老在这条死胡同上 就得做点什么 在本章中 我将给你一些如何攀登
  • git - 简明指南

    git 简明指南 助你入门 git 的简明指南 木有高深内容 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹 打开 然后执行 git init 以创建新的 git 仓
  • windows开机运行jar

    windows开机自启动jar包 一 保存bat批处理文件 echo off 1 mshta vbscript CreateObject WScript Shell Run s0 0 FALSE window close exit java
  • 邮局选址问题

    邮局选址问题 题目描述 一条直线上有居民点 邮局只能建在居民点上 给定一个有序整形数组arr 每个值表示居民点的一维坐标 再给定一个正数num 表示邮局数量 选择num个居民点建立num个邮局 使所有的居民点到邮局的总距离最短 返回最短的总
  • 中国被黑站点统计系统 2006年9月分析报告

    源 中国被黑站点统计系统 http www zone h com cn amxku amxku at msn com 自在轮回 zizailunhui at msn com wayking wayking at hotmail com 目录
  • Matlab机器人工具箱画图卡顿解决方法

    机器人工具箱画图卡顿问题的解决 一般情况下 使用机器人工具箱画图就只是使用下面的命令 robot plot q 其中q为角度 但是这样画出的图非常卡顿 问题分析 默认画图指令画图效果如下 可以很清楚的看到 下面都是的方格已经多到模糊了 修改
  • FSDataOutputStream (浅析hadoop写入数据api)

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 Hadoop对于写操作提供了一个类 FSDataOutp
  • 【JS&Html】一些总结

    html里面 监听回车事件 监听回车 若回车按下 执行相应操作 document onkeypress kDown if document layers window captureEvents Event KEYDOWN function
  • 提示工程师:如何高效的向ChatGPT提问对话

    最近ChatGPT真的火出圈了 现在打开知乎 博客 抖音 B站都是这方面的信息 ChatGPT相关的信息铺天盖地的袭转而来 对于这种类似新一轮信息技术革命 作为普通人的我们 该如何做呢 这是我们该思考的 英伟达创始人兼CEO黄仁勋 this
  • 闪回数据库案例

    闪回数据库案例 测试数据 create table sct4 id number 4 name varchar2 20 insert into sct4 values 1 lili insert into sct4 values 2 lil
  • 小孩报数问题

    import java util LinkedList import java util List import java util Scanner public class Main public static void main Str
  • Java笔记-多线程之线程池

    介绍 在前面的文章中 我们使用线程的时候就去创建一个线程 这样实现起来非常简便 但是就会有一个问题 程序启动一个新线程成本是比较高的 因为它涉及到要与操作系统进行交互 而使用线程池可以很好的提高性能 尤其是当程序中要创建大量生存期很短的线程
  • 最萌算法学习,一秒让程序员及其女友都能学会!

    普通程序员 不学算法 也可以成为大神吗 对不起 这个 绝对不可以 可是算法好难啊 看两页书就想睡觉 所以就不学了吗 就一直当普通程序员吗 如果有一本算法书 看着很轻松 又有代码示例 又有讲解 怎么会有那样的书呢 哎呀 最好学了算法人还能变得
  • OC中的copy和mutableCopy

    在OC中 对对象的拷贝可分为深拷贝和浅拷贝 深拷贝 会生成新的指针和新的内存 新的指针指向新开辟的内存空间 并且会将原来的内存中的内容也拷贝过来 浅拷贝 会生成新的指针 但是不会开辟新的内存空间 也不会拷贝原来内存中的内容 新生成的指针会指
  • 程序员的前20个搜索和排序算法面试问题

    大家好 如果您正在准备编程工作面试或正在寻找新工作 那么您知道这不是一个容易的过程 在您职业的任何阶段 您都必须幸运地接到电话并进行第一轮面试 但是在初学者方面 当您寻找第一份工作时就更加困难 这就是为什么您不能只是轻描淡写 您必须准备抓住
  • vue2:Vant底部导航栏记录active,刷新页面记录active的值

    话不多说 直接上代码
  • python ddt数据驱动

    python ddt数据驱动 1 背景 在自动化测试当中 我们通常会将测试数据从测试代码中抽离出来放在单独的文件中 既能减少代码量 也能降低代码的维护成本 通过数据的改变从而驱动自动化测试的执行 接触python自动化测试的第一个框架通常都
  • 模型推理那些事

    模型推理那些事 目前主流的深度学习框架有目前越来越多的深度学习框架 工具集以及定制化硬件使得构建 部署和跨框架管理深度学习越来越复杂 常用的深度学习框架有TensorFlow Pytorch MXNet和CNTK 因为训练最为耗时 所以常使
  • JS的初步了解学习笔记

    js学习笔记 一 初识js 1 什么是js JavaScript是目前web开发中不可缺少的脚本语言 简称js js不需要编译即可运行 运行在客户端 需要通过浏览器来解析执行JavaScript代码 问 Js属于编程语言吗 编程语言分类 前
  • 大数据学习之路,Spark的介绍、部署以及wordcount实例的实现(1)

    Spark简介 什么是Spark Apache Spark是一种多语言引擎 用于在单节点机器或集群上执行数据工程 数据科学和机器学习 Spark的安装 检查 检查HDFS YARN环境 vagary vagary jps 4736 Name