spark 深入学习 05】RDD编程之旅基础篇-01

----------------

本节内容

1.RDD的工作流程

2.WordCount解说

 · shell版本WordCount

 · java版本WordCount

----------------

一、RDD工作流程

1. RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当作一个数组,这样的理解对我们学习RDD的API是非常有帮助的。本文所有示例代码都是使用scala语言编写的。RDD的执行过程如下:

· 从外部数据创建出输入RDD,或者从驱动程序分发驱动程序中的对象集合

· 对RDD进行转化,一个RDD转化为一个新的RDD,如filter()操作

· 如果需要重用,告知RDD执行persist()操作

· 执行action触发计算并行计算,spark先优化再执行计算,如count()和first()

RDD的创建有2种方式

(1)从驱动程序分发驱动程序中的对象集合
从内存里构造RDD,使用的方法:makeRDD和parallelize方法

-----------------------

val rdd01 = sc.makeRDD(List(1,2,3,4,5,6));

val r01 = rdd01.map { x => x * x }

println(r01.collect().mkString(","))

/* Array */

val rdd02 = sc.makeRDD(Array(1,2,3,4,5,6))

val r02 = rdd02.filter { x => x < 5}

println(r02.collect().mkString(","))

val rdd03 = sc.parallelize(List(1,2,3,4,5,6), 1)

val r03 = rdd03.map { x => x + 1 }

println(r03.collect().mkString(","))

/* Array */

val rdd04 = sc.parallelize(Array(1,2,3,4,5,6) ,1)

val r04 = rdd04.filter { x => x > 3 }

println(r04.collect().mkString(","))

-----------------------

2.makeRDD和parallelize的区别

makeRDD有两种实现方式,第一种方式parallelize声明都一样,接收的参数和parallelize完全一样,def makeRDD[T:ClassTag],这种实现方式的makeRDD依赖了parallelize;makeRDD第二种实现方式defmakeRDD[T:ClassTag](T,Seq(String)))

第一种:mkRDD实现方式

val blog1=sc.parallelize(List(1,2,3));

val blog2=sc.makeRDD(List(1,2,3));

第二种:mkRDD实现方式

valseq=List((1,List("a","b","c")),(2,List("aa","bb","cc")));

val blog3=sc.makeRDD(seq);

blog3.preferredLocations(blog3.partitions(0));

blog3.preferredLocations(blog3.partitions(1));

WordCount

WordCount是分布式编程的入门示例,本节也从WordCount举例说明RDD DEMO

1.Spark shell版本

---------------------------------------------------

//加载hdfs上的文件

val txtFile ="/tmp/test/core-site.xml" ;

val txtData = sc.textFile(txtFile);

//将上一步生成的RDD对象保存到缓存中,在此之后Spark就不需要在每次数据查询时都重新计算

txtData.cache()    ;

// flatMap先映射后扁平化,

val wcData = txtData.flatMap(l =>l.split(" ")).map(word => (word, 1)).reduceByKey(_ + _);

//可以提取出所有rdd里的数据项,逐行输出

wcData.collect().foreach(println);

备注:

A.     关于spark-shell的启动参数指定

bin/spark-shell --executor-memory 1G --total-executor-cores10 --executor-cores 1 --master yarn-client  --driver-class-path /usr/local/tdr_hadoop/spark/spark-1.6.0-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar

--executor-memory: 指定每个executor(执行器)占用的内存

--total-executor-cores: 所有executor总共使用的cpu核数

--executor-cores:每个executor使用的cpu核数

--driver-class-path:指定要加载的jar包

--master:

local[8]:表示在本地运行,数据会下载到接口机本地来执行,单机版

spark://master01:7077:表示在集群上运行应用程序,指定任务提交的集群路径在哪里。这就需要提前启动一个真实的Standalone集群。可以指定多个master的地址,用逗号隔开。

yarn-client:在客户模式上,driver与提交程序的客户端在一个进程

yarn-cluster:在集群模式上,driver是从集群中的一个worker进程中启动的,这个进程只要完成了提交作业任务就会退出,不会等待提交的应用程序的完成。Spark-shell时,必须使用yarn-client模式,因为你要在client上写SQL。

B.spark-shell 是一个spark application,运行时需要向资源管理器申请资源,如standalone spark、YARN、Mesos。本例向standalone spark申请资源,所以在运行spark-shell时需要指向申请资源的standalonespark集群信息,其参数为MASTER。

如果未在spark-env.sh中申明MASTER,则使用命令MASTER=spark://cdh1:7077bin/spark-shell启动;如果已经在spark-env.sh中申明MASTER,则可以直接用bin/spark-shell启动。

由于spark-shell缺省的情况下,会申请所有的CPU资源

B.     Spark每次Executor执行任务情况

2. java 版本

搭建Spark开发环境

(1)前提:配置好jdk和scala到windows
(2)安装Intellij去官网下载Intellij:https://www.jetbrains.com/idea/,在windows环境下双击安装即可
(3)安装scala插件

步骤如下图所示,安装好scala插件后,点击restart重启intellij

(4)、使用Intellij写WordCount代码
a.新建scala工程
  File -> new  -> project  -> scala project –>scala,项目名称:spark02

在src目录下,建立cn.com包,在该包下建立object 类,命名为word,完成word.scala代码如下所示:

---------------------------------------------------------------------package cn.com
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._

/**
  * Created by Administrator on 2016/11/2.
  */
object word {
  def main(args: Array[String]) {
    if(args.length < 1) {
      System.err.println("Usage: <file>")
      System.exit(1)
    }
    val conf = new SparkConf()
    val sc = new SparkContext(conf)
    //SparkContext 是把代码提交到集群或者本地的通道,我们编写Spark代码,无论是要本地运行还是集群运行都必须有SparkContext的实例
    
val line = sc.textFile(args(0))
    //把读取的内容保存给line变量,其实line是一个MappedRDD,Spark的所有操作都是基于RDD的
    
line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_).collect.foreach(println)
    sc.stop
  }

}

---------------------------------------------------------------------

b.导入spark包
 File

->Project structure

->project settting

->libraries->+

导入spark-assembly-1.6.0-hadoop2.6.0.jar包(该包从spark安装包的lib下获得)

c.选择Artifacts

File

->Project structure

->project settting

->Artifacts->+,选择要导入的项目,以及main类

并且指定jar包输出的位置

d.输出jar包
Build -> Build ArtiFacts ->build,打好jar包到:D:\spark02\out\artifacts\spark02_jar\spark02.jar

e.上传jar包到spark客户端,并执行
  执行命令:

spark-submit --master yarn --executor-memory 1000M /usr/local/tdr_hadoop/spark/spark02.jarhdfs://tdrHadoop/tmp/test/core-site.xml

在yarn的前台显示正在执行

执行结果输出:

时间: 2024-10-12 17:11:53

spark 深入学习 05】RDD编程之旅基础篇-01的相关文章

【spark 深入学习 05】RDD编程之旅基础篇02-Spaek shell

--------------------- 本节内容: · Spark转换 RDD操作实例 · Spark行动 RDD操作实例 · 参考资料 --------------------- 关于学习编程方式的,每个人都有自己的方式.对我个人来说,最好的方法还是多动手写demo,要多写代码,才能理解的更加深刻,本节以例子的形式讲解各个Spark RDD的使用方法和注意事项,本文一共讲解了20个RDD的使用demo. 一.Spark转换 RDD操作实例 RDD转换操作返回的是RDD,而行动操作返回的是其

ESP8266开发之旅 基础篇① 走进ESP8266的世界

本博客由 单片机菜鸟 个人撰写,仅仅做个人技术交流分享,不做任何商业用途,不经允许,切勿转载.如有不对之处,请留言,本人及时更改. 一.基础篇 ESP8266开发之旅 基础篇① 走进ESP8266的世界 ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境 ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明 ESP8266开发之旅 基础篇④ ESP8266与EEPROM ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信

少儿创意学编程(Scratch基础篇):第3课——捉鬼敢死队

<少儿创意学编程(Scratch基础篇)>,参考了英国公益组织发起的"code club(代码俱乐部)"--少儿免费学编程活动.愿为中国的少儿创意编程教育尽微薄之力,对国内的家长.信息教师和相关教育机构有所帮助,共同促进软件素质教育的发展. 本课程以Scratch软件为教育工具.Scratch是一种图形化编程语言,由麻省理工学院开发.孩子们可以像搭积木一样,拖动和组合代码块,制作丰富多样的程序,比如动画,故事和游戏等等.本课程共设有6个项目,知识点由简到难,循序渐进,带领孩

少儿创意学编程(Scratch基础篇):第4课——聊天机器人

<少儿创意学编程(Scratch基础篇)>,参考了英国公益组织发起的"code club(代码俱乐部)"--少儿免费学编程活动.愿为中国的少儿创意编程教育尽微薄之力,对国内的家长.信息教师和相关教育机构有所帮助,共同促进软件素质教育的发展. 本课程以Scratch软件为教育工具.Scratch是一种图形化编程语言,由麻省理工学院开发.孩子们可以像搭积木一样,拖动和组合代码块,制作丰富多样的程序,比如动画,故事和游戏等等.本课程共设有6个项目,知识点由简到难,循序渐进,带领孩

少儿创意学编程(Scratch基础篇):第5课——绘画板

<少儿创意学编程(Scratch基础篇)>,参考了英国公益组织发起的"code club(代码俱乐部)"--少儿免费学编程活动.愿为中国的少儿创意编程教育尽微薄之力,对国内的家长.信息教师和相关教育机构有所帮助,共同促进软件素质教育的发展. 本课程以Scratch软件为教育工具.Scratch是一种图形化编程语言,由麻省理工学院开发.孩子们可以像搭积木一样,拖动和组合代码块,制作丰富多样的程序,比如动画,故事和游戏等等.本课程共设有6个项目,知识点由简到难,循序渐进,带领孩

LINQ之旅—基础篇

(1)Part 1:LINQ之旅—基础篇 (2)Part 2:LINQ之旅—进阶篇 (3)Part 3:LINQ之旅—高级篇

Swift学习】Swift编程之旅---类和结构体(十三)

与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类的实例被称为对象.然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我们会主要使用实例而不是对象. 比较类和结构体 类和结构体都具有以下特性: 定义用于存储值的属性 定义提供特定能力或功能的方法 定义提供使用下标语法访问值的下标

【Swift学习】Swift编程之旅(三)

元组(tuples) tuples是将多个单一的值组合为一个复合的值.它可以包含任何类型的值,而不需要都是相同类型. 一.元组的创建 1. let http404error = (404,"NOT FOUND!") let (statusCode, statusMessage) = http404error print("The status code is \(statusCode),the status message is \(statusMessage)")

【Swift学习】Swift编程之旅(一)

学习一门新语言最经典的例子就是输出“Hello World!” print("Hello World!") swift就是这样来输出的. 如果你使用过其他语言,那么看上去是非常的熟悉吧.但比一些c要简单的多吧 1.不需要导入一些单独的库,比如输入/输出或字符串处理功能的类库, 2.不需要在全局范围内编写的代码用于作为入口点程序,所以你不需要 main()函数, 3.不需要写在每个语句的末尾的分号.这样写是不是很简单~ 简单值 使用let来声明一个常量,var声明一个变量.一个常量值在编