1.大数据的四大特征(4V):海量的数据规模,快速的数据流动和动态的数据体系,多样的数据类型,巨大的数据价值
2.RDD与DataFrame区别:RDD是一个抽象数据集,DataFrame则相当于一个二维表,带有schema元数据信息,更便于上层应用分析
3.DataFrame和DataSet的区别:每个DataSet有一个被称为DataFrame的类型化视图,它只有在执行action操作时才触发计算
4.DataSet与RDD的区别:DataSet是特定域的对象集合,RDD是任意对象的集合
5.当遇到Task not serializable,一般因为map、filter等的参数使用了外部的变量,而该变量不能序列化,特别是当引用了某个类成员函数或者变量时。
解决方案:
1)对类中不需要序列化的部分用transient修饰
2)将引用的类序列化
3)将需要序列化的变量用更小的class保存,并让该class序列化
4)将该变量在map或者filter中定义
6.Spark SQL再学习:
具有如下特征:
1)HQL方面重用Hive中HQL的解析、逻辑执行计划翻译、执行计划优化等逻辑,可以近似认为是把物理执行计划从MR作业变为了Spark作业
2)依赖Hive Metastore和Hive SerDe(兼容各种Hive存储格式)
3)支持对原生RDD的关系查询
功能模块:
1) core处理数据的输入输出,从不同数据源获取数据(RDD,Parquet,Json),将查询结果输出成schemaRDD
2) catalyst考虑查询语句的整个处理过程,包括解析,绑定,优化,物理计划等,优化器实际上是查询引擎
3) hive
4) hive-ThriftServer提供CLI和JDBC/ODBC
其中catalyst的实现组件:
1) sqlParse:完成sql语句的语法解析功能,解析成Tree
2) Analyzer:主要完成绑定工作,将不同来源的Unresolved LogicalPlan和数据元数据(如hive metastore、Schema catalog)进行绑定,生成resolved LogicalPlan,使用Analysis Rules
3) Optimizer:对resolved LogicalPlan进行优化,生成Optimizer LogicalPlan,使用Optimization Rules,对resolved LogicalPlan进行合并,列裁剪,过滤器下推等优化操作转换为Optimizer LogicalPlan
4) Planner:将LogicalPlan转换成PhysicalPlan,使用Planning Strategies
5) Cost Model:根据过去的性能统计数据,选择最佳的物理执行计划
各组件的实现细节:http://www.aboutyun.com/thread-20910-1-1.html
完整的SQL执行流程:
sql or hql -> sqlparser(parse)生成 unresolved logical plan-> analyzer(analysis)生成analyzed logicalplan -> optimizer(optimize)optimized logical plan -> sparkplanner(use strategies to plan)生成physical plan -> 采用不同Strategies生成spark plan -> sparkplan(prepare) prepared spark plan -> call toRDD(execute()函数调用)执行sql生成RDD
hiveContext.sql()的执行过程:
1)判断其语法设置,如果dialect =="sql"则采用sqlContext的sql语法执行过程;如果是dialect == "hiveql",则采用hiveql语法执行过程
2)如果判断语法设置为hiveql,则
1.SQL语句经过HiveQl.parseSql解析成Unresolved LogicalPlan,在这个解析过程中对hiveql语句使用getAst()获取AST树,然后再进行解析;
2. 使用analyzer结合数据hive源数据Metastore(新的catalog)进行绑定,生成resolved LogicalPlan;
3. 使用optimizer对resolved LogicalPlan进行优化,生成optimized LogicalPlan,优化前使用了ExtractPythonUdfs(catalog.PreInsertionCasts(catalog.CreateTables(analyzed)))进行预处理;
4. 使用hivePlanner将LogicalPlan转换成PhysicalPlan;
5. 使用prepareForExecution()将PhysicalPlan转换成可执行物理计划;
6. 使用execute()执行可执行物理计划;
7. 执行后,使用map(_.copy)将结果导入SchemaRDD。
DataFrame的使用方法分为:
1)直接执行相关算子,比如map,filter,groupBy等
2)转化为虚拟二维表,通过sql语句分析
7. RDD to DataFrame(RDD转换为DataFrame)
先创建一个类
case class Person(name: String, age: Int)
然后将Rdd转换成DataFrame
val people =sc.textFile("/usr/people.txt").map(_.split(",")).map(p=> Person(p(0), p(1).trim.toInt)).toDF()
8.利用HiveContext查询虚拟表
9.SparkStreaming再学习
sparkstreaming可以实时跟踪页面统计,训练机器学习模型或则自动检测异常等.
创建spark streamingcontext的步骤:
importorg.apache.spark.streaming._
valsc = ... // existing SparkContext
valssc = new StreamingContext(sc, Seconds(1)) //每隔1s封装一次RDD,提交一次Job
使用SparkStreaming Context的步骤:
1)指定输入源
2)准备好流计算指令
3)利用StreamingContext.start()方法接收和处理数据
4)处理过程一直持续,直到streamingContext.stop()
SparkStreaming支持一个高层的抽象,叫做离散流( discretized stream )或者DStream ,它代表连续的数据流。DStream既可以利用从Kafka, Flume和Kinesis等源获取的输入数据流创建,也可以在其他DStream的基础上通过高阶函数获得。在内部,DStream是由一系列RDDs组成。
所有的输入DStream都会绑定一个Receiver对象,用于接收数据源中的数据,并存储在Spark内存中,其中提供了三种内置的数据源支持:
1)基础数据源:StreamingContext中提供了对于文件,socket,Akka Actor的支持
2)高级数据源:诸如kafka,Flume,Kinesis,Twitter等数据源,数据源的支持需要引用其依赖
3)自定义数据源:用于决定如何接收和存储数据
如果想要在实时计算中并行接收多条数据流,可以创建多个输入DStream,这样就会创建多个Receiver,从而并行接收多个数据流,值得注意的是一旦Spark Streaming运行起来,这个节点的CPU Core便无法给其他应用使用
如果使用本地模式运行程序,至少使用local[2],能保证一条线程分配给Receiver接收数据,一条线程用于处理接收到的数据
Windows滑动窗口机制:
(1) 窗口长度(windowlength):即窗口的持续时间
(2) 滑动间隔(slidinginterval):窗口操作执行的时间间隔
这两个参数必须是原始DStream批处理时间间隔的整数倍
Spark Streaming之所以称为微批处理的原因:DStream(时间片划分,封装RDD)->多个Batch(RDD)->RDD执行Job的操作
指定的是封装RDD的时间间隔为5s,在5s期间任何添加到DStream中的数据都会被加入此RDD中,即Batch中直到时间间隔结束
DStreams提供两种类型的操作:
1)transformations:产生新的DStream
transformations又分为有状态和无状态,其中有状态transformation操作需要checkpointing,通过ssc.checkpoint(“hdfs://localhost:9000/usr”)
DStream的Operation包括:
a) transform(func):将旧RDD通过func转换成新的RDD
b) updateStateByKey(func)根据key更新状态
定义状态:此状态可以是任意数据类型
定义状态更新函数:更新状态
对每个word调用一次更新函数,newValues是最新值,runningCount是之前值
2)output operations:写数据到外部系统
checkpoint机制:推荐设置为batch duration的5~10倍
Spark Streaming对Kafka做数据接收的方案有两种:
1)Receiver-based Apporach:接收和处理分开,容易使得接收的节点崩溃
Receiver-based是基于kafka高级consumer API实现的。使用Receiver将从kafka接收到的数据存入spark executor中,然后由spark streaming