基于Hadoop的云计算与大数据处理技能

种地  金牌会员 | 2024-9-23 06:35:49 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 922|帖子 922|积分 2766



一、实验目标

1.相识Scala语言的根本语法
2.相识Spark Scala开发的原理
3.相识Spark Java API的利用
4.相识Spark的Scala API及Java API对数据处理的不同点
二、实验内容 

某电商网站记载了大量用户对商品的收藏数据,并将数据存储在名为buyer_favorite1的文件中,数据格式以及数据内容如下:
用户ID(buyer_id),商品ID(goods_id),收藏日期(dt)

view plain copy


  • 用户id   商品id    收藏日期  
  • 10181   1000481   2010-04-04 16:54:31  
  • 20001   1001597   2010-04-07 15:07:52  
  • 20001   1001560   2010-04-07 15:08:27  
  • 20042   1001368   2010-04-08 08:20:30  
  • 20067   1002061   2010-04-08 16:45:33  
  • 20056   1003289   2010-04-12 10:50:55  
  • 20056   1003290   2010-04-12 11:57:35  
  • 20056   1003292   2010-04-12 12:05:29  
  • 20054   1002420   2010-04-14 15:24:12  
  • 20055   1001679   2010-04-14 19:46:04  
  • 20054   1010675   2010-04-14 15:23:53  
  • 20054   1002429   2010-04-14 17:52:45  
  • 20076   1002427   2010-04-14 19:35:39  
  • 20054   1003326   2010-04-20 12:54:44  
  • 20056   1002420   2010-04-15 11:24:49  
  • 20064   1002422   2010-04-15 11:35:54  
  • 20056   1003066   2010-04-15 11:43:01  
  • 20056   1003055   2010-04-15 11:43:06  
  • 20056   1010183   2010-04-15 11:45:24  
  • 20056   1002422   2010-04-15 11:45:49  
  • 20056   1003100   2010-04-15 11:45:54  
  • 20056   1003094   2010-04-15 11:45:57  
  • 20056   1003064   2010-04-15 11:46:04  
  • 20056   1010178   2010-04-15 16:15:20  
  • 20076   1003101   2010-04-15 16:37:27  
  • 20076   1003103   2010-04-15 16:37:05  
  • 20076   1003100   2010-04-15 16:37:18  
  • 20076   1003066   2010-04-15 16:37:31  
  • 20054   1003103   2010-04-15 16:40:14  
  • 20054   1003100   2010-04-15 16:40:16  
现分别利用Spark Scala API及Spark Java API对用户收藏数据,举行wordcount利用,统计每个用户收藏商品数目。



三、实验原理或流程

Spark的核心就是RDD,全部在RDD上的利用会被运行在Cluster上,Driver步调启动很多Workers,Workers在(分布式)文件体系中读取数据后转化为RDD(弹性分布式数据集),然后对RDD在内存中举行缓存和计算。
对于Spark中的API来说,它支持的语言有Scala、Java和Python,由于Scala是Spark的原生语言,各种新特性肯定是Scala最先支持的,Scala语言的优势在于语法丰富且代码简便,开发效率高。缺点在于Scala的API符号标记复杂,某些语法太过复杂,不易上手。对Java开发者而言,也可以利用Spark Java API。

RDD有两种类型的利用 ,分别是Action(返回values)和Transformations(返回一个新的RDD)。



四、实验过程及源代码

1.在Linux上创建/data/spark4目录,用于存储实验所需的数据。

view plain copy


  • mkdir -p /data/spark4  
切换到/data/spark4目录下,并从http://172.16.103.12:60000/allfiles/spark4/下载实验数据buyer_favorite1及spark-assembly-1.6.0-hadoop2.6.0.jar。

view plain copy


  • cd /data/spark4  
  • wget http://172.16.103.12:60000/allfiles/spark4/buyer_favorite1  
  • wget http://172.16.103.12:60000/allfiles/spark4/spark-assembly-1.6.0-hadoop2.6.0.jar  
2.利用jps查看Hadoop以及Spark的相关进程是否已经启动,若未启动则实验启动命令。

view plain copy


  • jps  
  • /apps/hadoop/sbin/start-all.sh  
view plain copy


  • /apps/spark/sbin/start-all.sh  
将Linux本地/data/spark4/buyer_favorite文件,上传到HDFS上的/myspark4目录下。若HDFS上/myspark4目录不存在则创建。

view plain copy


  • hadoop fs -mkdir -p /myspark4  
  • hadoop fs -put /data/spark4/buyer_favorite1 /myspark4  
3.打开已安装完Scala插件的Eclipse,新建一个Scala项目。

将项目命名为spark4。

在spark4项目下新建包名,命名为my.scala。

右键点击包名, 新建scala Object。

将scala object命名为ScalaWordCount。

4.右键项目,创建一个文件夹,名为lib。

将Linux上的/data/spark4/spark-assembly-1.6.0-hadoop2.6.0.jar文件,拷贝到lib目录下。右键jar包,点击Build Path=>Add to Build Path。

5.在Eclipse中,打开ScalaWordCount.scala文件。编写Scala语句,并统计用户收藏数据中,每个用户收藏商品数目。

view plain copy


  • package my.scala  
  • import org.apache.spark.SparkConf  
  • import org.apache.spark.SparkContext  
  • object ScalaWordCount {  
  •     def main(args: Array[String]) {  
  •         val conf = new SparkConf()  
  •         conf.setMaster("local")  
  •             .setAppName("scalawordcount")  
  •         val sc = new SparkContext(conf)  
  •         val rdd = sc.textFile("hdfs://localhost:9000/myspark4/buyer_favorite1")  
  •         rdd.map(line => (line.split("\t")(0), 1))  
  •            .reduceByKey(_ + _)  
  •            .collect()  
  •            .foreach(println)  
  •         sc.stop()  
  •     }  
  • }  
第一步:创建Spark的配置对象sparkConf,设置Spark步调运行时的配置信息;

第二步:创建SparkContext对象,SparkContext是Spark步调全部功能的唯一入口,无论接纳Scala、Java还是Python都必须有一个SparkContext;

第三步:根据具体的数据泉源,通过SparkContext来创建RDD;

第四步:对初始的RDD举行Transformation级别的处理。(首先将每一行的字符串拆分成单个的单词,然后在单词拆分的底子上对每个单词实例计数为1;最后,在每个单词实例计数为1的底子上统计每个单词在文件出现的总次数)。

6.在Eclipse中实验代码

在控制界面console中查看的输出结果。

view plain copy


  • (用户id 收藏商品数目)  
  • (20042,1)  
  • (20054,6)  
  • (20055,1)  
  • (20064,1)  
  • (20001,2)  
  • (10181,1)  
  • (20067,1)  
  • (20056,12)  
  • (20076,5)  
7.再次右键点击项目名,新建package,将包命名为my.java 。

右键点击包my.java,新建Class,命名为JavaWordCount。

8.打开JavaWordCount.java文件,编写Java代码,统计用户收藏数据中,每个用户收藏商品数目。

view plain copy


  • package my.java;  
  • import org.apache.spark.SparkConf;  
  • import org.apache.spark.api.java.JavaPairRDD;  
  • import org.apache.spark.api.java.JavaRDD;  
  • import org.apache.spark.api.java.JavaSparkContext;  
  • import org.apache.spark.api.java.function.FlatMapFunction;  
  • import org.apache.spark.api.java.function.Function2;  
  • import org.apache.spark.api.java.function.PairFunction;  
  • import scala.Tuple2;  
  • import java.util.Arrays;  
  • import java.util.List;  
  • import java.util.regex.Pattern;  
  • public final class JavaWordCount {  
  •  private static final Pattern SPACE = Pattern.compile("\t");  
  •  public static void main(String[] args) throws Exception {  
  •    SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("JavaWordCount");  
  •    JavaSparkContext ctx = new JavaSparkContext(sparkConf);  
  •    JavaRDD<String> lines = ctx.textFile("hdfs://localhost:9000/myspark4/buyer_favorite1");  
  •     JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {  
  •         @Override  
  •         public Iterable<String> call(String s) {  
  •             String word[]=s.split("\t",2);  
  •             return Arrays.asList(word[0]);  
  •             }  
  •             });  
  •             JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {  
  •             @Override  
  •             public Tuple2<String, Integer> call(String s) {  
  •             return new Tuple2<String, Integer>(s, 1);  
  •             }  
  •             });  
  •             JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {  
  •             @Override  
  •             public Integer call(Integer i1, Integer i2) {  
  •             return i1 + i2;  
  •             }  
  •             });  
  •             List<Tuple2<String, Integer>> output = counts.collect();  
  •             System.out.println(counts.collect());  
  •             counts.saveAsTextFile("hdfs://localhost:9000/myspark4/out");  
  •             ctx.stop();  
  •             }  
  •             }  
9.在Eclipse上实验Java代码,并在Java代码指定输出目录下查看实验结果。

view plain copy


  • hadoop fs -ls /myspark4/out  
  • hadoop fs -cat /myspark4/out/part-00000  


五、实验结论及心得

通过这个实验,我们可以得出以下结论和心得:
Scala语言具有丰富的语法和简便的代码,可以进步开发效率。但对于初学者来说,Scala的符号标记可能比较复杂,须要一定的学习本钱。
Spark的工作原理是基于RDD的分布式计算,它充实利用了内存举行缓存和计算,进步了效率。相识这个原理有助于我们更好地利用Spark举行开发。
对于熟悉Java的开发者来说,Spark的Java API是一个很好的选择。它提供了与Scala相似的功能,但是更接近Java的语法和习惯。
在选择利用Spark的Scala API还是Java API时,须要根据项目需求和开发者的熟悉程度举行权衡。两者都有各自的优势和实用场景。
总的来说,掌握Scala语言和Spark的开发原理对于举行大数据处理和分析是非常重要的。通过实验我们对这些内容有了更深入的相识,为以后的开发工作打下了底子。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表