当前位置: 首页 > news >正文

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

(一)概述

前段时间公司规划了一个新的项目,我成了这个项目的负责人。在做技术选型时,有一个需求阻碍了前进的步伐。大概有十亿条数据,数据总量在六百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文件

编写测试代码:

object Test {
  def main(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,分别写上

Hello world
Hello scala

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

public class JavaWordCount {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf().setAppName("wordCount").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        //读取文件转成RDD
        JavaRDD<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 -> new Tuple2<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实现的版本如下:

object WordCount {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount");
    val sparkContext = new SparkContext(sparkConf);
    val lines: RDD[String] = sparkContext.textFile(path = "data/*");
    val words: RDD[String] = lines.flatMap(_.split(" "))
    val wordToOne: RDD[(String, Int)] = words.map(word => (word, 1))
    val wordToCount = wordToOne.reduceByKey((x, y) => x + y).foreach(println)
    sparkContext.stop();
  }
}

运行结果如下:

(五)总结

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

相关文章:

  • lvs持久性工作原理和配置
  • 学会RDD就学会了Spark,Spark数据结构RDD快速入门
  • 像写SQL一样去处理内存中的数据,SparkSQL入门教程
  • C#模板方法模式
  • 【设计模式】快速理解原型模式,及其在源码中的应用
  • 从零开始学React(3)——数组
  • 大数据场景下的消息队列:Kafka3.0快速入门
  • 4月4日作业
  • Kafka生产者是如何发送消息的?
  • 如何使用SpringBoot写一个属于自己的Starter
  • C# 常用正责表达式
  • 【设计模式】快速理解建造者模式,及其在JDK源码中的应用
  • RMQ
  • 简单聊聊MySQL中的六种日志
  • 网络 基于TCP协议socket编程
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • es6
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • go语言学习初探(一)
  • input的行数自动增减
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript异步流程控制的前世今生
  • js中forEach回调同异步问题
  • laravel 用artisan创建自己的模板
  • leetcode讲解--894. All Possible Full Binary Trees
  • maya建模与骨骼动画快速实现人工鱼
  • win10下安装mysql5.7
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 温故知新之javascript面向对象
  • Java总结 - String - 这篇请使劲喷我
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第27天)Oracle 数据泵转换分区表
  • (第二周)效能测试
  • (强烈推荐)移动端音视频从零到上手(下)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core引入性能分析引导优化
  • .NET 设计模式初探
  • .NET程序员迈向卓越的必由之路
  • .net打印*三角形
  • .net经典笔试题
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET项目中存在多个web.config文件时的加载顺序
  • @Autowired和@Resource的区别
  • @RestController注解的使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [2016.7 test.5] T1
  • [ACTF2020 新生赛]Include
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [ANT] 项目中应用ANT
  • [C# 网络编程系列]专题六:UDP编程