Quick Start: https://spark.apache.org/docs/latest/quick-start.html

在Spark 2.0之前,Spark的编程接口为RDD (Resilient Distributed Dataset)。而在2.0之后,RDDs被Dataset替代。Dataset很像RDD,但是有更多优化。RDD仍然支持,不过强烈建议切换到Dataset,以获得更好的性能。
 

一、最简单的Spark Shell交互分析

scala> val textFile = spark.read.textFile("README.md")   # 构建一个Dataset
textFile: org.apache.spark.sql.Dataset[String] = [value: string] scala> textFile.count() # Dataset的简单计算
res0: Long = scala> val linesWithSpark = textFile.filter(line => line.contain("Spark")) # 由现有Dataset生成新Dataset
res1: org.apache.spark.sql.Dataset[String] = [value: string]
# 等价于:
# res1 = new Dataset()
# for line in textFile:
# if line.contain("Spark"):
# res1.append(line)
# linesWithSpark = res1 scala> linesWithSpark.count()
res2: Long = # 可以将多个操作串行起来
scala> textFile.filter(line => line.contain("Spark")).count()
res3: Long =

进一步的Dataset分析:

scala> textFile.map(line => line.split(" ").size).reduce((a,b) => if (a > b) a else b)
res12: Int =
# 其实map和reduce就是两个普通的算子,不要被MapReduce中一个map配一个reduce、先map后reduce的思想所束缚
# map算子就是对Dataset的元素X计算fun(X),并且将所有f(X)作为新的Dataset返回
# reduce算子其实就是通过两两计算fun(X,Y)=Z,将Dataset中的所有元素归约为1个值 # 也可以引入库进行计算
scala> import java.lang.Math
import java.lang.Math scala> textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b))
res14: Int = # 还可以使用其他算子
scala> val wordCounts = textFile.flatMap(line => line.split(" ")).groupByKey(identity).count() # flatMap算子也是对Dataset的每个元素X执行fun(X)=Y,只不过map的res是
# res.append(Y),如[[Y11, Y12], [Y21, Y22]],结果按元素区分
# 而flatMap是
# res += Y,如[Y11, Y12, Y21, Y22],各元素结果合在一起 # groupByKey算子将Dataset的元素X作为参数传入进行计算f(X),并以f(X)作为key进行分组,返回值为KeyValueGroupedDataset类型
# 形式类似于(key: k; value: X1, X2, ...),不过KeyValueGroupedDataset不是一个Dataset,value列表也不是一个array
# 注意:这里的textFile和textFile.flatMap都是Dataset,不是RDD,groupByKey()中可以传func;如果以sc.textFile()方法读文件,得到的是RDD,groupByKey()中间不能传func # identity就是函数 x => x,即返回自身的函数 # KeyValueGroupedDataset的count()方法返回(key, len(value))列表,结果是Dataset类型 scala> wordCounts.collect()
res37: Array[(String, Long)] = Array((online,), (graphs,), ...
# collect操作:将分布式存储在集群上的RDD/Dataset中的所有数据都获取到driver端

数据的cache:

scala> linesWithSpark.cache()  # in-memory cache,让数据在分布式内存中缓存
res38: linesWithSpark.type = [value: string] scala> linesWithSpark.count()
res41: Long =

二、最简单的独立Spark任务(spark-submit提交)

需提前安装sbt,sbt是scala的编译工具(Scala Build Tool),类似java的maven。
brew install sbt
 
1)编写SimpleApp.scala
import org.apache.spark.sql.SparkSession

object SimpleApp {
def main(args: Array[String]) {
val logFile = "/Users/dxm/work-space/spark-2.4.5-bin-hadoop2.7/README.md"
val spark = SparkSession.builder.appName("Simple Application").getOrCreate()
val logData = spark.read.textFile(logFile).cache()
val numAs = logData.filter(line => line.contains("a")).count() # 包含字母a的行数
val numBs = logData.filter(line => line.contains("b")).count() # 包含字母b的行数
println(s"Lines with a: $numAs, Lines with b: $numBs")
spark.stop()
}
}

2)编写sbt依赖文件build.sbt

name := "Simple Application"

version := "1.0"

scalaVersion := "2.12.10"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.5"

其中,"org.apache.spark" %% "spark-sql" % "2.4.5"这类库名可以在网上查到,例如https://mvnrepository.com/artifact/org.apache.spark/spark-sql_2.10/1.0.0

3)使用sbt打包
目录格式如下,如果SimpleApp.scala和build.sbt放在一个目录下会编不出来
$ find .
.
./build.sbt
./src
./src/main
./src/main/scala
./src/main/scala/SimpleApp.scala

sbt目录格式要求见官方文档 https://www.scala-sbt.org/1.x/docs/Directories.html

src/
main/
resources/
<files to include in main jar here>
scala/
<main Scala sources>
scala-2.12/
<main Scala 2.12 specific sources>
java/
<main Java sources>
test/
resources
<files to include in test jar here>
scala/
<test Scala sources>
scala-2.12/
<test Scala 2.12 specific sources>
java/
<test Java sources>

使用sbt打包

# 打包
$ sbt package
...
[success] Total time: s (:), completed -- ::
# jar包位于 target/scala-2.12/simple-application_2.-1.0.jar

4)提交并执行Spark任务

$ bin/spark-submit --class "SimpleApp" --master spark://xxx:7077 ../scala-tests/SimpleApp/target/scala-2.12/simple-application_2.12-1.0.jar
# 报错:Caused by: java.lang.ClassNotFoundException: scala.runtime.LambdaDeserialize
# 参考:https://stackoverflow.com/questions/47172122/classnotfoundexception-scala-runtime-lambdadeserialize-when-spark-submit
# 这是spark版本和scala版本不匹配导致的

查询spark所使用的scala的版本

$ bin/spark-shell --master spark://xxx:7077

scala> util.Properties.versionString
res0: String = version 2.11.
修改build.sbt:
scalaVersion := "2.11.12"
从下载页也可验证,下载的spark 2.4.5使用的是scala 2.11
 
重新sbt package,产出位置变更为target/scala-2.11/simple-application_2.11-1.0.jar
再次spark-submit,成功
$ bin/spark-submit --class "SimpleApp" --master spark://xxx:7077 ../scala-tests/SimpleApp/target/scala-2.11/simple-application_2.11-1.0.jar
Lines with a: , Lines with b:

Spark文档阅读之二:Programming Guides - Quick Start的更多相关文章

  1. Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_IOC

    在看这部分内容的时候,想了一些问题: 容器: 1,什么是容器 用来包装或装载物品的贮存器 2,容器能做什么 包装或装载物品 3,为什么需要容器 为什么要使用集装箱?如果没有容器会是什么样? 4,常见的 ...

  2. Spark文档阅读之一:Spark Overview

    Document: https://spark.apache.org/docs/latest/index.html 版本:2.4.5   1. spark的几种执行方式 1)交互式shell:bin/ ...

  3. Spring 4.3.11.RELEASE文档阅读(二):Core Technologies_AOP

    虽然并不是每个问题都有答案,但我想了很多问题.so, just write it down , maybe one day...... AOP: 1,AOP是啥 2,AOP思想是怎么产生的 3,AOP ...

  4. 转:苹果Xcode帮助文档阅读指南

    一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出 ...

  5. Node.js的下载、安装、配置、Hello World、文档阅读

    Node.js的下载.安装.配置.Hello World.文档阅读

  6. 我的Cocos Creator成长之路1环境搭建以及基本的文档阅读

    本人原来一直是做cocos-js和cocos-lua的,应公司发展需要,现转型为creator.会在自己的博客上记录自己的成长之路. 1.文档阅读:(cocos的官方文档) http://docs.c ...

  7. Keras 文档阅读笔记(不定期更新)

    目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...

  8. Django文档阅读-Day1

    Django文档阅读-Day1 Django at a glance Design your model from djano.db import models #数据库操作API位置 class R ...

  9. Django文档阅读-Day2

    Django文档阅读 - Day2 Writing your first Django app, part 1 You can tell Django is installed and which v ...

随机推荐

  1. nginx四种均衡策略

    1.基于轮询的均衡策略: 轮询嘛,就是说对进到nginx的request按照遍历的方式进行分发,如果request 1 分发到 Server A,那么request 2将被分发到 Server B,. ...

  2. SQL——SQL日期

    SQL日期    MySQL:        NOW() 返回当前的日期和时间        CURDATE() 返回当前的日期        CURTIME() 返回当前的时间        DAT ...

  3. SimpleAuthenticationInfo的参数

    SimpleAuthenticationInfo的参数 仅供个人参考,以及学习记录.SimpleAuthenticationInfo authenticationInfo = new SimpleAu ...

  4. 干货!JNPF快速开发平台功能一览

      JNPF,采用主流的两大技术Java/.Net开发,是一套低代码开发平台,可视化开发环境,有拖拽式的代码生成器,灵活的权限配置.SaaS服务,强大的接口对接,随心可变的工作流引擎,一站式开发多端使 ...

  5. 【HTTP】Web服务器和HTTP的协作&HTTP首部

    用单台虚拟主机实现多个域名 Web服务器可以搭建多个独立域名的Web网站,也可以作为通信路径上的中转服务器提升效率. HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点,提供Web托管服务的 ...

  6. 【C++】常见易犯错误之数值类型取值溢出与截断(2)

    本节内容紧接上节,解决红色字体遗留问题.本节所有例子运行环境: win10 + VS2015 + X64 + debug 在上节例子中,查看变量 c .d .d+1 的类型. //// Console ...

  7. 【JVM】GCRoots和JVM的参数配置

    如何理解GCRoots? 为了解决引用计数法的循环引用问题,Java使用了可达性分析的方法.GC Roots是一组活跃的引用,通过一系列名为GC Roots的对象作为起始点,沿着该对象向下搜索,如果一 ...

  8. jchdl - 初次使用建立项目示例

    https://mp.weixin.qq.com/s/HaarKjpHan08RUTlEX0XHg   一. 下载并安装JDK 8   下载链接:https://www.oracle.com/tech ...

  9. Java并发编程 (九) 线程调度-线程池

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 声明:实际上,在开发中并不会普遍的使用Thread,因为它具有一些弊端,对并发性能的影响比较大,如下: ...

  10. CPU亲和度

    CPU亲和度(CPU Affinity),就是将一个进程或者线程强制绑定在CPU的某一个core上运行. 参考:https://www.cnblogs.com/zhangxuan/p/6427533. ...