本教程快速介绍了Spark的使用。 首先我们介绍了通过Spark 交互式shell调用API( Python或者scala代码),然后演示如何使用Java, Scala或者Python编写独立程序。 你可以查看Spark编程指南了解完整的参考。

开始下面的快速入门之前,首先需要到 Spark网站 下载一份打包好的spark。 既然本教程中我们不使用HDFS,你可以随便下载一个适配任何Hadoop的版本的Spark。

本教程翻译时的Spark版本为1.1.1

使用Spark进行交互式分析

基本操作

Spark shell提供了一个简单方式去学习API,它也是一个交互式分析数据的强大工具。 你既可以使用Scala(运行在JVM之上,所以可以使用众多的Java库),也可以使用Python。运行Spark文件夹下的的命令:

1

. /bin/ spark-shell

Spark最主要的一个抽象出来的概念就是分布式的数据集合, 也就是弹性分布式数据集Resilient Distributed Dataset (RDD). RDD可以从Hadoop InputFormats (比如HDFS文件)创建, 也可以通过其它RDD转换(transforming)得到。 让我们从Spark源代码文件夹下的README文件创建一个RDD:

1

2

scala> val textFile = sc.textFile( "README.md" )

textFile: spark. RDD [ String ] = spark. MappedRDD @ 2 ee9b6e3

RDD包含 action ,可以返回数据, 也包含 transformation ,返回新的RDD的指针。 先看一些action的例子:

1

2

3

4

5

scala> textFile.count() // 此RDD中的item的数量

res0: Long = 126

scala> textFile.first() // 此RDD第一个item

res1: String = # Apache Spark

现在再看一个转换的例子。我们使用 filter 返回一个新的RDD, 新的RDD是文件中item的一个子集。

1

2

scala> val linesWithSpark = textFile.filter(line => line.contains( "Spark" ))

linesWithSpark: spark. RDD [ String ] = spark. FilteredRDD @ 7 dd4af09

将transformation和action串起来:

1

2

scala> textFile.filter(line => line.contains( "Spark" )).count() // How many lines contain "Spark"?

res3: Long = 15

更多的RDD操作

RDD的transformation和action可以组成起来完成复杂的计算。 比如查找包含最多单词的一行:

1

2

scala> textFile.map(line => line.split( " " ).size).reduce((a, b) => if (a > b) a else b)

res4: Long = 15

第一步map一行包含的单词数到一个整数, 第二步调用reduce得到最大的单词数。map和reduce的参数都是lambda表达式(closures), 可以调用 Scala/Java库. 例如我们很容易的调用在其它地方声明的方法。 这里我们使用 Math.max() 函数简化代码:

1

2

3

4

5

scala> import java.lang. Math

import java.lang. Math

scala> textFile.map(line => line.split( " " ).size).reduce((a, b) => Math .max(a, b))

res5: Int = 15

一个通用的数据流模式就是MapReduce,在Hadoop中相当流行. Spark实现MapReduce流很容易:

1

2

scala> val wordCounts = textFile.flatMap(line => line.split( " " )).map(word => (word, 1 )).reduceByKey((a, b) => a + b)

wordCounts: spark. RDD [( String , Int )] = spark. ShuffledAggregatedRDD @ 71 f027b8

此处我们使用flatMap, map 和 reduceByKey转换来计算文件中每个单词的频度。 为了收集单词频度结果,我们可以调用collect action:

1

2

scala> wordCounts.collect()

res6: Array [( String , Int )] = Array ((means, 1 ), (under, 2 ), ( this , 3 ), ( Because , 1 ), ( Python , 2 ), (agree, 1 ), (cluster., 1 ), ...)

缓存

Spark也支持将数据集放入集群的内存中缓存起来. 当数据重复访问时特别有用, 比如查询一个小的 “hot”数据集或者运行一个交互式算法PageRank. 看一个简单的例子, 我们把上面的linesWithSpark数据集缓存起来:

1

2

3

4

5

6

7

8

scala> linesWithSpark.cache()

res7: spark. RDD [ String ] = spark. FilteredRDD @ 17e51082

scala> linesWithSpark.count()

res8: Long = 15

scala> linesWithSpark.count()

res9: Long = 15

当然使用Spark缓存一个100行的文本文件看起来有些傻,我们只是做个示范。 你可以将它用在非常大的数据集上,即使它们可能横跨几十甚至上百个节点。你也可以使用bin/spark-shell交互式实现此功能, 就像开发指南中描述的那样。

独立应用

下面我们想说一下怎样使用Spark API编写一个独立的应用程序。 这里使用Scala (SBT构建工具)和Java举例。 (Python官方文档中有,译者未翻译)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/* SimpleApp.scala */

import org.apache.spark. SparkContext

import org.apache.spark. SparkContext ._

import org.apache.spark. SparkConf

object SimpleApp {

def main ( args: Array [ String ]) {

val logFile = "YOUR_SPARK_HOME/README.md" // Should be some file on your system

val conf = new SparkConf ().setAppName( "Simple Application" )

val sc = new SparkContext (conf)

val logData = sc.textFile(logFile, 2 ).cache()

val numAs = logData.filter(line => line.contains( "a" )).count()

val numBs = logData.filter(line => line.contains( "b" )).count()

println( "Lines with a: %s, Lines with b: %s" .format(numAs, numBs))

}

}

这个程序统计Spark README文件中包含字符 a 和 b 的行数。 注意你需要用你实际的Spark路径替换 YOUR_SPARK_HOME。 不像上面的Spark shell的例子, 我们初始化一个SparkContext 作为程序的一部分.

我们将一个SparkConf对象传给SparkContext的构造函数, 它包含了我们程序的信息。

我们的程序依赖Spark API,所以我们包含一个sbt配置文件:simple.sbt 指明Spark是一个依赖, 这个文件也增加了Spark依赖的仓库(repository):

1

2

3

4

name := "Simple Project"

version := "1.0"

scalaVersion := "2.10.4"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.1.1"

为了保证sbt工作正常,我们需要将SimpleApp.scala和simple.sbt放入典型的sbt项目布局的文件夹中。 如此一来我们将应用代码可以打包成一个jar文件, 然后使用spark-submit脚本来运行此程序。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# Your directory layout should look like this

$ find .

.

./simple.sbt

./src

./src/main

./src/main/scala

./src/main/scala/SimpleApp.scala

# Package a jar containing your application

$ sbt package

...

[info] Packaging {..}/{..}/target/scala- 2.10 /simple-project_2. 10 - 1.0 .jar

# Use spark-submit to run your application

$ YOUR_SPARK_HOME/bin/spark-submit \

--class "SimpleApp" \

--master local [ 4 ] \

target/scala- 2.10 /simple-project_2. 10 - 1.0 .jar

...

Lines with a: 46 , Lines with b: 23

或者使用Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/* SimpleApp.java */

import org.apache.spark.api.java.*;

import org.apache.spark.SparkConf;

import org.apache.spark.api.java.function.Function;

public class SimpleApp {

public static void main (String[] args) {

String logFile = "YOUR_SPARK_HOME/README.md" ; // Should be some file on your system

SparkConf conf = new SparkConf().setAppName( "Simple Application" );

JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD logData = sc.textFile(logFile).cache();

long numAs = logData.filter( new Function() {

public Boolean call (String s) { return s.contains( "a" ); }

}).count();

long numBs = logData.filter( new Function() {

public Boolean call (String s) { return s.contains( "b" ); }

}).count();

System.out.println( "Lines with a: " + numAs + ", lines with b: " + numBs);

}

}

这个程序统计Spark README文件中包含字符 a 和 b 的行数。. 注意你需要用你实际的Spark路径替换 YOUR_SPARK_HOME。 不像上面的Spark shell的例子, 我们需要一个JavaSparkContext对象. 我们也创建了RDD (JavaRDD)然后运行transformations. 最后我们传递给Spark一个function对象, 这个function对象是一个匿名类,继承于 spark.api.java.function.Function. Spark开发指南描述了细节. (译者注: 这是Java 7的语法, 通过Java 8 Lambda表达式,上面的代码和scala一样的简化)

为了编译此程序,我们需要写一个Maven pom.xml文件, 增加Spark作为依赖. 注意Spark artifact带有Scala的版本.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

< project >

< groupId > edu.berkeley groupId >

< artifactId > simple-project artifactId >

< modelVersion > 4.0.0 modelVersion >

< name > Simple Project name >

< packaging > jar packaging >

< version > 1.0 version >

< dependencies >

< dependency >

< groupId > org.apache.spark groupId >

< artifactId > spark-core_2.10 artifactId >

< version > 1.1.1 version >

dependency >

dependencies >

project >

使用Maven项目的布局:

1

2

3

4

5

6

$ find .

./pom.xml

./src

./src/main

./src/main/java

./src/main/java/SimpleApp.java

现在,我们使用Maven打包并使用./bin/spark-submit执行此程序.

1

2

3

4

5

6

7

8

9

10

11

12

# Package a jar containing your application

$ mvn package

...

[INFO] Building jar: {..}/{..}/target/simple-project- 1.0 .jar

# Use spark-submit to run your application

$ YOUR_SPARK_HOME/bin/spark-submit \

--class "SimpleApp" \

--master local [ 4 ] \

target/simple-project- 1.0 .jar

...

Lines with a: 46 , Lines with b: 23

深入了解

亲爱的读者,恭喜你运行了你的第一个Spark应用程序!你肯定不仅仅满足于此,以下是更多的深入学习的资料:

深度学习API和其它组件, 请参照 Spark开发指南

学习在集群中运行程序,访问 发布概览 .

最后, Spark发布包中的examples文件夹下包含几个例子 ( Scala , Java , Python ). 你可以运行它们:

1

2

3

4

5

# For Scala and Java, use run-example:

./bin/run-example SparkPi

# For Python examples, use spark-submit directly:

./bin/spark-submit examples/src/main/python/pi.py

spark快速入门java_Spark 快速入门相关推荐

  1. spark之1:快速入门

    spark之1:快速入门 @(SPARK)[spark, 大数据] spark可以通过交互式命令行及编程两种方式来进行调用: 前者支持scala与python 后者支持scala.python与jav ...

  2. python爬虫入门教程--快速理解HTTP协议(一)

    http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道.下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解HTTP协议的相关资料,文中介绍的非常详细,需要 ...

  3. 新手入门 如何快速找到Python进阶路线?

    新手入门 如何快速找到Python进阶路线?Python作为一种开放源代码的脚本编程语言,常用于开发各种程序.随着近几年人工智能的火爆,Python一度受到众多程序员的追捧,成为首选的入门编程语言.很 ...

  4. AFNnetworking快速教程,官方入门教程译

    AFNnetworking快速教程,官方入门教程译 分类: IOS2013-12-15 20:29 12489人阅读 评论(5) 收藏 举报 afnetworkingjsonios入门教程快速教程 A ...

  5. HSQLDB数据库使用详解(入门)及快速使用

    hsql数据库使用详解(入门)及快速使用 一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库 ...

  6. 基金投资入门教程-----快速读懂基金招募书

    基金投资入门教程-----快速读懂基金招募书 基金投资入门教程-----快速读懂基金招募书 3.快速读懂基金招募书 下载基金招募书 开始读 基金投资入门教程-----快速读懂基金招募书 3.快速读懂基 ...

  7. Turtlebot4入门教程-快速开始

    来源:Turtlebot4入门教程-快速开始 - 创客智造 说明: 介绍Turtlebot4开始使用流程 相关设备: Turtlebot4机器人套件:采购地址 开启机器人电源 要为机器人供电,请将其放 ...

  8. python快速编程入门课后简答题答案-编程python入门 编程python入门课后习题

    编程python入门 编程python入门课后习题 米粒妈咪课堂小编整理了填空.选择.判断等一些课后习题答案,供大家参考学习. 第一章 一.填空题 Python是一种面向对象的高级语言. Python ...

  9. 尚硅谷大数据技术Spark教程-笔记09【SparkStreaming(概念、入门、DStream入门、案例实操、总结)】

    尚硅谷大数据技术-教程-学习路线-笔记汇总表[课程资料下载] 视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[SparkCore ...

  10. 半小时入门MATLAB编程入门基础知识:

    https://learnxinyminutes.com/docs/zh-cn/matlab-cn/ 半小时入门MATLAB编程入门基础知识: % 以百分号作为注释符 %{ 多行注释 可以 这样 表示 ...

最新文章

  1. 卷积神经网络(CNN)的原理
  2. 2021重庆黔江中学高考成绩查询,2020年重庆黔江三所高中排名公告
  3. 因为没钱买衣服,我女朋友不要我了......
  4. 程序员!别逼自己买课了,每天花10分钟做这件事,写代码能力暴增......
  5. OpenShift 4 之 GitOps(3)用Helm+ArgoCD部署应用,并保持配置同步
  6. 使用睡袋_宝宝睡袋使用心得
  7. 树莓派3代B版板载WIFI配置
  8. RHCE 学习笔记(4)- 重定向,管道和VIM编辑器
  9. JavaScript 高级教程
  10. 乱舞三国java_乱舞三国OL-龙腾四海
  11. Hexo博客NexT主题开启文章目录和调整样式
  12. linux服务器硬件配置,linux服务器硬件配置要求是多少
  13. Re:从0开始的微服务架构:(一)重识微服务架构
  14. unixprocess+java+186_interproscan 的使用和遇到的问题
  15. 2017年最新基于hexo搭建个人免费博客——从零开始
  16. 华中科技大学计算机徐永兵,华中科技大学计算机学院导师及科研方向.doc
  17. 艺赛旗联合创始人胡立军:咨询机构、CIO和用户眼中的RPA「理想型」
  18. (C语言)啥?4除以2等于0?
  19. 大道至简:软件工程实践者的思想读后感
  20. 华为电脑管家装到D盘_管家婆提示本单据的日期太大,请确认后重新输入

热门文章

  1. matlab 平滑曲线连接_【小微技能】:数学建模比赛中MATLAB的实用技巧
  2. 毕啸南专栏 | 对话阿里王坚:数据价值是新大陆,新技术将重构互联网
  3. Matlab的卷积编码实现
  4. 实现网站的国际化语言切换
  5. matlab实现神经网络算法,matlab神经网络训练函数
  6. 【STM32F429的DSP教程】第1章 初学数字信号处理准备工作
  7. android 控制手机音量大小,android 控制手机音量的大小 切换声音的模式
  8. 网易新闻 鸿蒙,网易新闻鸿蒙版下载-网易新闻 鸿蒙版v78.5-PC6鸿蒙网
  9. 通过微软私有云MCSE认证
  10. java审批流_activiti实现工作流审批