由于CSDN上传md文件总是会使图片失效
完整的实验文档地址如下:
https://download.csdn.net/download/qq_36428822/86224843?spm=1001.2014.3001.5501
1、实验环境:
设备名称 LAPTOP-9KJS8HO6
处理器 Intel® Core™ i5-10300H CPU @ 2.50GHz 2.50 GHz
机带 RAM 16.0 GB (15.8 GB 可用)
主机操作系统 Windows 10 家庭中文版
虚拟机操作系统 ubuntukylin-16.04
Hadoop 版本 3.1.3
JDK 版本 1.8
Java IDE:Eclipse
系统类型 64 位操作系统, 基于 x64 的处理器
笔和触控 没有可用于此显示器的笔或触控输入
2、实验内容与完成情况:
- 安装hadoop和spark。
将下载好的安装包解压至固定路径并安装
使用命令./bin/spark-shell启动spark
图2启动spark
- Spark读取文件系统的数据
(1) 在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;
图3 spark统计行数
(2) 在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;
图4 hdfs上传文件1.txt
图5 spark统计hdfs文件1.txt行数
(3) 编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。
SimpleApp.scala文件内代码内容如下所示:
图6 SimpleApp.scala文件内容
simple.sbt文件内代码如下:
图7 simple.sbt文件内容
使用、usr/local/sbt/sbt package命令将以上代码文件夹打jar包,打包完成后可看到打包成功的输出,如下图:
图8 sbt打包
运行打好的jar包,使用命令/usr/local/spark/bin/spark-submit --class “SimpleApp” /usr/local/spark/mycode/HDFStest/target/scala-2.11/a-simple-hdfs-test_2.11-1.0.jar即可,如下:
图9 运行结果:文件中行数4行
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
RemDup.scala文件内代码内容如下所示:
图10 RemDup.scala文件内容
创建simple.sbt文件并向其中输入代码,使用命令/usr/local/sbt/sbt package 将代码文件夹打包,打包成功后结果如下:
图11 simple.sbt文件内容
图12 RemDup工程打包结果
再使用命令/usr/local/spark/bin/spark-submit --class “RemDup” /home/hadoop/sparkapp2/RemDup/target/scala-2.11/remove-duplication_2.11-1.0.jar
即可运行,结果如下
图13 程序运行结果
- 编写独立应用程序实现求平均值问题
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写 Spark 独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。
Algorithm 成绩:
小明 92
小红 87
小新 82
小丽 90
Database 成绩:
小明 95
小红 81
小新 89
小丽 85
Python 成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
创建代码文件夹,并创建存放成绩数据的文件夹datas,使用vim命令向其中添加题示数据:
图14 成绩数据文件
图15 AvgScore.scala代码
图16 simple.sbt文件
图17 sbt打包结果
运行jar包,使用命令/usr/local/spark/bin/spark-submit --class “AvgScore” /home/hadoop/sparkapp3/AvgScore/target/scala-2.11/average-score_2.11-1.0.jar
得到运行结果,每个学生的平均成绩如下:
图18 程序运行结果
3、出现的问题:
1、用spark读取本地文件并统计文件内容行数时报出IllegalArgumentException(非法参数异常)
图19 问题1
2、用spark读取hdfs文件系统中的文件并统计文件内容行数时报出InvalidInputException(无效输入异常),并提示输入路径不存在
图20 问题2
3、编写spark独立应用程序并实现数据去重时,程序运行报出异常:java.net.URISyntaxException: Illegal character in scheme name at index 0
图21 问题3
4、解决方案:
1、spark读取本地文件的url路径有问题,正确的应该是val textFile=sc.textFile(“file:///usr/local/hadoop/1.txt”),错误原因是file:///少打了一个/
2、依然是读取hdfs文件的url路径有问题,hdfs文件系统的根目录不是~,而应该是/user/hadoop,其中hadoop是用户名
3、代码中获取hdfs文件的地址URL前面有空格,就会报错java.net.URISyntaxException: Illegal character in scheme name at index 0,删掉空格就好了