上节课回顾

(1)kafka的基本架构和核心概念?

(2)kafka为什么快?

(3)为什么kafka的吞吐量比较高?

(4)同一个消息能否被多个消费组消费?

(5)不同的组对topic消费,offset概念

1.基本概念

(1)定义:Spark SQL is a Spark module for structured data processing.(它是结构化数据处理的spark模块)

(2)去IOE:阿里提出的概念,本意是在阿里的IT架构中去掉IBM小型机,Orcale数据库,EMC存储设备

(3)使用SQL的前提:schema(数据库对象的集合一个用户,一般对应一个schema 该用户的schema名等于用户名,在HIVE中就是表的结构)+ file(作用的文件)

2.SQL on Hadoop

(1)定义:就是SQL语句在Hadoop上执行

(2)HIVE:有点稳定性好,开源免费,缺点就是跑的慢。

(3)Impala:和HIVE共享metastore,速度快了,但非常吃内存,用CM安装,手动安装什么吃力。

(4)shark:Spark1.0之前的,底层就是Hive,跑在Spark上,用起来较为麻烦。

(5)Dril:schemafree,无关schema,可连接的东西很多,用起来较为方便。

(6)Phoenix:因为Hbase不支持SQL查询,之后shell或者api,但俩个都比较费劲,所以phoenix就是基于Hbase上的一个SQL引擎。

(7)Spark SQL:这是Spark里面嵌套了SQL。

(8)Hive on Sprk:这是在Hive里的,Spark做为执行引擎,底层是mapreduce,2.x之后是Tez,Spark SQL支持的东西比Hive on Spark要少,因为Hive出来的比较早。

3.Spark SQL优点

(1)Seamlessly mix SQL queries with Spark programs(能无缝的将Spark和SQL连接起来)

(2)速度快,开源免费。

4.Spark SQL架构图

windows spark 连接kafka_SQL

5.Spark操作Hive(环境搭建)

(1)将Hive的配置文件HIve-site.xml复制到spark的conf之下

(2)HIve操作SQL里面需要mysql驱动,Spark SQL则可以直接指定驱动文件

./spark-shell --master local[2] --jars /home/hadoop/software/mysqlqudong (记住一定要是jar包)

(3)./spark-sql --master local[2] --jars /sacaxxxx --driver-class-path /xjczxczxc   (这里有个坑,在sql启动的时候你的驱动,一定要在dirver这里也要加,但是shell不用)

(4)spark-sql中cache是eager的,不是core那样lazy的

(5)explain看SQL的执行计划

windows spark 连接kafka_spark_02

(6)SQL的优化,尽量先减少数据。大数据处理也是如此位次下压,无关的数据先干掉

6.IDEA与Spark SQL交互使用

(1)./start-thriftserver.sh --master local[2] --jars /home/hadoop/software/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar --driver-class-path /home/hadoop/software/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar

(2)./beeline -u jdbc:hive2://localhost:10000 -n hadoop

windows spark 连接kafka_sql_03

7.thriftserver和spark-sql或者spark-shell的区别?

(1)每次我们的shell或者sql启动都是一个application,每次启动都要重新申请资源,浪费资源但是thriftserver启动就之后就可一直放在那了。再工作中需要将他封装成一个作业,通过rest请求。。。。

import java.sql.DriverManager

/*
package SparkReview.SQL1

import java.sql.DriverManager

import com.mysql.jdbc.Driver

object SparkSQLClientApp {
  def main(args: Array[String]): Unit = {
    Class.forName("org.apache.hive.jdbc.HiveDriver")
    //Class.forName的作用,  因为在scala中的任何class或者object都是要装载在jvm虚拟机上用的
    //它就是起的这个作用返回一个类,  上面这行代码的就是返回HiveDriver类
    val conn=DriverManager.getConnection("jdbc:hive2://192.168.137.251:10000","hadoop","")
    val stmt=conn.prepareStatement("select * from dept")
    //由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。
    // 因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。所以不要使用Statement
    val rs=stmt.executeQuery() //执行这个PreparedStatement对象中的SQL语句,

    while (rs.next()){

      println(rs.getInt("deptno")+"  "+rs.getString("dname"))
    }
    rs.close()
    stmt.close()
    conn.close()

  }
}
*/
object SparkSQLClientApp{
  def main(args: Array[String]): Unit = {

    Class.forName("org.apache.hive.jdbc.HiveDriver")
    val cnon=DriverManager.getConnection("jdbc:hive2://192.168.137.251:10000","hadoop","")
    val stmt=cnon.prepareStatement("select * from dept")
    val rs=stmt.executeQuery()


    while (rs.next()){
      println(rs.getInt("deptno")+"  "+rs.getString("dname"))
//用JDBC从数据库中查询数据要用到结果集ResultSet,其中我们在获取结果的时候经常用到rs.next()方法来判断是否查询到了数据
    }

  }
}

8.作业

(1)使用自己的代码来启动thriftserver,这个代码就相当于提供一个微服务。然后客户端随便发一个请求过去,就可以把sql结果拿过来。在页面上自己展示