从零爬着学spark

为啥叫爬着学

在此之前,我连spark是什么都不清楚,在看完《Spark快速大数据分析》(Learning Spark:Lighting-fast Data Analysis -by Holden Karau)之后,大致了解了spark的功能和组成。这篇blog应该算是这本《Spark》的读书笔记了吧。

前两章

讲了讲spark的功能,主要组成,历史,如何安装,如何初步运行,虽然万事开头难,但这部分纯属娱乐,难的马上就要开始了。

第三章 RDD扫盲

这里就开始接触了spark里最重要的一个概念:弹性分布式数据(Resilient Distributed Dataset 简称RDD)。貌似就是个数据集,里面有好多相同的元素,spark就通过某些方法对这个数据集里的元素进行分布式的操作。

  1. RDD相关操作
    有两种操作,一个是转化操作,一个是行动操作。区别两个主要看最后出来的结果是个RDD还是别的什么。并且,转化操作并不实际执行(书中叫惰性求值),只有当执行行动操作的时候才实际执行。
    • map()
      这个方法主要是操作RDD中的每个元素。比如可以让所有的元素的值+1之类的。还有个flatMap(),从字面理解是把每个元素拍扁(flat有扁平的意思),书中的例子是把所有句子里的单词全部拆分。
    • filter()
      过滤器吧,对RDD进行相应的过滤,比如去除不符合某种条件的元素。
    • 集合操作
      RDD作为元素集合,可以union(所有元素),intersection(交集),subtract(去除内容),cartesian(笛卡尔积)。
    • 其他
      还有什么去重distinct(),采样sample()这类的没用过也不知道是干啥的。
    • reduce()
      这是行动操作,它接收一个函数作为参数,这个函数要操作两个相同元素类型的RDD数据并返回一个同样类型的新元素。据说可以用来累加RDD,不过怎么加的没太搞懂。另外还有fold(),aggregate()之类的,和这个差不多,也没太搞懂。
    • collect()
      这个操作可以获得RDD,通过这个方法可以获得惰性执行的RDD。

2.缓存
可以通过persist(缓存等级)把RDD缓存到内存或者磁盘之类的地方。

第四章 键值对RDD

  1. 各种操作
    • RDD所有操作
      这里支持对于RDD的所有操作,只是注意传入的函数要操作二元组而不是单个元素
    • reduceByKey()
      聚合函数,按照key来进行聚合。和combineByKey()什么的差不多。
    • groupByKey():利用RDD的键分组RDD中的元素。
    • 连接:join(),leftOuterJoin(),rightOuterJoin()
    • 数据排序:sortByKey()
    • countByKey():对每个键对应的元素分别计数
    • collectAsMap():将结果以映射表的形式返回,以便查询
  2. 数据分区
    这是啥?

第五章 存取数据

就是存取各种格式的文件,包括文本文件,JSON,CSV,TSV,SequenceFile(由没有相对关系结构的键值对文件组成的常用Hadoop格式),其他的Hadoop输入输出格式。还能进行文件压缩。(是的我为什么不放点代码上来呢,因为我tm根本不会scala好吧(伟笑))。
- 文件系统包括本地常规文件系统,Amazon S3,HDFS(Hadoop分布式文件系统)等等。
- Spark SQL(后面专门讲)

第六章 进阶

  1. 共享变量

    • 累加器
      累加器可以将工作节点中的值聚合到驱动器程序中,比如可以把文本中所有的空行累加统计出来。
    • 广播变量
      即只用向各个节点发送一次,任务就可以通过Broadcast对象调用value来获取该对象的值。如果比较大,可以选择序列化的方式发送。
  2. 基于分区的操作
    Spark提供基于分区的map和foreach操作,让你的部分代码只对RDD的每个分区运行一次,这样可以帮助降低这些操作的代价。这里好像有个mapPartitions()函数。

  3. 外部程序管道pipe()
    这个就是能把你的数据通过管道整到外边去,用别的语言来处理你的数据。

  4. 数值RDD操作
    提供像count(),mean(),sum()之类的方法对数值RDD进行统计。

第七章 集群运行Spark

有个运行架构,就是下面这个图

而在集群上运行Spark应用的过程就是
1)用户通过spark-submit脚本提交应用
2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法。
3)驱动器程序与集群管理器通信,申请资源以启动执行器节点
4)集群管理器为驱动器程序启动执行器节点
5)驱动器进程执行用户应用中的操作。根据程序中所定义的对RDD的转化操作和行动操作,驱动器节点把工作以任务的形式发送到执行器进程。
6)任务在执行器程序中进行计算并保存结果
7)如果驱动程序的main()方法退出,驱动器程序会终止执行器进程,并且通过集群管理器释放资源

  • 打包代码与依赖
    可以利用Maven(用于java工程)或者sbt(用于scala工程)把多个依赖打包成一个超级jar包。如果有依赖冲突,就改个名,叫“shading”。
  • 集群管理器
    有好多种,spark自带的独立集群管理器(最简单),Hadoop YARN(使用其他应用或者要用到更丰富的资源调度功能),Apache Mesos(比YARN细粒度),Amazon EC2什么的,各有特点。

第八章 Spark优化与调试

  1. 使用SparkConf来配置Spark
    有很多选项可以设置诸如每个执行器的内存,使用的核心个数之类的设置。
  2. Spark的作业,任务和步骤
    这里有点混,下次再看看。
  3. 查找信息
    利用4040端口可以在网页上访问spark的用户界面,不过为啥我的1.6.0不行呢。
  4. 关键性能
    并行度(是用多少个核心的意思?),序列化格式,内存管理,硬件供给。

第九章 Spark SQL

这是spark的一个组件,通过这个可以从各种结构化数据源( JSON,Hive,Parquet)中读取数据,还可以连接外部数据库。提供了特殊的RDD叫做DataFrame(旧版本叫SchemaRDD)。还能在别的应用中使用spark SQL。还能连接JDBC服务器,但是不太明白连接JDBC搞毛啊,JDBC不是JAVA连接数据库才用的吗?这意思是通过JDBC来访问SQL数据库吗?还允许自定义数据库的函数,和SQL差不多。最后还能调节Spark SQLd 的性能选项。

第十章 Spark Streaming

这个就是流处理数据,把一段时间内的数据弄成一个RDD,整个合起来叫DStream。
1. 转化操作
包括无状态转化和有状态转化,无状态转化就是类似map(),filter()等的,对DStream里的每个RDD进行操作的,有状态的就是当前的计算需要之前的几个RDD,这里用的是

  • 滑动窗口
  • UpdateStateByKey()

2.输入输出
输出比较简单,用某些方法就可以写成文本或者流文件。
输入则可以通过文件,或者附加数据源(Apache Kafka,Apache Flume,自定义输入源)

3.检查点
检查点机制则可以控制需要在转化图中回溯多远。不过检查点是用在驱动器程序容错的。而工作节点容错则是备份数据。

4.性能考量
性能问题主要有批次和窗口大小,并行度,垃圾回收和内存使用。

第十一章 基于MLlib机器学习

这里有MLlib是spark的一个相关软件,里面有好多好多的机器学习算法什么的,看起来挺好用的。

好了,你见过没有一段代码的学习笔记吗,原谅我的小白吧,毕竟我还是爬行阶段,下一步要开始学spark的源语言scala了,学完之后再看spark肯定又是另一种感觉吧。

PS:当然还留了一些看起来好重点的知识点没看懂,等着明天好好研究研究之后再专门写一篇。

你可能感兴趣的:(Spark)