spark--Spark-On-Hive-★★★★★

引入

  • 之前学习的Hive可以用来构建数据仓库/使用sql用来替代mr代码来进行数据分析
  • 也就是说之前的Hive有两个功能:
    • 1.构建数仓,管理元数据(表,字段,类型…)
    • 2.使用sql分析数据

注意

  • 注意1:
    • HiveSQL底层执行的还是MR,效率很低,所以出现了很多替代技术,如使用Tez作为HiveSQL的底层执行引擎
    • CDH推出的Impala… (Tez现在在国内用的不多 新版Hive中默认用的Tez不用mr了)
  • MR这辈子都不会写了, 除非你做教育,教别人入个门
  • 注意2:
    • Spark诞生之后,因为Spark执行速度快,所以就有人开发了一个Shark项目,用来将Hive的执行引擎换成Spark执行引擎,也就是Hive-On-Spark
    • 但是该项目维护较为困难, 因为考虑Hive本身的很多东西,如语法解析/执行计划…
    • 也就是和Hive太耦合了, 所以逐渐也就没人用了
  • 注意3:
    • 那么Spark-On-Hive又是啥?
    • 在Spark1.0的时候,Spark官方就不再考虑Shark了,而是自己独立开发一一套SparkSQL, 有自己的语法解析/执行计划/执行引擎…甚至包括有自己的元数据管理
    • 也就是说SparkSQL的野心很大,想占领SQL分析市场,干掉Hive–全栈处理…
  • 注意4:
    • Hive本身发展很成熟, 公司中很多项目都是使用Hive来构建的,特别是元数据管理这块,之前都是用Hive
    • 而执行引擎经历了从MR–>Tez–>Impala…Spark…
    • 也就是说Hive虽然原本的执行慢但是换执行引擎啊!,所以Hive的元数据管理功能一直都在被使用,特别是数据仓库项目中

Spark-On-Hive的原理到底是什么?

在这里插入图片描述

整合步骤

准备配置文件

  • Spark-On-Hive需要知道HDFS和Hive的一些配置文件,所以需要把这些配置文件给Spark,也就是复制到Spark的conf中

  • Hive的MetaStore还需依赖MySQL,所以最好也把MySQL驱动给Spark/jars目录

  • 那么这样的话就可以使用spark/bin目录下的 spark-sql命令行并执行HiveSQL了

  • http://spark.apache.org/docs/latest/sql-data-sources-hive-tables.html
    在这里插入图片描述

  • 后续如果需要使用l命令行执行HiveSQL就可以按照这样做!

  • 那么如果要在idea中写代码使用HiveSQL呢?

  • 那么得在代码中提供这些配置文件即可
    在这里插入图片描述

开启MetaStore服务

1.得保证自己的hive-site.xml中有如下配置

vim /export/servers/hive/conf/hive-site.xml
<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/hive/warehouse</value>
</property>
<property>
  <name>hive.metastore.local</name>
  <value>false</value>
</property>
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://node-01:9083</value>         
</property>

2.后台启动hive的MetaStore服务

nohup /export/servers/hive-1.1.0-cdh5.14.0/bin/hive --service metastore 2>&1 >> /var/log.log &

3.过一会jps查看进程

在这里插入图片描述

  • 看到上图说明Hive的MetaStore服务就启动成功
  • 这样后就可以使用SparkSQL来访问

代码实现

package cn.hanjiaxiaozhi.sql

import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession

/**
 * Author hanjiaxiaozhi
 * Date 2020/7/25 11:49
 * Desc 演示Spark-On-Hive
 * 本质就是Spark访问Hive的MetaStore元数据
 * 然后执行HiveSQL,并使用Spark的语法解析和执行引擎
 * 也就是Spark-On-Hive仅仅使用Hive的MetaStore元数据和HDFS
 * 剩下的语法解析和执行引擎都是用Spark自己的
 */
object HiveSupport {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //1.创建Spark-On-Hive执行环境
    val spark: SparkSession = SparkSession.builder()
      .appName("sql")
      .master("local[*]")
      //.config("spark.sql.warehouse.dir", "hdfs://node01:8020/user/hive/warehouse")
      //.config("hive.metastore.uris", "thrift://node01:9083")
      //上面两个配置可以不用,因为resources下的配置文件会被自动加载,都有了
      .enableHiveSupport()//表示开启HiveSQL的语法兼容/支持
      .getOrCreate()

    val sc: SparkContext = spark.sparkContext
    sc.setLogLevel("WARN")

    //注意:如果hdfs权限不足添加如下代码,并在node01上执行 hadoop fs -chmod  777 /
    //System.setProperty("HADOOP_USER_NAME", "root")

    //2.编写HiveSQL,以前怎么写,现在就怎么写
    spark.sql("show tables").show()

    spark.sql("CREATE TABLE person6 (id int, name string, age int) row format delimited fields terminated by ' '")

    spark.sql("LOAD DATA LOCAL INPATH 'file:///D:/data/spark/person.txt' INTO TABLE person6")

    spark.sql("show tables").show()

    spark.sql("select * from person6").show()

  }
}

猜你喜欢

转载自blog.csdn.net/qq_46893497/article/details/113926644