Spark学习---RDD编程

  • 学习背景

    本人如今在一家非科技公司工做,到如今入职已经5个多月了。mysql

    我以前有过大数据工做的经验,算接触了一点皮毛,到这家公司也是抱着继续往大数据方向发展的心态而来的。程序员

    面试个人是一位海归博士,刚开始以为他应该是一位大数据专家,但在面试的过程当中就发现不太对头,不过以为公司应该有CTO的人物存在,因而稀里糊涂就进了这家公司。面试

    事实证实并无。sql

    到如今作的事情基本和hadoop、spark这些都没什么关系了,我亲手搭建的cloudera平台也被领导要求撤了,由于没有用武之地,领导以为还不如装oracle,装mysql。缓存

    可是我不会轻易改变个人职业规划,因而暗地里本身还在恶补大数据工程开发的相关知识,这些东西不能丢,补习一段时间,准备找个时间就跑路吧。oracle

    在这里也奉劝各位和我同样入世不深的程序员们,选公司尽可能避开这些传统行业的公司,这些公司领导每每不懂技术,更有甚者还不尊重技术,这时候有个技术总监类型的人物还好,不然日子很很差过。年轻的程序员小伙伴们,大家仍是多找找互联网公司吧,别把青春耽误了。app

    本人也是初学者,处于大数据学习的起步阶段,平时爱好把学到的东西写下来,进行总结,我计划作一个Spark学习的系列博客,志同道合的朋友,咱们能够互相交流。博客中描述不许确或者有误的地方也请各位不吝赐教,谢谢。分布式

  • 进入正题

    我以前粗略的看过几本spark的相关书籍,大部分一上来就跟你讲工做的原理,各个组件的机制,对于初学者来讲,可能看两页就看不下去了,从而放弃了对spark的学习。工具

    我本人也是这么认为的,因此今天咱们先从RDD这一spark的核心对象提及,让你们能快速的上手操做,在之后的博客中,咱们再回过头来分析原理。明白原理咱们才能踏踏实实的写代码。oop

    本人写系列博客的出发点是为了记录本身的学习过程,然本身学的更深刻,因此不能做为你们学习spark的参考,若是你是一名初学者,建议购买一些spark的书籍进行学习,如《Spark快速大数据分析》,不过在此以前,你能够看一下《快学Scala》先打一下Scala的基础,毕竟spark是用scala语言编写的,用母语写程序,味道才正宗。

  • 什么是RDD

    RDD,即弹性分布式数据集(Resilient Distributed Dataset),说白了就是分布式的元素集合。咱们能够把它想象成一个分布在集群中的一个队列,对RDD进行简单的操做,咱们就能够轻松的实现对整个集群的上数据进行并行的操做。

    RDD有这样几个特性:不可变的、分区的、能够包含任意类型的对象。

  • 如何建立RDD

    咱们有两种方法建立RDD:一、读取外部的数据文件。二、将程序中的集合类型的数据(list、set)转化而成。

    分别举两个例子来讲明:

    

//第一种方式
val lines = sc.textFile("test.txt")

//第二种方式
val lines = sc.parallelize(["a", "b", "c"])
  • 如何操做RDD

    RDD的操做分为两种:一、转化操做(transformation)。二、行动操做(action)

    转化操做会生成新的RDD,可是spark只会惰性的进行计算,直到第一次执行一个行动操做,以前的转化操做才会开始执行。

    这有点相似于咱们装系统的时候,利用磁盘工具对硬盘进行分区、更改卷标号、格式化硬盘等操做,你在点击确认操做以前,全部的分区操做都不会真正的执行,直到你点击了确认按钮,软件才真正开始执行你刚刚指定的操做。

    因此你们若是用debug调试spark程序,会发现很奇怪的现象,明明程序运行到第10行了,可是再单步往下调试的时候,又跳到第6行去了,由于转化操做才刚刚开始执行。

    若是你们以前有在hadoop上写过mapreduce(如下简称MR),就会以为这种方式是很是高效的。MR程序会全量的读入你指定的文件,哪怕你在mapper中写了一条if,丢弃了其中80%的数据,可是spark不一样,在运行载入文件命令时,它不会真的把全部数据读进内存,而是看你以后对数据进行了哪些操做,换句话说,它想看看你究竟要作些什么操做,我好省省体力,不要作无用功。

    说到这里又想起个段子:女朋友学会了一个新菜,要你打下手,她拿着菜谱说,首先把杯子洗干净,并擦干里面的水,因而你擦了半天,终于把被子擦的一滴水都没有了,而后她接着说,第二步,在杯中倒入100ml的水。

    默认状况下,spark的RDD会在你每次对它们进行行动操做的时候从新计算,这时,若是你要反复操做同一个RDD,你应该把这个RDD缓存起来,避免重复的运算,使用persist方法将RDD进行缓存。

//从外部读取文件,生成RDD
val lines = sc.textFile("test.txt")
//将RDD缓存起来,方法若是没有参数能够省略括号
lines.persist
//调用转化操做,读取包含'error'的行
val errorLines = lines.filter(x => x.contains("error"))
//调用第一个行动操做,使得以前的转化操做开始执行
errorLines.first()

    缓存后的数据默认是以序列化的形式缓存在内存中,咱们也能经过传入参数来改变缓存的位置,如存放到磁盘中。咱们甚至能在末尾加上_2指定缓存的份数

    总而言之,转化操做返回新的RDD,而且具备“血统”,能保存从父RDD转化的过程,在数据丢失时,根据血统信息进行重算便可;而行动操做则返回操做的结果(数值、字符串等格式)或者是将数据存入磁盘中。

    时候不早了,今天的分享就到这里。

相关文章
相关标签/搜索