为了良好的阅读下面的文档,最好是结合实际的练习。首先需要下载spark,然后安装hdfs,可以下载任意版本的hdfs。

Spark Shell 交互

基本操作

Spark Shell提供给用户一个简单的学习API的方式 以及 快速分析数据的工具。在shell中,既可以使用scala(运行在java虚拟机,因此可以使用java库)也可以使用python。可以在spark的bin目录下启动spark shell:

./bin/spark-shell.sh

spark操作对象是一种分布式的数据集合,叫做Resilient Distributed Dataset(RDD)。RDD可以通过hdfs文件创建,也可以通过RDD转换得来。

下面就实际操作下,看看效果。我的本地有个文件——test.txt,内容为:

hello world

haha nihao

可以通过这个文件创建一个新的RDD

val textFile = sc.textFile("test.txt")

textFile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at :21

在Spark中,基于RDD可以作两种操作——Actions算子操作以及Transformations转换操作。

我们可以使用一些算子操作体验下:

scala> textFile.count() //RDD有用的数量

res1: Long = 2

scala> textFile.first() //RDD第一行

res3: String = hello world

再执行一些转换操作,比如使用filter转换,返回一个新的RDD集合:

scala> val lines = textFile.filter(line=>line.contains("hello"))

lines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at :23

scala> lines.count()

res4: Long = 1

scala> val lines = textFile.filter(line=>line.contains("haha"))

lines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at filter at :23

scala> lines.count()

res5: Long = 1

scala> lines.first()

res6: String = haha nihao

更多RDD操作

RDD算子和转换可以组成很多复杂的计算,比如我们想找出最多一行中单词最多的单词数量:

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

res4: Long = 15

这个操作会把一行通过split切分计数,转变为一个整型的值,然后创建成新的RDD。reduce操作用来寻找单词最多的那一行。

用户可以在任何时候调用方法和库,可以使用Math.max()函数:

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

一个很常见的数据操作就是map reduce,这个操作在hadoop中很常见。Spark可以轻松的实现Mapreduce任务:

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

wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[8] at reduceByKey at :28

这里使用了flatMap,map以及reduceByKey等转换操作来计算每个单词在文件中的数量。为了在shell中显示,可以使用collect()触发计算:

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 RDD数据集进行缓存,然后再调用count()会触发算子操作进行真正的计算,之后再次调用count()就不会再重复的计算,直接使用上一次计算的结果的RDD了:

scala> linesWithSpark.cache()

res7: linesWithSpark.type = MapPartitionsRDD[2] at filter at :27

scala> linesWithSpark.count()

res8: Long = 19

scala> linesWithSpark.count()

res9: Long = 19

看起来缓存一个100行左右的文件很愚蠢,但是如果再非常大的数据集下就非常有用了,尤其是在成百上千的节点中传输RDD计算的结果。你也可以通过bin/spark-shell向集群提交任务,可以参考编程指南

独立应用

要使用spark api写一个自己的应用也很简单,可以基于scala、java、python去写一些简单的应用。

/* 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))

}

}

注意应用需要定义main()方法。这个程序仅仅是统计文件中包含字符a和b的分别都有多少行。你可以设置YOUR_SPARK_HOME替换自己的文件目录。不像之前在shell中的例子那样,我们需要自己初始化sparkContext。

通过SparkConf构造方法创建SparkContext。

应用依赖于spark api,因此需要在程序中配置sbt的配置文件——simple.sbt,它声明了spark的依赖关系。

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.7"

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

为了让sbt正确的工作,还需要创建SimpleApp.scala以及simple.sbt。然后就可以执行打包命令,通过spark-submit运行了:

# 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命令进行打包

$ sbt package

...

[info] Packaging {..}/{..}/target/scala-2.11/simple-project_2.11-1.0.jar

# Use spark-submit to run your application 通过spark-submit提交任务jar包

$ YOUR_SPARK_HOME/bin/spark-submit

--class "SimpleApp"

--master local[4]

target/scala-2.11/simple-project_2.11-1.0.jar

...

Lines with a: 46, Lines with b: 23

其他地址

通过上面的例子,就可以运行起来自己的Spark应用了。

那么可以参考下面的链接获得更多的内容:

为了更深入的学习,可以阅读Spark编程指南

如果想要运行Spark集群,可以参考部署指南

最后,Spark在examples目录中内置了多种语言版本的例子,如scala,java,python,r等等。你可以通过下面的命令运行:

# 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

# For R examples, use spark-submit directly:

./bin/spark-submit examples/src/main/r/dataframe.R

spark入门_[大数据之Spark]——快速入门相关推荐

  1. rdd数据存内存 数据量_大数据开发-Spark调优常用手段

    Spark调优 spark调优常见手段,在生产中常常会遇到各种各样的问题,有事前原因,有事中原因,也有不规范原因,spark调优总结下来可以从下面几个点来调优. 1. 分配更多的资源 分配更多的资源: ...

  2. python写spark的效率问题_“大数据架构”Spark 3.0发布,重大变化,性能提升18倍...

    我们激动地宣布,作为Databricks运行时7.0的一部分,可以在Databricks上使用Apache SparkTM 3.0.0版本.3.0.0版本包含超过3400个补丁,是开源社区做出巨大贡献 ...

  3. 大数据之-入门_大数据部门组织结构(重点)---大数据之hadoop工作笔记0007

    hadoop,flume,kafka,hbase,spark等需要去采集数据,这里分为开发和运维,开发是去搭建这个平台,运维保证他们正常运行 这里最好,把他们的源码都,研究明白.最好还能改改,从新把源 ...

  4. 大数据hadoop新手快速入门视频教程 Hadoop学习视频教程

    最新在学习hadoop .storm大数据相关技术,发现网上hadoop .storm 相关学习视频少之又少,我这里整理了hadoop学习视频,给大家学习. 视频下载地址:http://demo.li ...

  5. 大数据之-入门_大数据部门业务流程分析---大数据之hadoop工作笔记0006

    回流用户数,就是二次消费,三次消费的..这样的. 可以看到上面就是大数据部门的业务流程 就是上面这样了.产品人员,提需求,数据部门做数据,然后再进行数据可视化展示. 技术交流QQ群[JAVA,C++, ...

  6. java安卓开发 快速入门_安卓程序员如何快速入门后端开发常识

    首先,对于安卓开发人员来说,学习一下后端开发知识是有必要的,一方面可以拓展自身的知识面,另一方面也可以推动自己走向全栈程序员发展路线,在云计算时代,全栈程序员的发展空间会更大一些. 相对来说,安卓程序 ...

  7. 大数据之-入门_大数据特点(4V)---大数据之hadoop工作笔记0003

    1PB =1024 T BAT+头条+美团的数据,基本就是EB规模的. 1ZB=1024EB ,海量数据

  8. 大数据之-入门_大数据发展前景---大数据之hadoop工作笔记0005

    国家层面: 国际层面 大学层面

  9. 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】

    视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...

最新文章

  1. mysql-cluster 安装配置
  2. CNVD初次获取的源代码格式
  3. iOS-Xcode代码统计
  4. SpringMVC的数据响应-回写数据-直接回写字符串(应用)
  5. fst java_java快速序列化库FST
  6. servlet中用out.print输出中文为“乱码”如何解决
  7. 从数据到代码——通过代码生成机制实现强类型编程[上篇]
  8. 函数c语言画箭头_什么时候不使用箭头函数
  9. win7备份工具_u盘系统重装win7旗舰版详细图解教程
  10. Qt5学习笔记之bin文件合成工具三:偏移量数据填充
  11. 网站在线工具查询链接收录与优化文章收录情况
  12. C++学习笔记——C++中四个点代表什么意思?
  13. 《使用Python进行自然语言处理》学习笔记四
  14. ubuntu 18.04 安装conda环境 及 创建虚拟环境
  15. 如何在spss结果输出页面显示命令/运行代码
  16. 兆骑科创创新创业服务平台,海内外高层次人才引进,活动赛事
  17. 用PS做法线,高光贴图的最简图文教程
  18. 基于NABCD评论作品,及改进建议
  19. 手机网页UI框架jQuery Mobile介绍之按钮篇
  20. Arduino ESP32 第三方库读取SD卡信息(三)

热门文章

  1. ASP.NET 2.0 Web Part编程之定制Web Part
  2. Apache 基金会宣布 Apache Kylin 成为顶级项目
  3. e人e本 html文件上传乱码,打印操作规范引发的乱码故障怎么处理
  4. 察看无限网络linux,linux 无线网络调试
  5. java 定时还款 技术_详解java定时任务
  6. js进栈出栈_[js]数组栈和队列操作
  7. ospf多区域实例配置
  8. 缓存淘汰算法--LRU算法
  9. IIS 常见异常及解决办法
  10. 基本sql语句--增删改查