Spark程序设计——基本流程

来源:互联网 发布:matlab定义字符串数组 编辑:程序博客网 时间:2024/05/01 10:56

一、基本流程
1.创建SparkContext对象
——封装了spark执行环境信息
2.创建RDD
——可从Scala集合或Hadoop数据集上创建
3.在RDD之上进行转换和action
——Spark提供了多种转换和action函数
4.返回结果
——保存到HDFS中,或直接打印出来

二、代码示例

(一)创建SparkContext(spark程序中只能有一个)
1.创建conf ,封装了spark配置信息

val conf=new SparkConf().setAppName(appName)//作业名称conf.set("spark.app.name","MyFirstProgram")//设置内存cpu等资源conf.set("spark.yarn.queue","infrastructure")//提交到哪个队列,缺省-默认值

2.创建SparkContext,封装了调度器等信息
val sc=new SparkContext(conf)

(二)创建RDD

sc.parallelize(List(1,2,3),2)//对List(1,2,3)进行并行化,并行度为2,第二个参数可以不写,默认值1

这里写图片描述

1.文本文件(TextInputFormat)

sc.textFile("file.txt")//将本地文件加载成RDDsc.textFile("diretory/*.txt")//将某类文本文件加载成RDDsc.textFile("hdfs://nn:9000/path/file")//HDFS文件或目录

2.sequenceFile(SequenceFileInputFormat)

sc.sequenceFile("file.txt")//将本地二进制文件加载成RDDsc.sequenceFile[String,Int]("hdfs://nn:9000/path/file")

3.使用任意自定义的Hadoop InputFormat(源自hadoop的组件)

sc.hadoopFile(path,inputFmt,keyClass,valClass)

HDFS

inputRdd=sc.textFile("/data/input")//文件可能本地也可能是hdfs,来源于上下文取决于环境变量的设置inputRdd=sc.textFile("file:///data/input")//本地文件,寻找运行节点的本地文件inputRdd=sc.textFile("hdfs:///data/input")inputRdd=sc.textFile("hdfs://namenode:8020/data/input")

生成的RDD有几个partition,取决于存储文件的block数量,默认情况一一映射。
这里写图片描述
使用自定义InputFormat
(1).NLineInputFormat
将文本文件中的N行作为一个input spilt,由一个Map Task处理
(2).使用NLineInputFormat
这里写图片描述
(三)创建RDD:HBase

import org.apache.spark._import org.apache.hadoop.hbase.mapreduce.TableInputFormat//创建SparkContextval sparkConf=new SparkConf()val sc=new SparkContext(conf)//设置hbase configurationval hbaseConf=HBaseConfiguration.create()hbaseConf.addResource(new Path("hbase-site.xml"))hbaseConf.set(TableInputFormat.INPUT_TABLE,tableName)//创建hbase RDDval hBaseRDD=sc.newAPIHadoopRDD(hbaseConf,classOf[TableInputFormat],classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],classOf[org.apache.hadoop.hbase.client.Result])//获取总行数val count=hBaseRDD.count()

(四)transformation与action
这里写图片描述
Transformation:将一个RDD通过一种规则,映射成另外一种RDD;
Action:返回结果或者保存结果,只有action才会触发程序的执行。

RDD transformation

//创建RDDval listRdd=sc.parallelize(List(1,2,3),3)//将RDD传入函数,生成新的RDDval squares=listRdd.map(x=>x*x) //{1,4,9}//对RDD中元素进行过滤,生成新的RDDval even=squares.filter(_%2==0)//{4}//将一个元素映射成多个,生成新的RDD。map映射,flat过滤nums.flatMap(x=>1 to x) //=>{1,1,2,1,2,3}

RDD Action

//创建新的RDDval nums=sc.parallelize(List(1,2,3),2)//将RDD保存为本地集合(返回到driver端)nums.collect() //=>Array(1,2,3)//返回前k个元素nums.take(2) //=>Array(1,2)//计算元素总数nums.reduce() //=>3//合并集合元素nums.reduce(_+_) //=>6//将RDD写到HDFS中nums.saveAsTextFile("hdfs://nn:8020/output")nums.saveAsSequenceFile("hdfs://nn:8020/output")

将RDD保存到HBase

这里写图片描述

(五)Key/Value类型的RDD

val pets=sc.parallelize(List(("cat",1),("dog",1),("cat",2)))pets.reduceByKey(_+_)//=>{(cat,3),(dog,1)}pets.groupByKey()//=>{(cat,Seq(1,2)),(dog,Seq(1))}pets.sortByKey()//=>{(cat,1),(cat,2),(dog,1)}

reduceBykey自动在map端进行本地combine

1 0