十亿条数据需要每天计算怎么办?Spark快速入门

简介: 前段时间公司规划了一个新的项目,我成了这个项目的负责人。在做技术选型时,有一个需求阻碍了前进的步伐。大概有十亿条数据,数据总量在六百G左右,这些海量的数据需要每天根据一定的逻辑计算得到几千万的值。当数据量达到这种程度时,Java应用已经无法支撑了,于是在技术选型时选中了大数据计算框架--Spark。

听说微信搜索《Java鱼仔》会变更强哦!


本文收录于githubgitee ,里面有我完整的Java系列文章,学习或面试都可以看看哦


(一)概述


前段时间公司规划了一个新的项目,我成了这个项目的负责人。在做技术选型时,有一个需求阻碍了前进的步伐。大概有十亿条数据,数据总量在六百G左右,这些海量的数据需要每天根据一定的逻辑计算得到几千万的值。当数据量达到这种程度时,Java应用已经无法支撑了,于是在技术选型时选中了大数据计算框架--Spark。


(二)什么是Spark


Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。主要用来做大数据的分析计算。Spark是一个分布式数据快速分析框架,提供了比MapReduce更丰富的模型,可以在内存中对数据集进行多次迭代,以支持复杂的数据挖掘算法和图形计算算法。针对数亿级别的计算需求,Spark可以将所有数据读入到内存中,按配置的不同在内部生成几十或者几百个算子同时计算,速度十分快。


Spark的主要模块分为以下几个:


网络异常,图片无法展示
|


Spark Core: 提供了Spark最基础与最核心的功能,Spark的其他模块都是在Spark Core上进行扩展。


Spark SQL:用来操作结构化数据的组件,通过SparkCore,用户可以使用SQL来查询数据。


Spark Streaming:Spark平台上针对实时数据进行流式计算的组件,提供了丰富的处理数据流API。


Spark MLlib:一个机器学习算法库。


Spark GraphX:Spark面向图计算提供的框架和算法库。


(三)Spark 应用构建


Spark的源码是用scala语言写的,同时也支持Java版本。更推荐使用scala语言去写spark代码,但是对程序员而言有一定的成本,因此在项目比较急的情况下使用Java写也是没问题的。


Spark的生产环境中使用需要搭建一套Spark运行环境,目前我所在公司搭建的Spark集群内存达到了1T,完全可以把所有的数据放进内存中计算。同时Spark也支持本地直接调用,通过引入maven依赖即可。


首先介绍在Idea中如何搭建Spark环境,本文所使用的scala版本是2.12,运行项目前首先确保安装了scala环境。


首先创建一个Maven项目,项目结构如下:


网络异常,图片无法展示
|


安装Idea中的scala插件:


网络异常,图片无法展示
|


在Project Structure中将scala引入


网络异常,图片无法展示
|


选择Add Framework Suppor,将里面的scala勾选


网络异常,图片无法展示
|

网络异常,图片无法展示
|


创建一个Object类型的Scala文件


网络异常,图片无法展示
|


编写测试代码:


objectTest {
defmain(args: Array[String]): Unit= {
println("hello world")
  }
}

如果成功输出,说明环境一切正常。


(四) wordCount案例


WordCount是大数据界的HelloWorld,一个最经典的MapReduce案例,这个案例是用来统计每个单词出现的次数,下面进入正题。


首先在Idea中引入Spark相关的依赖,我用的Scala是2.12版本,需要和依赖对齐:


<dependencies><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.0.0</version></dependency></dependencies>

在sparkdemo根目录下创建一个文件夹data,在里面放两个文件分别是1.txt和2.txt,分别写上

HelloworldHelloscala

编写WordCount程序,先介绍Java的使用,Spark中具体的代码含义会在后续博客中更新,整个程序做的事情就是统计两个文件中每个单词出现的次数,是最经典的MapReduce案例:

publicclassJavaWordCount {
publicstaticvoidmain(String[] args) {
SparkConfconf=newSparkConf().setAppName("wordCount").setMaster("local");
JavaSparkContextsc=newJavaSparkContext(conf);
//读取文件转成RDDJavaRDD<String>lines=sc.textFile("data/*");
//将每一行的单词根据空格拆分JavaRDD<String>words=lines.flatMap((FlatMapFunction<String, String>) s->Arrays.asList(s.split(" ")).iterator());
//将Hello转化为(Hello,1)这种格式JavaPairRDD<String, Integer>wordToOne=words.mapToPair((PairFunction<String, String, Integer>) s->newTuple2<String,Integer>(s,1));
//根据key进行统计JavaPairRDD<String, Integer>wordToCount=wordToOne.reduceByKey((x, y) ->x+y);
//输出结果wordToCount.foreach((VoidFunction<Tuple2<String, Integer>>) stringIntegerTuple2->System.out.println(stringIntegerTuple2._1+stringIntegerTuple2._2));
sc.close();
    }
}

使用scala实现的版本如下:

objectWordCount {
defmain(args: Array[String]): Unit= {
valsparkConf=newSparkConf().setMaster("local").setAppName("WordCount");
valsparkContext=newSparkContext(sparkConf);
vallines: RDD[String] =sparkContext.textFile(path="data/*");
valwords: RDD[String] =lines.flatMap(_.split(" "))
valwordToOne: RDD[(String, Int)] =words.map(word=> (word, 1))
valwordToCount=wordToOne.reduceByKey((x, y) =>x+y).foreach(println)
sparkContext.stop();
  }
}

运行结果如下:


网络异常,图片无法展示
|

(五)总结


本文只要结合具体的需求引出Spark,并快速介绍了Spark能做的一些事情,希望对你有所启发。我是鱼仔,我们下期再见。

相关文章
|
2月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
66 5
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
54 3
|
2月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
72 0
|
4月前
|
存储 分布式计算 Java
|
4月前
|
分布式计算 监控 大数据
如何处理 Spark 中的倾斜数据?
【8月更文挑战第13天】
260 4
|
4月前
|
分布式计算 Apache 数据安全/隐私保护
流计算引擎数据问题之在 Spark Structured Streaming 中水印计算和使用如何解决
流计算引擎数据问题之在 Spark Structured Streaming 中水印计算和使用如何解决
58 1
|
存储 分布式计算 Spark
Spark会把数据都载入到内存么?
这篇文章算是个科普贴。如果已经熟悉Spark的就略过吧。
1894 0
|
存储 分布式计算 Spark
Spark会把数据都载入到内存么?
前言         很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。   比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导:   RDD的定义,RDD是一个分布式的不可变数据集合   Spark 是一个内
2452 0
|
1月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
130 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
2月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
45 0
下一篇
DataWorks