SparkSQL 实战笔记(2)---- SparkSQL 概述

##1. 为什么需要 SQL?

  1. 事实上的标准

    • 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

  1. 使用 SQL 语句对大数据进行统计分析,数据是在 Hadoop

  2. Apache Hive

    • SQL 转换成一系列可以在 Hadoop 上运行的 MapReduce/Tez/Spark 作业
    • SQL 到底底层是运行在哪种分布式引擎之上的,是可以通过一个参数来设置
    • 功能:
      • SQL:命令行、代码
      • 多语言 Apache Thrift 驱动
      • 自定义的 UDF 函数:按照标准接口实现,打包,加载到 Hive 中
      • 元数据
  3. Cloudera Impala

    • 使用了自己的执行守护进程集合,一般情况下这些进程是需要与 Hadoop DN 安装在一个节点上
    • 功能:
      • 92 SQL 支持
      • Hive 支持
      • 命令行、代码
      • 与 Hive 能够共享元数据
      • 性能方面是 Hive 要快速一些,基于内存
  4. Spark SQL

    • Spark 中的一个子模块,是不是仅仅只用 SQL 来处理呢?

      $ Hive:SQL ==> MapReduce
      
    • Spark:能不能直接把 SQL 运行在 Spark 引擎之上呢?

      1. SharkSQL==>Spark (不再维护)
        • 优点:快 与 Hive 能够兼容
        • 缺点:执行计划优化完全依赖于 Hive 进程 vs 线程
        • 使用:需要独立维护一个打了补丁的 Hive 源码分支
      2. Spark SQL: 这是 Spark 项目中的SQL子项目
  5. Hive on Spark : 这是Hive项目中的,通过切换 Hive 的执行引擎即可,底层添加了 Spark 执行引擎的支持

  6. Presto

    • 交互式查询引擎 SQL
    • 功能:
      • 共享元数据信息
      • 92 SQL 语法
      • 提供了一系列的连接器,Hive Cassandra...
  7. Drill

    1. HDFS、Hive、Spark SQL
    2. 支持多种后端存储,然后直接进行各种后端数据的处理
    3. 未来的趋势
  8. Phoenix

    1. HBase 的数据,是要基于 API 进行查询
    2. Phoenix 使用 SQL 来查询 HBase 中的数据
    3. 主要点:如果想查询的快的话,还是取决于 ROWKEY 的设计

3. Spark SQL 是什么

3.1 Spark SQL 概念

  1. Spark SQL is Apache Spark's module for working with structured data.

    • 误区一:Spark SQL 就是一个 SQL 处理框架
    1. 集成性:在 Spark 编程中无缝对接多种复杂的 SQL

    2. 统一的数据访问方式:以类似的方式访问多种不同的数据源,而且可以进行相关操作

      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)
      
    3. 兼容 Hive

      • allowing you to access existing Hive warehouses
      • 如果你想把 Hive 的作业迁移到 Spark SQL,这样的话,迁移成本就会低很多
    4. 标准的数据连接:提供标准的JDBC/ODBC连接方式到 Server 上

  2. Spark SQL 应用并不局限于 SQL

    1. 还支持 Hive、JSON、Parquet 文件的直接读取以及操作
    2. SQL 仅仅是 Spark SQL 中的一个功能而已
  3. 为什么要学习 Spark SQL

    1. SQL 带来的便利性
    2. Spark Core: RDD Scala/Java
      • 需要熟悉 Java、Scala 语言
    3. Spark SQL
      • Catalyst 为我们自动做了很多的优化工作
      • SQL(只要了解业务逻辑,然后使用 SQL 来实现)
      • DF/DS:面向 API 编程的,使用一些 Java/Scala

3.2 Spark SQL 架构

3.2.1 前端(FrontEnd)

  1. Hive AST : SQL 语句(字符串)==> 抽象语法树

  2. Spark Program : DF/DS API

  3. Streaming SQL

  4. Catalyst

    • Unresolved LogicPlan
    select empno, ename from emp
    
  5. Schema Catalog 和 MetaStore

  6. LogicPlan

  7. Optimized LogicPlan

    select * from (select ... from xxx limit 10) limit 5;
    将我们的SQL作用上很多内置的Rule,使得我们拿到的逻辑执行计划是比较好的
    

    Physical Plan

3.2.2 后端(Backend)

  1. spark-shell

    • 每个 Spark 应用程序(spark-shell)在不同目录下启动,其实在该目录下是有 metastore_db
    • 单独的
    • 如果你想 spark-shell 共享我们的元数据的话,肯定要指定元数据信息==> 后续讲 Spark SQL 整合 Hive 的时候讲解
    • spark.sql(sql 语句)
  2. 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;
    
    • 优化的过程中,可以把一些条件过滤前置
  3. spark-shell 启动流程分析

    • REPL: Read-Eval-Print Loop 读取-求值-输出

    • 提供给用户即时交互一个命令窗口

      case \$变量名 in
      模式 1
      command1
      ;;
      模式 2
      command2
      ;;
      \*)
      default
      ;;
      esac
      
    • spark-shell 底层调用的是 spark-submit

    • spark-submit 底层调用的是 spark-class

  4. 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