当前位置:   article > 正文

大数据技术原理与应用实验指南——Spark安装与编程实践1_大数据技术原理与应用实验一

大数据技术原理与应用实验一

大数据技术原理与应用实验指南——Spark安装与编程实践

1. 实验目的

(1) 理解Spark的处理逻辑。

(2) 熟悉Scala编程。

2. 实验内容

(1) 安装Spark2.4.0与Scala2.10.4(全分布式)

(2)使用Spark Shell编写代码

(3)安装sbt-1.3.8

(4)安装maven-3.6.3

(5)独立应用程序编程(学会用sbt或者maven对Scala、Java独立应用程序进行编译打包)

4. 实验步骤

实验步骤的思维导图如下图所示

(1)安装Spark(全分布模式)

在安装之前请将安装包保存在/home/hadoop目录下

① 解压打包Spark、修改名称、并赋予权限

$ sudo tar -zxf ~/spark-2.4.0-bin-without-hadoop.tgz -C /usr/local/
$ cd /usr/local
$ sudo mv ./spark-2.4.0-bin-without-hadoop/ ./spark
$ sudo chown -R hadoop:hadoop ./spark          # 此处的 hadoop 为你的用户名
  • 1
  • 2
  • 3
  • 4

② 解压打包Scala、修改名称、并赋予权限

$ sudo tar -zxf ~/scala-2.10.4.tgz -C /usr/local/
$ cd /usr/local
$ sudo mv ./spark-2.10.4/ ./scala
$ sudo chown -R hadoop:hadoop ./scala         # 此处的 hadoop 为你的用户名
$ /usr/local/scala/bin/scala #Scala安装成功验证
  • 1
  • 2
  • 3
  • 4
  • 5

Scala安装成功验证结果图
在这里插入图片描述

③ 安装后,还需要修改Spark的配置文件spark-env.sh与slaves文件

a) 修改slaves文件

$ cd /usr/local/spark  
$ cp ./conf/slaves.template ./conf/slaves  
$ vim ./conf/slaves
  • 1
  • 2
  • 3

文件修改结果如下(原文白框处的localhost需要删除改为如下内容)

在这里插入图片描述

b) 修改spark-env.sh文件

$ cd /usr/local/spark  
$ cp ./conf/spark-env.sh.template ./conf/spark-env.sh
$ vim ./conf/spark-env.sh
  • 1
  • 2
  • 3

以下配置Hadoop-YARN模式

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162  
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)  
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop  
export YARN_CONF_DIR=/usr/local/hadoop/etc/hadoop  

export SPARK_MASTER_IP=Master  
export SPARK_MASTER_PORT=7077  
export SPARK_WORKER_CORES=1  
export SPARK_WORKER_MEMORY=1G  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

配置效果如下图所示

在这里插入图片描述

④ 子节点分发

注意:scp不能直接传输到子节点的/usr/local文件下,要先传到根目录(/home/hadoop下)再剪切过去)

分发代码如下:(有几个节点就发几次)

$ # Master 节点操作  
$ scp -r /usr/local/scala Slave1:~/scala  
$ scp -r /usr/local/spark Slave1:~/spark   	  
$ # Slave 节点操作  
$ sudo mv ~/scala /usr/local/scala  #移动scala包到需要的地方
$ sudo mv ~/spark /usr/local/spark  #移动spark包到需要的地方
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

分发效果如下图所示:
在这里插入图片描述
在这里插入图片描述
⑤ 启动spark

注:在启动spark前,由于我配置的是基于集群的spark,是Spark on YARN,故启动前需要先启动Hadoop集群

a) 启动集群的命令如下:

$ start-all.sh
$ mr-jobhistory-daemon.sh start historyserver
  • 1
  • 2

启动集群后的jps如图所示:

在这里插入图片描述

b)启动spark的命令如下:

$ cd /usr/local/spark  
$ ./sbin/start-all.sh 
$ jps #可从各个节点查看进程的分配情况
  • 1
  • 2
  • 3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c) 可以用spark自带的示例——运行检查spark是否安装成功

$ cd /usr/local/spark
$ bin/run-example SparkPi 2>&1 | grep "Pi is"
  • 1
  • 2

在这里插入图片描述

d) 启动spark命令行的命令如下:

$ ./bin/spark-shell
  • 1

上述命令的结果如下图所示:

在这里插入图片描述

(2) 使用Spark Shell编写代码

① 简单的RDD操作代码如下:(加载文件|读取内容|计数)

val textFile = sc.textFile("file:///usr/local/spark/README.md")
//获取RDD文件textFile的第一行内容
textFile.first()
//获取RDD文件textFile所有项的计数
textFile.count()
//抽取含有“Spark”的行,返回一个新的RDD
val lineWithSpark = textFile.filter(line => line.contains("Spark"))
//统计新的RDD的行数[使用Scala语言查询统计]
lineWithSpark.count()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

[使用Linux语言查询统计]
在这里插入图片描述

以上是两种不同的方法查询统计行数

② 找出文本中每行的最多单词数***(两个方法)***

//方法一
textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
//方法二
import java.lang.Math
textFile.map(line => line.split(" ").size).reduce((a,b)=>Math.max(a,b))
  • 1
  • 2
  • 3
  • 4
  • 5

以上代码的结果如下
在这里插入图片描述

③ 统计namenode日志文件中出现error行数

val textFile =sc.textFile("file:///usr/local/hadoop/logs/hadoop-hadoop-namenode-Master.log")
//方法一
val errs=textFile.filter(line => line.contains("ERROR"))
errs.count()
//方法二
val ones=errs.map(s=>1)
val count=ones.reduce((a,b)=>a+b)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

以上代码的结果如下
在这里插入图片描述
在这里插入图片描述

④ 退出Spark Shell

输入如下代码,即可退出spark shell

:quit
  • 1

(3)安装sbt-1.3.8

注:使用Scala语言编写的Spark程序,需要使用sbt进行编译打包。(下载后的安装包sbt-1.3.8.tgz保存在了“/home/hadoop”目录下)

① 安装abt代码如下

$ sudo mkdir /usr/local/sbt                # 创建安装目录
$ cd ~
$ sudo tar -zxvf ./sbt-1.3.8.tgz -C /usr/local 
$ cd /usr/local/sbt
$ sudo chown -R hadoop /usr/local/sbt     # 此处的hadoop为系统当前用户名
$ cp ./bin/sbt-launch.jar ./  #把bin目录下的sbt-launch.jar复制到sbt安装目录下
$ ls #查看复制结果
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
在这里插入图片描述

② 接着在安装目录中使用下面命令创建一个Shell脚本文件,用于启动sbt:

$ vim /usr/local/sbt/sbt
  • 1

③ sbt脚本文件内容为:

#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
  • 1
  • 2
  • 3

在这里插入图片描述

④ 保存后,还需要为该Shell脚本文件增加可执行权限:

$ chmod u+x /usr/local/sbt/sbt
  • 1

上述代码执行过程如下:
在这里插入图片描述

⑤为了保证sbt下载可以加快速度,(更换仓库地址,加快编译速度),所以进行如下设置:

a) 创建repositories文件

$ cd ~
$ mkdir .sbt   #如果该目录已经存在,就不用创建了
$ cd .sbt
$ vim repositories #使用vim编辑器创建repositories文件
  • 1
  • 2
  • 3
  • 4

repositories文件内容如下:

[repositories]
local
huaweicloud-maven: https://repo.huaweicloud.com/repository/maven/
maven-central: https://repo1.maven.org/maven2/
sbt-plugin-repo: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

b) 修改/usr/local/sbt/conf/sbtopts 文件,在末尾新增一行,内容如下:

-Dsbt.override.build.repos=true
  • 1

在这里插入图片描述

以上所有代码的运行如下图所示*
在这里插入图片描述

⑥ 可以使用如下命令查看sbt版本信息:

$ cd /usr/local/sbt
$ ./sbt sbtVersion
  • 1
  • 2

以上代码的执行过程如图所示:
在这里插入图片描述

在这里插入图片描述

(4)安装maven-3.6.3

① 下载后的压缩包apache-maven-3.6.3-bin.zip保存在了“/home/hadoop”目录下

$ sudo unzip ~/apache-maven-3.6.3-bin.zip -d /usr/local
$ cd /usr/local
$ sudo mv apache-maven-3.6.3/ ./maven
$ sudo chown -R hadoop ./maven
  • 1
  • 2
  • 3
  • 4

② 为了保证Maven下载可以加快速度,(更换仓库地址,加快编译速度),所以进行如下设置:

$ cd /usr/local/maven/conf
$ vim settings.xml
  • 1
  • 2

修改settings.xml中的文本内容如下:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云谷歌仓库</name>
        <url>https://maven.aliyun.com/repository/google</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云阿帕奇仓库</name>
        <url>https://maven.aliyun.com/repository/apache-snapshots</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云spring仓库</name>
        <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云spring插件仓库</name>
        <url>https://maven.aliyun.com/repository/spring-plugin</url>
    </mirror>
</mirrors>
</settings>
  • 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

修改后过程与结果如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(5)du

(6)独立应用程序编程——sbt

① 使用sbt对scala独立应用程序进行编译打包

在终端中执行如下命令创建一个文件夹 sparkapp 作为应用程序根目录:

$ cd ~           
$ mkdir ./sparkapp        # 创建应用程序根目录
$ mkdir -p ./sparkapp/src/main/scala     # 创建所需的文件夹结构
  • 1
  • 2
  • 3

②在 ./sparkapp/src/main/scala 下建立一个名为 SimpleApp.scala 的文件(vim ./sparkapp/src/main/scala/SimpleApp.scala),添加代码如下:

/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
 
object SimpleApp {
        def main(args: Array[String]) {
            val logFile = "file:///usr/local/spark/README.md" // Should be some file on your system
            val conf = new SparkConf().setAppName("Simple Application")
            val sc = new SparkContext(conf)
            val logData = sc.textFile(logFile, 2).cache()
            val numAs = logData.filter(line => line.contains("a")).count()
            val numBs = logData.filter(line => line.contains("b")).count()
            println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

注解:该程序计算 /usr/local/spark/README 文件中包含 “a” 的行数 和包含 “b” 的行数。

该程序依赖 Spark API,因此我们需要通过 sbt 进行编译打包。

③ 在~/sparkapp这个目录中新建文件simple.sbt,命令如下:

$ cd ~/sparkapp
$ vim simple.sbt
  • 1
  • 2

④ 在simple.sbt中添加如下内容,声明该独立应用程序的信息以及与 Spark 的依赖关系:

name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"
  • 1
  • 2
  • 3
  • 4

注解:文件 simple.sbt 需要指明 Spark 和 Scala 的版本。在上面的配置信息中,scalaVersion用来指定scala的版本,sparkcore用来指定spark的版本

⑤ 使用 sbt 打包 Scala 程序

$ cd ~/sparkapp
$ find .
  • 1
  • 2

上述代码运行结果如下

t,命令如下:

$ cd ~/sparkapp
$ vim simple.sbt
  • 1
  • 2

④ 在simple.sbt中添加如下内容,声明该独立应用程序的信息以及与 Spark 的依赖关系:

name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"
  • 1
  • 2
  • 3
  • 4

注解:文件 simple.sbt 需要指明 Spark 和 Scala 的版本。在上面的配置信息中,scalaVersion用来指定scala的版本,sparkcore用来指定spark的版本

⑤ 使用 sbt 打包 Scala 程序

$ cd ~/sparkapp
$ find .
  • 1
  • 2

未完待续~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/452544
推荐阅读
相关标签
  

闽ICP备14008679号