在《Spark2.1.0之运行环境准备》一文中,已经介绍了如何准备好基本的Spark运行环境,现在是时候实践一下,以便于在使用过程中提升读者对于Spark最直接的感触!本文通过Spark的基本使用,让读者对Spark能有初步的认识,便于引导读者逐步深入学习。

运行spark-shell

在《Spark2.1.0之运行环境准备》一文曾经简单运行了spark-shell,并用下图进行了展示(此处再次展示此图)。

图1    执行spark-shell进入Scala命令行

图1中显示了很多信息,这里进行一些说明:

  • 在安装完Spark 2.1.0后,如果没有明确指定log4j的配置,那么Spark会使用core模块的org/apache/spark/目录下的log4j-defaults.properties作为log4j的默认配置。log4j-defaults.properties指定的Spark日志级别为WARN。用户可以到Spark安装目录的conf文件夹下从log4j.properties.template复制一份log4j.properties文件,并在其中增加自己想要的配置。
  • 除了指定log4j.properties文件外,还可以在spark-shell命令行中通过sc.setLogLevel(newLevel)语句指定日志级别。
  • SparkContext的Web UI的地址是:http://192.168.0.106:4040。192.168.0.106是笔者安装Spark的机器的ip地址,4040是SparkContext的Web UI的默认监听端口。
  • 指定的部署模式(即master)为local[*]。当前应用(Application)的ID为local-1497084620457。
  • 可以在spark-shell命令行通过sc使用SparkContext,通过spark使用SparkSession。sc和spark实际分别是SparkContext和SparkSession在Spark REPL中的变量名,具体细节已在《Spark2.1.0之剖析spark-shell》一文有过分析。

由于Spark core的默认日志级别是WARN,所以看到的信息不是很多。现在我们将Spark安装目录的conf文件夹下的log4j.properties.template以如下命令复制出一份:

cp log4j.properties.template log4j.properties

并将log4j.properties中的log4j.logger.org.apache.spark.repl.Main=WARN修改为log4j.logger.org.apache.spark.repl.Main=INFO,然后我们再次运行spark-shell,将打印出更丰富的信息,如图2所示。

图2  Spark启动过程打印的部分信息

从图2展示的启动日志中我们可以看到SecurityManager、SparkEnv、BlockManagerMasterEndpoint、DiskBlockManager、MemoryStore、SparkUI、Executor、NettyBlockTransferService、BlockManager、BlockManagerMaster等信息。它们是做什么的?刚刚接触Spark的读者只需要知道这些信息即可,具体内容将在后边的博文给出。

执行word count

这一节,我们通过word count这个耳熟能详的例子来感受下Spark任务的执行过程。启动spark-shell后,会打开Scala命令行,然后按照以下步骤输入脚本:

步骤1    

输入val lines =sc.textFile("../README.md", 2),以Spark安装目录下的README.md文件的内容作为word count例子的数据源,执行结果如图3所示。

图3   步骤1执行结果

图3告诉我们lines的实际类型是MapPartitionsRDD。

步骤2

       textFile方法对文本文件是逐行读取的,我们需要输入val words =lines.flatMap(line => line.split(" ")),将每行文本按照空格分隔以得到每个单词,执行结果如图4所示。

图4   步骤2执行结果

图4告诉我们lines在经过flatMap方法的转换后得到的words的实际类型也是MapPartitionsRDD。

步骤3

对于得到的每个单词,通过输入val ones = words.map(w => (w,1)),将每个单词的计数初始化为1,执行结果如图5所示。

图5   步骤3执行结果

图5告诉我们words在经过map方法的转换后得到的ones的实际类型也是MapPartitionsRDD。

步骤4

输入val counts = ones.reduceByKey(_ + _),对单词进行计数值的聚合,执行结果如图6所示。

图6   步骤4执行结果

图6告诉我们ones在经过reduceByKey方法的转换后得到的counts的实际类型是ShuffledRDD。

步骤5

输入counts.foreach(println),将每个单词的计数值打印出来,作业的执行过程如图7和图8所示。作业的输出结果如图9所示。

图7   步骤5执行过程第一部分

图8  步骤5执行过程第二部分

图7和图8展示了很多作业提交、执行的信息,这里挑选关键的内容进行介绍:

  • SparkContext为提交的Job生成的ID是0。
  • 一共有四个RDD,被划分为ResultStage和ShuffleMapStage。ShuffleMapStage的ID为0,尝试号为0。ResultStage的ID为1,尝试号也为0。在Spark中,如果Stage没有执行完成,就会进行多次重试。Stage无论是首次执行还是重试都被视为是一次Stage尝试(Stage Attempt),每次Attempt都有一个唯一的尝试号(AttemptNumber)。
  • 由于Job有两个分区,所以ShuffleMapStage和ResultStage都有两个Task被提交。每个Task也会有多次尝试,因而也有属于Task的尝试号。从图中看出ShuffleMapStage中的两个Task和ResultStage中的两个Task的尝试号也都是0。
  • HadoopRDD则用于读取文件内容。

图9  步骤5输出结果

图9展示了单词计数的输出结果和最后打印的任务结束的日志信息。

笔者在本文介绍的word count例子是以SparkContext的API来实现的,读者朋友们也可以选择在spark-shell中通过运用SparkSession的API来实现。

有了对Spark的初次体验,下面可以来分析下spark-shell的实现原理了,请看——《Spark2.1.0之剖析spark-shell》

关于《Spark内核设计的艺术 架构设计与实现》

经过近一年的准备,基于Spark2.1.0版本的《 Spark内核设计的艺术 架构设计与实现》一书现已出版发行,图书如图:

纸质版售卖链接如下:
京东: https://item.jd.com/12302500.html
电子版售卖链接如下:
京东: https://e.jd.com/30389208.html

Spark2.1.0之初体验相关推荐

  1. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏

    上一篇<Windows Embedded CE 6.0开发初体验>之"嵌入式开发流程": http://blog.csdn.net/aawolf/archive/200 ...

  2. Windows Embedded CE 6.0开发初体验(三)设置Boot-loader

    在Digi CC 9P开发板中已经预置了Boot-loader和一个CE 6.0的系统,所以,我们直接启动开发板,就可以运行一个CE 6.0的操作系统.不过,我们的最终目的是要开发一个自己的CE 6. ...

  3. Windows Embedded CE 6.0开发初体验(二)CE开发环境

    CE开发环境 下面就要让今天的主角闪亮登场了--Digi CC 9P开发板.为了感谢Digi提供的开发板,还是给他们做个广告吧:这是一家以WiFi相关产品为主营业务的公司,也生产ARM架构的CPU,所 ...

  4. Windows Embedded CE 6.0开发初体验(一)Windows CE概述

    这篇文章的目的并不是介绍Windows Embedded CE开发的方方面面,只是用一个初涉嵌入式领域的软件开发者的视角来介绍Windows CE开发中最常用的概念和知识,解决大家会在实际开发中碰到的 ...

  5. spark1.0和2.0的区别_Spark2.1.0——Spark初体验

    学习一个工具的最好途径,就是使用它.这就好比<极品飞车>玩得好的同学,未必真的会开车,要学习车的驾驶技能,就必须用手触摸方向盘.用脚感受刹车与油门的力道.在IT领域,在深入了解一个系统的原 ...

  6. MyEclipse 8.0 GA 初体验

    MyEclipse 8.0 GA(正式版)最近已发布,马上安装体验了一番: 1.Format jsp文件时产生的代码更改错误已修复: 下面是原始新建的jsp page的代码: 对于上一个版本,MyEc ...

  7. Windows Embedded CE 6.0开发初体验(七)编译和调试平台

    在完成Catalog选择之后,平台定制的工作告一段落,接下来,我们就要进入变数最多的环节--"编译和调试"平台了.编译的操作简单,但是想通过编译却有很多变数. 编译平台的第一步是选 ...

  8. Windows Embedded CE 6.0开发初体验(五)构建CE平台

    接下来的一节会有非常多的图,因为我们要在Visual Studio 2005里创建一个CE 6.0的平台(Platform)了.创建CE平台的方法和创建普通工程的方法类似.在完成了Platform B ...

  9. Windows Embedded CE 6.0开发初体验(四)跑个应用程序先

    因为我们的开发板上已经预置了Windows CE 6.0的系统,所以我们可以先创建一个.NET CF的应用程序,来看一下如何将.NET CF程序部署到Digi开发板上. 第一步,首先在Visual S ...

最新文章

  1. 字节跳动教育裁员:赔付方式N+2
  2. MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解
  3. 卡巴斯基:警惕IE拦截器恶意推广导航网站
  4. 有简易通用权限管理后台的快速C# ASP.NET开发的例子应用程序卖给了曾长期开发JAVA银行程序的大哥...
  5. Linux系统如何在开机时修改root密码
  6. .NET 6 HotReload的试用
  7. php入口函数,php 常用的系统函数
  8. 【Tensorflow】小白入门实战基础篇(下)
  9. java 上传文件注意事项
  10. 《杀戮地带:暗影坠落(Killzone: Shadow Fall)》工程师讲解使用屏幕空间反射系统
  11. Idea ctrl shift r全局搜索搜索指定不到文件
  12. CocoaPod使用--Podfile--版本依赖管理
  13. CentOS 7下载地址(ISO文件)
  14. 用计算机知道手机号码,知道手机号怎么整贱人-原来微信的“+”号还有这些隐藏用法?居然可以一键检测真假好友...
  15. 一定是h的方式不对阅读_41章_[黑篮]一定是H的方式不对!_七零小说网
  16. Android打包动态配置签名
  17. 高质量的博客该如何来进行打造?
  18. hook failed (add --no-verify to bypass)
  19. SF26 | 适用于商品+股指的枢轴点趋势策略
  20. 【目标检测-YOLO】YOLOv5-v6.0-网络架构详解(第二篇)

热门文章

  1. 当幸福来敲门,不是影评
  2. LGA1155、LGA1156、LGA1366、LGA2011的CPU插槽对应的都是什么型号的CPU
  3. Java学习day07-Java高级编程-多线程
  4. 多种语言画玫瑰,总有一款适合你表白
  5. 人工智能实践:tensorflow笔记
  6. C#和JQ判断移动端还是PC端
  7. 升级IOS百度人脸SDK4.0采坑记录
  8. 决定重新安装windows2016datacenter 系统。原先的俄罗斯版没虚拟机功能
  9. 【毕业设计】基于STM32的自动加油站加油系统 -物联网 单片机 嵌入式
  10. 猴子吃桃问题之暴力解法