spark-shell
spark自带的交互式工具
val rdd1 = sc.parallelize(1 to 10)
rdd1.collect
//res0: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
rdd1.partitions.size
//res1: Int = 1
val rdd2 = sc.makeRDD(5 to 15)
rdd2.collect
//res4: Array[Int] = Array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
rdd1 ++ rdd2
res6.collect
//res8: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, 10, 11, 1 2, 13, 14, 15)
rdd1.canEqual(rdd2)
//res9: Boolean = false
rdd1.cartesian(rdd2)
//res10: org.apache.spark.rdd.RDD[(Int, Int)] = CartesianRDD[3] at cartesian at <c onsole>:28
rddWordCount
vavl rddWorCount = sc.parallelize(Array("hello world","hello java","hello scala","scala very good"))
rddWordCount.flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey(_+_).collect
rddWordCount.flatMap(x=>x.split(" ")).map(x=>(x,1)).groupByKey().map(x=>x._1,x._2.size).collect
rddWordCount.getNumPartitions
spark架构设计
1、运行架构
在驱动程序中,通过SparkContext主导应用的执行
SparkContext可以连接不同类型的Cluster Manager(Standalone、YARN、Mesos),连接后,获得集群节点上的Executor
一个Worker节点默认一个Executor,可通过SPARK_WORKER_INSTANCES调整
每个应用获取自己的Executor
每个Task处理一个RDD分区
2、spark架构核心组件
使用idea初始化spark运行环境
1、创建maven项目,添加依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.12</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
2、SparkContext
连接Driver与Spark Cluster(Workers)
Spark的主入口
每个JVM仅能有一个活跃的SparkContext
SparkContext.getOrCreate
val conf = new SparkConf().setMaster("local[*]").setAppName("SparkDemo")
val sc = SparkContext.getOrCreate(conf)
3、SparkSession
Spark 2.0+应用程序的主入口:包含了SparkContext、SQLContext、HiveContext以及StreamingContext
SparkSession.getOrCreate
val spark:SparkSession = SparkSession.builder().master("local[*]").appName("sparkSessionDemo").getOrCreate()
println(spark)
4、使用spark实现wordcount
//内存中创建
val wordCount = sc.parallelize(Array("hello world","hello java","hello scala","scala very good"))
wordCount.flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey(_+_).collect.foreach(println)
//sc读取hdfs上的文件
val wordCountHdfs = sc.textFile("hdfs://192.168.232.211:9000/kb11file/hello.txt")
wordCountHdfs.collect.foreach(println)
//sc读取本地文件
val wordCount1 = sc.textFile("D:\\kb11\\sparkstu\\hello")
wordCount.collect.foreach(println)
5、使用spark-shell来读取文件
//读取本地文件
sc.textFile("file:///root/hello.txt").collect.foreach(println)
//读取hdfs文件
sc.textFile("hdfs://hadoop100:9000/kb11file/hello.txt").collect.foreach(println)
Spark RDD
RDD
Spark核心,主要数据抽象
Dataset
从Spark1.6开始引入的新的抽象,特定领域对象中的强类型集合,它可以使用函数或者相关操作并行地进行转换等操作
DataFrame
DataFrame是特殊的Dataset
Spark RDD概念-1
简单的解释
RDD是将数据项拆分为多个分区的集合,存储在集群的工作节点上的内存和磁盘中,并执行正确的操作
复杂的解释
RDD是用于数据转换的接口
RDD指向了存储在HDFS、Cassandra、HBase等、或缓存(内存、内存+磁盘、仅磁盘等),或在故障或缓存收回时重新计算其他RDD分区中的数据
Spark RDD概念-2
RDD是弹性分布式数据集(Resilient Distributed Datasets)
分布式数据集
RDD是只读的、分区记录的集合,每个分区分布在集群的不同节点上
RDD并不存储真正的数据,只是对数据和操作的描述
弹性
RDD默认存放在内存中,当内存不足,Spark自动将RDD写入磁盘
容错性
根据数据血统,可以自动从节点失败中恢复分区
RDD与DAG
两者是Spark提供的核心抽象
DAG(有向无环图)反映了RDD之间的依赖关系
RDD的特性
一系列的分区(分片)信息,每个任务处理一个分区
每个分区上都有compute函数,计算该分区中的数据
RDD之间有一系列的依赖
分区器决定数据(key-value)分配至哪个分区
优先位置列表,将计算任务分派到其所在处理数据块的存储位置