实验7 Spark初级编程实践

news2025/1/11 3:57:38

一、实验目的

  • 掌握使用 Spark 访问本地文件和 HDFS 文件的方法
  • 掌握 Spark 应用程序的编写、编译和运行方法

二、实验平台

  • 操作系统:Ubuntu18.04(或 Ubuntu16.04)
  • Spark 版本:2.4.0
  • Hadoop 版本:3.1.3

三、实验内容和要求

1. 安装 Hadoop 和 Spark

进人 Linux 操作系统,完成 Hadoop 伪分布式模式的安装。完成 Hadoop 的安装以后,再安装 Spark (Local 模 式 ) 。具体安装过程 ,可以 参考教材官网(https://dblab.xmu.edu.cn/post/bigdata3/)的“教材配套大数据软件安装和编程实践指南”。

2. Spark 读取文件系统的数据

启动hadoop

cd /usr/local/hadoop
start-all.sh

在这里插入图片描述

(1) 在 spark-shell 中读取 Linux 系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;

echo -e "Hello\nThis is a test\nBye!" >> ~/test.txt

在这里插入图片描述

启动spark-shell:

cd  /usr/local/spark
./bin/spark-shell

在这里插入图片描述
注意此处的spark和Scala的版本
输入命令:

val textFile=sc.textFile("file:///home/hadoop/test.txt")

在这里插入图片描述

textFile.count()

在这里插入图片描述

(2) 在 spark-shell 中读取 HDFS 系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后统计出文件的行数;

如果该文件不存在,创建:

hadoop fs -mkdir -p /usr/hadoop

在这里插入图片描述
在终端执行,上传test.txt文件至HDFS中:

/usr/local/hadoop/bin/hdfs dfs -put ~/test.txt

在这里插入图片描述
在Spark执行

val textFile=sc.textFile("hdfs://localhost:9000/user/hadoop/test.txt")
textFile.count()

在这里插入图片描述

(3) 编写独立应用程序(推荐使用 Scala),读取 HDFS 文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后统计出文件的行数;通过 sbt 将整个应用程序编译打包成 JAR 包,并将生成的 JAR 包通过 spark-submit 提交到 Spark 中运行命令。
进入spark安装目录:

cd /usr/local/spark
mkdir mycode && cd mycode

创建HDFStset目录并编写Scala文件:

mkdir -p HDFStest/src/main/scala
vim ./HDFStest/src/main/scala/HDFStest.scala

HDFStest.scala:

/* HDFStest.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
 
object HDFStest {
    def main(args: Array[String]) {
        val logFile = "hdfs://localhost:9000/user/hadoop/test.txt"
        val conf = new SparkConf().setAppName("Simple Application")
        val sc = new SparkContext(conf)
        val logData = sc.textFile(logFile, 2)
        val num = logData.count()
        printf("The num of this file is %d\n", num)
    }
}

进入 HDFStest 目录,创建 simple.sbt:

cd HDFStest
vim simple.sbt

注意这里的 scalaVersion 是我的 Scala 版本(2.11.12),spark-core 是我的 spark 版本(2.4.0)。

name := "A Simple HDFS Test"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"

在这里插入图片描述

接下来,可以通过如下代码将整个应用程序打包成 JAR:

sbt package
/usr/local/spark/bin/spark-submit  --class  "HDFStest" /usr/local/spark/mycode/HDFStest/target/scala-2.11/a-simple-hdfs-test_2.11-1.0.jar 2>& 1 | grep The

3. 编写独立应用程序实现数据去重

对于两个输入文件 A 和 B,编写 Spark 独立应用程序(推荐使用 Scala),对两个文件进行
合并,并剔除其中重复的内容,得到一个新文件 C。下面是输入文件和输出文件的一个样例,
可供参考。
输入文件 A 的样例如下:

20170101 x
20170102 y
20170103 x
20170104 y
20170105 z
20170106 z

输入文件 B 的样例如下:

20170101 y
20170102 y
20170103 x
20170104 z
20170105 y

根据输入的文件 A 和 B 合并得到的输出文件 C 的样例如下:

20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 z
cd /usr/local/spark/mycode
mkdir -p RemDup/src/main/scala
cd RemDup
mkdir datas

写入A数据:

vim ./datas/A

写入B数据:

vim ./datas/B

写入RemDup.scala:

vim ./src/main/scala/RemDup.scala

编写Scale文件

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner

object RemDup {
    def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("RemDup")
        val sc = new SparkContext(conf)
        val dataFile = "file:///usr/local/spark/mycode/RemDup/datas"
        val data = sc.textFile(dataFile,2)
        val res = data.filter(_.trim().length>0).map(line=>(line.trim,"")).partitionBy(new HashPartitioner(1)).groupByKey().sortByKey().keys
        res.saveAsTextFile("file:///usr/local/spark/mycode/RemDup/result")
    }
}

编写simple.sbt文件:

vim simple.sbt

注意此处的scale版本和spark版本

name := "Remove Duplication"
version := "1.0"
scalaVersion := "2.12.15"
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.2.0"

打包:

sbt package
/usr/local/spark/bin/spark-submit --class "RemDup"  /usr/local/spark/mycode/RemDup/target/scala-2.11/remove-duplication_2.11-1.0.jar

在这里插入图片描述

查看结果:

cat result/*

在这里插入图片描述

4. 编写独立应用程序实现求平均值问题

每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写 Spark 独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。

Algorithm 成绩:

小明 92
小红 87
小新 82
小丽 90

Database 成绩:

小明 95
小红 81
小新 89
小丽 85

Python 成绩:

小明 82
小红 83
小新 94
小丽 91

平均成绩如下:

(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)

进入到 mycode 目录,新建 AvgScore 目录,

cd /usr/local/spark/mycode
mkdir -p AvgScore/src/main/scala
cd AvgScore

在这里插入图片描述

新建 datas 目录,写入文件 algorithm、database、python:

mkdir datas

注意这里 algorithm、database 和 python 文件内容不能有多余的换行符或者空格!

vim ./datas/algorithm
vim ./datas/database
vim ./datas/python

编写 Scala 文件:

vim ./src/main/scala/AvgScore.scala

代码如下:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner

object AvgScore {
    def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("AvgScore")
        val sc = new SparkContext(conf)
        val dataFile = "file:///usr/local/spark/mycode/AvgScore/datas"
        val data = sc.textFile(dataFile,3)

       val res = data.filter(_.trim().length>0).map(line=>(line.split(" ")(0).trim(),line.split(" ")(1).trim().toInt)).partitionBy(new HashPartitioner(1)).groupByKey().map(x => {
       	   	var n = 0
	       	var sum = 0.0
	       	for(i <- x._2){
				sum = sum + i
	       		n = n +1
    	    }
	        val avg = sum/n
    	    val format = f"$avg%1.2f".toDouble
    	    (x._1,format)
	    })
       res.saveAsTextFile("file:///usr/local/spark/mycode/AvgScore/result")
    }
}

编写 simple.sbt 文件:

vim simple.sbt

内容如下:

name := "Average Score"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"

在这里插入图片描述

使用如下命令打包:

sbt package

在这里插入图片描述

使用生成的 jar 包:

/usr/local/spark/bin/spark-submit --class "AvgScore"  /usr/local/spark/mycode/AvgScore/target/scala-2.11/average-score_2.11-1.0.jar

使用如下命令查看输出:

cat result/*

输出如下:
在这里插入图片描述

四、遇到的问题:

1、 输入/usr/local/sbt/sbt package打包时,显示找不到sbt
2、 vim中无法退出
3、 报错127.0.1.1 to hadoop:9000 failed on connection exception: 拒绝连接
4、 没有文件夹/usr/Hadoop/test.txt

五、解决办法:

1、 将sbt package设置为全局变量,后续打包只需输入sbt package
2、 vim退出方法:esc :wq
3、 未开启hadoop,输入start-all.sh开启hadoop
4、 新建文件夹mkdir -p test.txt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

举个栗子~Alteryx 技巧(3):离线激活 Alteryx Designer

之前我们分享了 如何下载并安装 Alteryx Designer。然而&#xff0c;对于内网环境的用户来说&#xff0c;就无法使用上述方法来激活软件了&#xff01;那么&#xff0c;不能连接外网的电脑该如何离线激活 Alteryx Designer 呢&#xff1f; 本期《举个栗子&#xff01;Alteryx …

opencv c++ 边缘提取

1、边缘 1.1 边缘定义 以图像像素值突变最大的方向作为边缘法线&#xff0c;与边缘法线垂直的就是边缘。 边缘强度&#xff1a;局部图像上的像素值突变程度&#xff08;图像局部一阶梯度和二阶梯度值&#xff09;。 1.2 边缘类别 跃迁类型 …

645仪表以JSON格式上发方法

1.概述 之前我们已经介绍了Modbus RTU仪表实现JSON格式上发云服务器的方法&#xff0c;类似的现在也可以支持645协议的仪表通过JSON格式上发服务器。 卓岚实现645仪表转JSON网关的特点有&#xff1a; 1.提供透传、MQTT、POST、GET等上位机协议&#xff0c;结合JSON格式进行传…

CSS三大特性之层叠性

CSS的三个特性&#xff1a;层叠性&#xff0c;继承性&#xff0c;优先级 层叠性&#xff1a; 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖(层叠)另一个冲突的样式&#xff0c;层叠性主要解决样式冲突的问题。 层叠性原则&#xff1a; 样式冲突&#xff0c…

Deadlock found when trying to get lock; try restarting transaction

报错详情 Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction The error may involve com.iss.cms.fdrb.common.dao.entity.InterfaceQueue.updateInt…

数据库、计算机网络,操作系统刷题笔记6

数据库、计算机网络&#xff0c;操作系统刷题笔记6 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&…

RK3588平台开发系列讲解(Thermal篇)Thermal介绍及用法

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、Thermal介绍二、相关代码路径三、用户态接口说明四、常见问题4.1 关温控4.2 获取当前温度沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍Thermal的相关内容及调试手段。 一…

环境配置之终端WezTerm

前言 其实是在复习的过程中发现终端非常别扭&#xff0c;了解了一些大佬的使用方式后&#xff0c;尝试使用一个多平台的终端应用。 环境配置 之前在MAC上使用过的终端包括ZenTermLite和Item2&#xff0c;这次使用一个跨平台的终端WezTerm&#xff01; 缺点就是自定义的地方太…

JUC并发编程第七篇,volatile凭什么可以保证可见性和有序性?我们该如何正确使用它?

JUC并发编程第七篇&#xff0c;volatile凭什么可以保证可见性和有序性&#xff1f;我们该如何正确使用它&#xff1f;一、volatile的作用是什么&#xff1f;二、什么是内存屏障&#xff1f;三、四大内存屏障指令源码解析&#xff01;四、volatile如何通过内存屏障保证可见性和有…

Spring MVC数据绑定和表单标签的应用(附带实例)

为了让读者进一步学习数据绑定和表单标签&#xff0c;本节给出了一个应用范例 springMVCDemo04。该应用中实现了 User 类属性和 JSP 页面中表单参数的绑定&#xff0c;同时在 JSP 页面中分别展示了 input、textarea、checkbox、checkboxs、select 等标签。 应用的相关配置 在…

解析csv文件,读取百万级数据

最近在处理下载支付宝账单的需求&#xff0c;支付宝都有代码示例&#xff0c;功能完成还是比较简单的&#xff0c;唯一的问题就在于下载后的文件数据读取。账单文件可大可小&#xff0c;要保证其可用以及性能就不能简单粗暴的完成开发就行。 文件下载是是csv格式&#xff0c;此…

干货|成为优秀软件测试工程师的六大必备能力

“软件吞噬世界”、“软件定义一切”。随着软件行业的迅速发展&#xff0c;保障软件质量的关键环节——软件测试也变得越来越重要。而执行测试工作的测试工程师&#xff0c;便是软件质量的把关者。 测试工程师早在2005年就被劳动和社会保障部门列入第四批新职业中。经过短短几…

文件批量从gbk转成utf8的工具

工具名&#xff1a;GB/BIG5/UTF-8 文件编码批量转换程序 下载地址&#xff1a; https://www.wenjiangs.com/wp-content/uploads/2018/05/GB2UTF8.zip 程序功能&#xff1a;将 GB、BIG5、UTF-8 文件相互转换&#xff0c;方便的批量处理能力&#xff0c;主要用于网站文件编码方式…

单商户商城系统功能拆解41—应用中心—用户储值

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

R语言进行相关矩阵分析及其网络可视化

数据准备 # 选择感兴趣的列 mydata <- mtcars %>% select(mpg, disp, hp, drat, wt, qsec) # 添加一些缺失值 mydata$hp[3] <- NA # 检查数据 head(mydata, 3) ## mpg disp hp drat wt qsec ## Mazda RX4 21.0 160 110 3.90 2.62 16.5 ## Ma…

基于WiFi小车控制板的单片机小系统原理图

小系统&#xff0c;指的是的用少的元件组成的单片机可以工作的系统。一般在设计小系统的时候分为这四种必要的电路&#xff0c;分别是1、电源供电电路;2、单片机复位电路;3、时钟振荡电路;4、程序的下载接口电路。这次基于我们研发的WiFi小车51核心控制板的小系统原理图来讲一下…

uni-app实现支付及项目打包上传

本文主要介绍uni-app项目中如何实现支付功能&#xff08;支付宝支付、微信支付&#xff09;&#xff0c;及项目如何打包上传。 一、实现支付 前置工作&#xff0c;项目要实现支付功能&#xff0c;首先要在根目录manifest.json文件内App模块配置中进行设置。 其中&#xff0c;a…

机构运动学分析

背景介绍 空间机构具有结构紧凑、运动灵活等特点&#xff0c;在航空航天、精密仪器以及工业设备等领域具有广泛的应用。调研发现&#xff0c;机械臂一般采用伺服电机作为动力源&#xff0c;通过空间连杆驱动末端执行器&#xff0c;大大的减轻了工人的劳动强度。本节中主要是针对…

iconfont小图标从下载到引入到vue项目中的详细教程

地址&#xff1a;iconfont-阿里巴巴矢量图标库 iconfont小图标下载&#xff1a; &#xff08;1&#xff09;查找图标 在搜索框直接文字搜索或者看下面的小图标库&#xff0c;找想要的&#xff0c;每个小图标库都有一个名字&#xff0c;比如&#xff1a;“阿里云官网”&#x…