Spark是一个很有意思的东西.今天花了一些时间整理了最近的笔记,在这里也贴出来.再过两天就该走了.比较期待在北京的日子.
Spark-Shell常用
启动:
./bin/spark-shell
./bin/spark-shell --master
./bin/spark-shell --master local[2] //使用2个CPU核运行
./bin/spark-shell --master local[2] --jar testcode.jar
//指定Jar包路径,可以用逗号分割,添加多个包
[会自动创建一个SparkContext对象(sc)]
加载文件:
创建sc后,可以加载本地文件创建RDD,返回一个MapPartitionRDD
val textFile=sc.textFile("file:///home/hadoop/read.txt")
[hdfs://hadoop:9000/datas/]
Transformation操作:
textFile.first()
textFile.count()
val textRDD=textRDD.filter(line=>line.contains("spark"))
textFile.filter(line=>line.contatins("spark")).count()
textFile.filter(line=>line.split(" ").size).reduce((a,b)=>if(a>b)a else b)
[词频统计]
val wordcount=textFile.flatMap(line=>line.split(" ")).map(word=>(word,1)).reduceByKey((x,y)=>x+y)
wordcount.collect()
[升级版]
val wordcount=textFile.flatMap(_.split(" ")).map(_.1).reduceByKey(_+_).map(m=>(m._2,M._1)).sortByKey(false).map(m=>(m._2,m._1))
[sortByKey 按key进行排序,false为降序]
wordcount.savaAsTextFile("hdfs://hadoop:9000/out/wc.txt")
[保存结果,支持将结果缓存在内存中]
textFile.cache() //缓存
[spark版的wordcount]
package sparkDemo1
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by yxy on 2017/2/1 0001.
*/
object wordcount {
def main(args: Array[String]) {
val conf=new SparkConf().setAppName("wordcount").setMaster("local")
val sc=new SparkContext(conf)
val data=sc.textFile("file:///home/yxy/datas/read.md")
val words=data.flatMap(_.split(" "))
.map(word=>(word,1))
.reduceByKey(_+_)
.saveAsTextFile("hdfs://hadoop:9000/out/data/word.txt")
}
}
spark部署模式
本地模式:
standalone独立模式:spark自己管理集群资源.只需要 HDFS启动
**YRAN模式:**spark自己不管理资源,而是向yarn申请.
IDEA中生成Jar包,使用IDEA编译class文件,同时将class打包成Jar文件。
1.File——Project Structure,弹性“Project Structure”的设置对话框
2.选择左边的Artifacts,点击上方的“+”按钮
3.在弹出的对话框中选择“Jar”——“from moduls with dependencies”
4.选择要启动的类,然后确定
5.应用之后选择菜单“Build”——“Build Artifacts”,选择“Build”或“Rebuild”即可生成
RDD弹性分布式数据集
RDD是spark提供的核心抽象.(resillient distributed dataset)即弹性分布式数据集.
RDD在抽象上来说是一种元素集合.包含了数据.它是被分区的,每个分区分布在集群的不同节点上,从而让RDD中的数据可以被并行操作.
RDD最重要的特性是提供了不错的容错性.可以自动从节点失败中恢复过来.
RDD的数据默认是存放在内存中的,但内存资源不足时候,也会自动将RDD写入磁盘.
一个RDD对象包含如下5个核心特性:
一个分区列表:每个分区里是RDD的一部分数据
一个计算函数,用于计算RDD各分区的值
一个依赖列表,存储依赖它的其他RDD
一个分区器(可选),用于键值类型的RDD
一个计算各分区时优先的位置列表(可选)
创建RDD
初始化RDD,该RDD通常也包含了输入的源数据,创建了初始RDD后,才可进行接下来的操作.
三种创建方式:
使用程序中的集合创建RDD
使用本地文件创建RDD或者HDFS文件创建RDD
RDD通过其他算子形成新的RDD使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造测试数据,来测试后面的Spark应用的流程。
使用本地文件创建RDD,主要用于临时性地处理一些存储了大量数据的文件。
使用HDFS文件创建RDD,应该是最常用的生产环境处理方式,主要可以针对HDFS上存储的大数据,进行离线批处理操作
使用集合创建RDD
[parallelize]
import org.apache.spark.{SparkContext, SparkConf}
/**
* Created by yxy on 2017/2/1 0001.
*/
object creatDemos {
def main(args: Array[String]) {
val arr=Array(1,2,3,4,5,6)
val conf=new SparkConf().setAppName("ceshi").setMaster("local")
val sc=new SparkContext(conf)
val rdd=sc.parallelize(arr)
rdd.map(m=>{
m+2
})
.foreach(println(_))
}
}
使用文件创建RDD
Spark是支持使用任何Hadoop支持的存储系统上的文件创建RDD的,比如说HDFS、Cassandra、HBase以及本地文件。
通过调用SparkContext的textFile()方法,可以针对本地文件或HDFS文件创建RDD。
有几个事项是需要注意的:
如果是针对本地文件的话,如果是在windows上本地测试,windows上有一份文件即可;如果是在spark集群上针对linux本地文件,那么需要将文件拷贝到所有worker节点上。
Spark的textFile()方法支持针对目录、压缩文件以及通配符进行RDD创建。
Spark默认会为hdfs文件的每一个block创建一个partition,但是也可以通过textFile()的第二个参数手动设置分区数量,只能比block数量多,不能比block数量少。
文件字数统计
val rdd = sc.textFile("data.txt")
val wordCount = rdd.map(line => line.length).reduce(_ + _)
Spark的textFile()除了可以针对上述几种普通的文件创建RDD之外,还有一些特列
的方法来创建RDD:
SparkContext.wholeTextFiles()方法,可以针对一个目录中的大量小文件,返回
map
将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD
filter
对RDD中每个元素进行判断,如果返回true则保留,返回false则剔除。
flatMap
与map类似,但是对每个元素都可以返回一个或多个新元素。
gropuByKey
根据key进行分组,每个key对应一个Iterable<value>
reduceByKey
对每个key对应的value进行reduce操作。
sortByKey
对每个key对应的value进行排序操作。
join
对两个包含<key,value>对的RDD进行join操作,每个key join上的pair,都会传入自定义函数进行处理。
cogroup
同join,但是是每个key对应的Iterable<value>都会传入自定义函数进行处理。
常用action算子
reduce
将RDD中的所有元素进行聚合操作。第一个和第二个元素聚合,值与第三个元素聚合,值与第四个元素聚合,以此类推。
collect 将RDD中所有元素获取到本地客户端。
count 获取RDD元素总数。
take(n) 获取RDD中前n个元素。
saveAsTextFile 将RDD元素保存到文件中,对每个元素调用toString方法
countByKey 对每个key对应的值进行count计数。
foreach 遍历RDD中的每个元素。