赞
踩
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 为你的用户名
② 解压打包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安装成功验证
Scala安装成功验证结果图
③ 安装后,还需要修改Spark的配置文件spark-env.sh与slaves文件
a) 修改slaves文件
$ cd /usr/local/spark
$ cp ./conf/slaves.template ./conf/slaves
$ vim ./conf/slaves
文件修改结果如下(原文白框处的localhost需要删除改为如下内容)
b) 修改spark-env.sh文件
$ cd /usr/local/spark
$ cp ./conf/spark-env.sh.template ./conf/spark-env.sh
$ vim ./conf/spark-env.sh
以下配置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
配置效果如下图所示
④ 子节点分发
注意: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包到需要的地方
分发效果如下图所示:
⑤ 启动spark
注:在启动spark前,由于我配置的是基于集群的spark,是Spark on YARN,故启动前需要先启动Hadoop集群
a) 启动集群的命令如下:
$ start-all.sh
$ mr-jobhistory-daemon.sh start historyserver
启动集群后的jps如图所示:
b)启动spark的命令如下:
$ cd /usr/local/spark
$ ./sbin/start-all.sh
$ jps #可从各个节点查看进程的分配情况
c) 可以用spark自带的示例——运行检查spark是否安装成功
$ cd /usr/local/spark
$ bin/run-example SparkPi 2>&1 | grep "Pi is"
d) 启动spark命令行的命令如下:
$ ./bin/spark-shell
上述命令的结果如下图所示:
(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()
[使用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))
以上代码的结果如下
③ 统计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)
以上代码的结果如下
④ 退出Spark Shell
输入如下代码,即可退出spark shell
:quit
(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 #查看复制结果
② 接着在安装目录中使用下面命令创建一个Shell脚本文件,用于启动sbt:
$ vim /usr/local/sbt/sbt
③ sbt脚本文件内容为:
#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"
④ 保存后,还需要为该Shell脚本文件增加可执行权限:
$ chmod u+x /usr/local/sbt/sbt
上述代码执行过程如下:
⑤为了保证sbt下载可以加快速度,(更换仓库地址,加快编译速度),所以进行如下设置:
a) 创建repositories文件
$ cd ~
$ mkdir .sbt #如果该目录已经存在,就不用创建了
$ cd .sbt
$ vim repositories #使用vim编辑器创建repositories文件
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]
b) 修改/usr/local/sbt/conf/sbtopts 文件,在末尾新增一行,内容如下:
-Dsbt.override.build.repos=true
以上所有代码的运行如下图所示*
⑥ 可以使用如下命令查看sbt版本信息:
$ cd /usr/local/sbt
$ ./sbt sbtVersion
以上代码的执行过程如图所示:
(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
② 为了保证Maven下载可以加快速度,(更换仓库地址,加快编译速度),所以进行如下设置:
$ cd /usr/local/maven/conf
$ vim settings.xml
修改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>
修改后过程与结果如下图所示:
(5)du
(6)独立应用程序编程——sbt
① 使用sbt对scala独立应用程序进行编译打包
在终端中执行如下命令创建一个文件夹 sparkapp 作为应用程序根目录:
$ cd ~
$ mkdir ./sparkapp # 创建应用程序根目录
$ mkdir -p ./sparkapp/src/main/scala # 创建所需的文件夹结构
②在 ./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)) } }
注解:该程序计算 /usr/local/spark/README 文件中包含 “a” 的行数 和包含 “b” 的行数。
该程序依赖 Spark API,因此我们需要通过 sbt 进行编译打包。
③ 在~/sparkapp这个目录中新建文件simple.sbt,命令如下:
$ cd ~/sparkapp
$ vim simple.sbt
④ 在simple.sbt中添加如下内容,声明该独立应用程序的信息以及与 Spark 的依赖关系:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"
注解:文件 simple.sbt 需要指明 Spark 和 Scala 的版本。在上面的配置信息中,scalaVersion用来指定scala的版本,sparkcore用来指定spark的版本
⑤ 使用 sbt 打包 Scala 程序
$ cd ~/sparkapp
$ find .
上述代码运行结果如下
t,命令如下:
$ cd ~/sparkapp
$ vim simple.sbt
④ 在simple.sbt中添加如下内容,声明该独立应用程序的信息以及与 Spark 的依赖关系:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"
注解:文件 simple.sbt 需要指明 Spark 和 Scala 的版本。在上面的配置信息中,scalaVersion用来指定scala的版本,sparkcore用来指定spark的版本
⑤ 使用 sbt 打包 Scala 程序
$ cd ~/sparkapp
$ find .
未完待续~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。