自学Spark,又是Hello World?

这篇具有很好参考价值的文章主要介绍了自学Spark,又是Hello World?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在18年初刚开始接触学习spark的时候,买了一本《Spark大数据处理技术》的书,虽然后来一些Spark开发的知识都是从官网和实践中得来的,但是这本书对我来说是启蒙和领路的作用。

还记得这本书编程的开篇就是Spark程序”Hello World“!果然,这辈子是摆脱不了”Hello World“了。

Hello World

在大数据里第一次遇到Hello World,还是在经典的MapReduce WordCount,以此讨论如何实现map和reduce的过程。

后来学习Spark,又遇到了Hello World,同样也是用WrodCount案例,来演示Spark对数据集的基本操作。那么就借Hello World来做一个Spark的入门教程。

认识Spark

Spark是一个大数据的分布式计算框架。既能和一个普通的程序一样,运行在本地(local)IDE中,也能运行在搭建的Spark集群(Cluster)上,不过现在已经很少见。最常见的就是运行在第三方的计算调度平台上,例如yarn和K8s。

我测试使用local模式,生产是yarn,所以Spark就围绕着这两个来写。先说说在IDE中如何开发local的Spark程序。

Spark开发语言一共有三种:Java、python、scala。我使用scala来完成Spark开发,原因:

  1. 定理变量无需指定类型,使用val或var
  2. lambada操作,更符合流式计算的感觉(我开发流式计算比较多)
  3. 调用无参方法可以不写括号
  4. 趁机多掌握一门语言,而且Spark源码大多为scala

程序开发

因为Spark源码是java和scala开发的,所以要配置java和scala环境,在选择spark版本的同时,一起选择对应的scala的版本。

为了和生产保持一致,Spark版本我用的是2.3.2,scala版本2.11.8。至于spark3的新特性什么的,用到的时候再讲也不迟。

先创建一个scala的maven程序。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

然后删除项目自带的scala,将自己需要的scala版本添加到项目中。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

这样项目就有了2.11.8的scala编译、运行环境了。

maven依赖

Spark作为计算框架,和其他Java框架一样,需要引入依赖的jar。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

定义了spark.versionscala.binary.version来统一控制spark的版本,这样在后面引用SparkStreaming、SparkSql、mlib等组件依赖的时候,就可以使用变量来指定。

对于最spark最基本的功能,我也称之为离线处理、批处理,只需要引入spark-core即可。

开发程序

新建一个scala object文件,而不是class,因为在scala中只有object才能定义main函数。然后就是模板化的程序开发。

1. 创建sparkContext

SparkContext是Spark程序的入口点,用于创建RDD、累加器和广播变量等。

val conf = new SparkConf().setAppName("test").setMaster("local[2]")
val sc = new SparkContext(conf)

setMaster() 用来指定程序运行在哪里。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

local[4]表示使用cpu的4个core来执行任务,local[*]表示使用cpu的所有核心。当然,这只是在IDE中的写法。生产环境通常是通过shell脚本,提交到Hadoop的yarn上运行,所以都是在启动脚本里指定master,就不用在程序中指定了。

spark-submit  --master yarn [...]

master指定为yarn。

2. 数据集

在大数据处理技术架构中,程序一般就分为三个模块:数据源、数据处理、数据输出。WorkCount的数据源可以定义为外部文件,也可以在程序内直接使用字符串变量表示,这里为了方便,就用字符串表示数据源。

Spark的计算数据是以RDD的形式存在的(这里RDD先可以理解成数据集合),Spark通过api接口从外部文件、数据源读取的数据,都会被抽象化成各种RDD,我们这里是在程序内指定的字符串,没有与数据源交互,所以需要我们调用makeRDD手动创建RDD。

val words = "Hello,World,Hello,World,Hello,Spark,Spark,Scala".split(",")
val wordKV = sc.makeRDD(words)
  .filter(x => x.equals("Hello") || x.equals("World"))
  .map(x => (x, 1))
  .reduceByKey((x, y) => y + y)

先将字符串分割之后创建RDD,然后通过filter来过滤”Hello World“字符串,通过map处理成(Hello, 1)的形式,最后通过reduceByKey对具有相同key的value进行累加,最后输出。

wordKV返回的同样是一个RDD,我们使用map或者foreach进行遍历输出。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

这样,关于Hello World的WordCount就完成,你可以看到这里我用的foreach进行遍历输出的,如果我用map呢。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

???我的输出去哪里了?哈哈,别着急,等我操作一下,加一个collect方法,然后启动程序。

自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据

你看,结果又能照常输出了。

至于原因,就留在Spark运行架构或RDD的时候一起写。

结语

本篇文章主要利用wordcount的小案例,带大家认识了一下Spark,内容比较浅显,后续会更加深入,期待与大家共同学习。
自学Spark,又是Hello World?,大数据,SparkStreaming,Spark,spark,大数据文章来源地址https://www.toymoban.com/news/detail-839365.html

到了这里,关于自学Spark,又是Hello World?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS Hello World

    ROS 系列学习教程(总目录) 万物始于Hello World,为了体验ROS,使用Hello World介绍ROS的简单使用。 首先需要创建工程,流程为: 创建工作空间目录(即工程根目录,注意此时还不是ROS工作空间,只是一个目录) 初始化工作空间(即把当前目录初始化为一个ROS工作空间) 创建功能

    2024年02月06日
    浏览(36)
  • RabbitMQ ---- Hello World

    本节使用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。 运行程序 查看管理页面

    2024年02月16日
    浏览(31)
  • 【C++】“Hello World!“

    🦄 个人主页 :修修修也 🎏 所属专栏 :C++ ⚙️ 操作环境 : Visual Studio 2022 ​ 纪念一下自己编写的 第一个C++程序 运行结果: ​ 1. include :包含。 #include 是一个预处理命令,用来引入头文件。 2. iostream :iostream是一个 标准库 ,它与C语言的stdio库不同,它从一开始就是 用多重继承与虚

    2024年01月19日
    浏览(33)
  • Qt: Hello world

    0. Qt 可以构建跨平台的ui项目. 走一波windows下Hello world 1.下载QT creator 当下版本是10了. 下载速度极慢. 需要30G的硬盘空间. 2.安装成功后,开始菜单会产生如下效果: 3. 运行QT creator10.0.1(community), 如下: 4. 点击:创建项目 4.1 无需,理解显示的内容,选第一个就行 4.2 注意路径也需要自己

    2024年02月11日
    浏览(38)
  • C++打印hello world

    首先我们要知道: C++中有一个很重要的东西,那就是面向对象,其中,C++中的打印和输入都是一个对象,而不是像C一样是一个函数,所以打印和输入都有一定的区别 打印是C++最基础的东西,下面我们先放代码,再逐条分析 首先是程序的入口:主函数。他先对于C有一定的区别

    2024年02月02日
    浏览(54)
  • Dart 入门Hello world

    1、下载Dart sdk IntelliJ Android Studio | Dart 2、安装Dart 插件 3、安装后重启IDEA,创建Dart项目   4、创建dart文件 5、编写函数:    6、运行:   官网学习:Dart 语言开发文档 | Dart

    2024年02月12日
    浏览(47)
  • C++输出Hello,World

    在 C 语言中输出 \\\"Hello, World\\\" 可以使用下面的代码: #include stdio.h int main() { printf(\\\"Hello, Worldn\\\"); return 0; } 代码的意思是:首先使用 #include stdio.h 告诉编译器我们要使用输入/输出函数,然后定义一个名为 main 的函数,在函数中使用 printf 函数来输出字符串 \\\"Hello, World\\\",最后使用

    2024年02月07日
    浏览(38)
  • java 输出hello world

    在 Java 中,可以使用 System.out.println 来输出 \\\"hello world\\\"。 例如: 在这段代码中, System.out.println 会将字符串 \\\"hello world\\\" 输出到控制台。 注意: 在 Java 中,类名的首字母必须大写。 main 方法是程序的入口点,必须要有这个方法才能运行程序。 `

    2024年02月10日
    浏览(32)
  • 用Rust打印hello world!

    桌面新建1个名为 rustDemo 的文件夹(文件夹名字随便取) 打开新建的文件夹,在地址输入栏输入 cmd  按回车键进入命令行窗口 打开编译器,按 Ctrl + S ,保存文件到 rustDemo 文件夹中,保存的文件我取名为 hello_world.rs 。文件名是随便取的,但是后缀一定要是 .rs 回到编译器中,

    2024年02月10日
    浏览(40)
  • vue学习之hello world

    给节点定义id,这样组件可以和指定节点进行绑定 Vue对象中的data节点,是对此实例数据的说明 其中div中获取对象实例中定义的msg的值通过 {{}} 来获取,这个叫做插值表达式 效果展示 通过点击按钮获取输入框中的值,添加到todo列表中 定义按钮、绑定方法 input 为输入框,需要

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包