SparkSQL 实战笔记(2)---- SparkSQL 概述
##1. 为什么需要 SQL?
-
事实上的标准
-
MySQL/Oracle/DB2... RBDMS 关系型数据库 是不是过时呢?
-
数据规模 大数据的处理
MR:Java Spark:Scala、Java、Python
-
直接使用 SQL 语句来对数据进行处理分析呢? 符合市场的需求
Hive SparkSQL Impala...
-
受众面大、容易上手、易学易用:
DDL DML
# access.log日志 1,zhangsan,10,beijing 2,lisi,11,shanghai 3,wangwu,12,shenzhen
-
table: Hive/Spark SQL/Impala
:共享元数据- name: access
- columns: id int,name string,age int,city string
SQL: select xxx from access where ... group by ... having....
-
2. SQL on Hadoop
-
使用 SQL 语句对大数据进行统计分析,数据是在 Hadoop
-
Apache Hive
- SQL 转换成一系列可以在 Hadoop 上运行的 MapReduce/Tez/Spark 作业
- SQL 到底底层是运行在哪种分布式引擎之上的,是可以通过一个参数来设置
- 功能:
- SQL:命令行、代码
- 多语言 Apache Thrift 驱动
- 自定义的 UDF 函数:按照标准接口实现,打包,加载到 Hive 中
- 元数据
-
Cloudera Impala
- 使用了自己的执行守护进程集合,一般情况下这些进程是需要与 Hadoop DN 安装在一个节点上
- 功能:
- 92 SQL 支持
- Hive 支持
- 命令行、代码
- 与 Hive 能够共享元数据
- 性能方面是 Hive 要快速一些,基于内存
-
Spark SQL
-
Spark 中的一个子模块,是不是仅仅只用 SQL 来处理呢?
$ Hive:SQL ==> MapReduce
-
Spark
:能不能直接把 SQL 运行在 Spark 引擎之上呢?Shark
:SQL==>Spark
(不再维护)- 优点:快 与 Hive 能够兼容
- 缺点:执行计划优化完全依赖于 Hive 进程 vs 线程
- 使用:需要独立维护一个打了补丁的 Hive 源码分支
Spark SQL
: 这是 Spark 项目中的SQL
子项目
-
-
Hive on Spark
: 这是Hive
项目中的,通过切换 Hive 的执行引擎即可,底层添加了 Spark 执行引擎的支持 -
Presto
- 交互式查询引擎 SQL
- 功能:
- 共享元数据信息
- 92 SQL 语法
- 提供了一系列的连接器,
Hive
Cassandra
...
-
Drill
- HDFS、Hive、Spark SQL
- 支持多种后端存储,然后直接进行各种后端数据的处理
- 未来的趋势
-
Phoenix
- HBase 的数据,是要基于 API 进行查询
- Phoenix 使用 SQL 来查询 HBase 中的数据
- 主要点:如果想查询的快的话,还是取决于 ROWKEY 的设计
3. Spark SQL 是什么
3.1 Spark SQL 概念
-
Spark SQL is Apache Spark's module for working with structured data.
- 误区一:Spark SQL 就是一个 SQL 处理框架
-
集成性:在 Spark 编程中无缝对接多种复杂的 SQL
-
统一的数据访问方式:以类似的方式访问多种不同的数据源,而且可以进行相关操作
spark.read.format("json").load(path) spark.read.format("text").load(path) spark.read.format("parquet").load(path) spark.read.format("json").option("...","...").load(path)
-
兼容 Hive
- allowing you to access existing Hive warehouses
- 如果你想把 Hive 的作业迁移到 Spark SQL,这样的话,迁移成本就会低很多
-
标准的数据连接:提供标准的
JDBC/ODBC
连接方式到 Server 上
-
Spark SQL 应用并不局限于 SQL
- 还支持 Hive、JSON、Parquet 文件的直接读取以及操作
- SQL 仅仅是 Spark SQL 中的一个功能而已
-
为什么要学习 Spark SQL
- SQL 带来的便利性
- Spark Core: RDD Scala/Java
- 需要熟悉 Java、Scala 语言
- Spark SQL
- Catalyst 为我们自动做了很多的优化工作
- SQL(只要了解业务逻辑,然后使用 SQL 来实现)
- DF/DS:面向 API 编程的,使用一些 Java/Scala
3.2 Spark SQL 架构
3.2.1 前端(FrontEnd)
-
Hive AST : SQL 语句(字符串)==> 抽象语法树
-
Spark Program : DF/DS API
-
Streaming SQL
-
Catalyst
- Unresolved LogicPlan
select empno, ename from emp
-
Schema Catalog 和 MetaStore
-
LogicPlan
-
Optimized LogicPlan
select * from (select ... from xxx limit 10) limit 5; 将我们的SQL作用上很多内置的Rule,使得我们拿到的逻辑执行计划是比较好的
Physical Plan
3.2.2 后端(Backend)
-
spark-shell
- 每个 Spark 应用程序(spark-shell)在不同目录下启动,其实在该目录下是有 metastore_db
- 单独的
- 如果你想 spark-shell 共享我们的元数据的话,肯定要指定元数据信息==> 后续讲 Spark SQL 整合 Hive 的时候讲解
spark.sql
(sql 语句)
-
spark-sql 的使用
spark-shell 你会发现如果要操作 SQL 相关的东西,要使用 spark.sql(sql 语句)explain extended select a.key\*(3+5), b.value from t a join t b on a.key = b.key and a.key > 3;
- 优化的过程中,可以把一些条件过滤前置
-
spark-shell 启动流程分析
-
REPL: Read-Eval-Print Loop 读取-求值-输出
-
提供给用户即时交互一个命令窗口
case \$变量名 in 模式 1 command1 ;; 模式 2 command2 ;; \*) default ;; esac
-
spark-shell 底层调用的是 spark-submit
-
spark-submit 底层调用的是 spark-class
-
-
spark-sql 执行流程分析
- spark-sql 底层调用的也是 spark-submit
- 因为 spark-sql 它就是一个 Spark 应用程序,和 spark-shell 一样
- 对于你想启动一个 Spark 应用程序,肯定要借助于 spark-submit 这脚本进行提交
- spark-sql 调用的类是
org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver
- spark-shell 调用的类是
org.apache.spark.repl.Main