百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

四十四、SparkSQL整合Hive (Spark on Hive)

wptr33 2024-12-20 19:04 27 浏览

SparkSQL设计的目的是让用户可以在Spark上面使用SQL语法处理结构数据,它支持丰富的数据源,可以是RDD, 也可以是外部的数据源(文件文件、json、csv、parquet、hive、hbase等)。SparkSQL的一个重要的分支就是Spark兼容Hive, 也就是在Spark中运用了Hive的元数据管理、HQL语法、UDFs、序列化与反序列化(SerDers)功能:

在这里会涉及到两个概念:Spark on HiveHive on Spark,那么这两者之间有什么区别呢?

一、理解Spark on Hive与Hive on Spark

  • 1.Spark on Hive

Hive在这里扮演的角色是存储角色,Spark负责sql的解析与优化,执行。具体可以理解为SparkSQL使用Hive语句操作Hive表,底层的计算引擎使用的是Spark RDD,具体的流程如下:

    • 通过SparkSQL,加载Hive的配置文件,获取到Hive的元数据信息(一般存储在MySQL或PostgreSQL等关系型数据库中, 建议不使用自带的derby数据库,因为Derby数据库不支持多用户同时访问)
    • 获取到Hive的元数据信息后可以拿到Hive表的数据;
    • 通过SparkSQL来操作Hive中的表;
  • 2.Hive on Spark

Hive在这里扮演的角色是既作为存储,同时还负责sql的解析与优化,Spark仅负责计算,即Spark的角色是执行引擎,一般通过几下配置:

    • 配置hvie-site.xml中的hive.execution.engine,默认为mapreduce, 即mr
<property>
    <name>hive.execution.engine</name>
    <value>spark</value>
    <description>
      Expects one of [mr, tez, spark].
      Chooses execution engine. Options are: mr (Map reduce, default), tez, spark. While MR
      remains the default engine for historical reasons, it is itself a historical engine
      and is deprecated in Hive 2 line. It may be removed without further warning.
    </description>
  </property>
    • 将spak所需要的所有依赖包拷贝到$HIVE_HOME/lib/下, 这种配置方法可能会因为依赖包的版本问题发生很多错误,处理起来比较麻烦,一般需要对Spark源码进行编译。

与Spark on Hive相比,这种实现比较麻烦,必须要重新编译Spark并导入Hive的相关依赖jar包。目前,主流的使用是Spark on Hive。下面就以Spark on Hive这种方式来讲解Spark与Hive的整合。


二、Spark整合Hive (Spark on Hive)流程

  • 1.元数据库MySQL的安装与配置
  • 2.MySQL中创建操作Hive元数据库的用户并授权

mysql> create user 'hive'@'%' identified by 'Love88me';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on hivedb.* to 'hive'@'%' identified by 'Love88me' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
  • 3.MySQL的JDBC驱动包

这里有两种方法:

    • 方法一:把MySQL的JDBC驱动包拷贝到$SPARK_HOME/jars目录下;
    • 方法二:启动spark-sql命令行时指定--driver-class-path指定MySQL的JDBC驱动包位置

这里,我选用了第一种方法

  • 4.配置hive-site.xml,并分发到Spark的配置目录下
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<configuration>
  <property>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://node04:3306/hivedb?createDatabaseIfNotExist=true&characterEncoding=utf-8&useSSL=false</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>hive</value>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>Love88me</value>
        </property>
</configuration>
  • 5.高可用的hdfs配置(根据实际情况)

如果hdfs是高可用的hdfs, 即有多个namenode的情况,有两种情况可以解决问题:

    • 方法一:需要将hdfs的core-site.xml和hdfs.xml放入Spark的conf目录;
    • 方法二:配置环境变量HADOOP_CONF_DIR指向$HADOOP_HOME/etc/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

这两种方法选择任一种即可, 此处我选择了第二种。


  • 6.启动spark-sql

在启动前,确保hadoop的集群与Spark的standalone集群已成功启动。然后启动spark-sql:

[hadoop@node01 spark]$ bin/spark-sql --master spark://node01:7077,node02:7077 --conf spark.sql.warehouse.dir=hdfs://mycluster/user/hive/warehouse  

注意:

在Spark2.0版本以后由于出现了SparkSession, 在运行spark-sql时,会设置默认的spark.sql.warehouse.dir=spark-warehouse, 此时将Hive与SparkSQL整合完成后,在通过spark-sql脚本启动的时候,就会在启动的目录下创建一个spark.sql.warehouse.dir指定的目录用来存放spark-sql创建数据库和创建数据表的信息,与之前hive的数据信息不存在同一路径下,也就是说由spark-sql中创建的库和表的信息在本地,不在HDFS上,这样不利于操作。所以,解决的方法如下:

在启动spark-sql的时候要加上一个参数:

--conf spark.sql.warehouse.dir=hdfs://mycluster/user/hive/warehouse

这样可以保证spark-sql启动时不再产生新的存放数据的目录,sparksql与hive最终使用的是hive统一存放在hdfs上存放数据的目录。


此时,查看MySQL数据库,可以看出元数据信息是已被创建:

7.常规操作

spark-sql> show databases; //查看有哪些数据库

spark-sql> create database mydb; //创建数据库

//创建表sanguo
spark-sql> create table sanguo
         > (id bigint, master string, member string, country string, power int, weapon string) 
         > row format delimited fields terminated by ',';
//导入本地sanguo.txt中的数据
1,刘备,关羽,蜀国,105,青龙偃月刀
2,刘备,张飞,蜀国,102,丈八蛇矛
3,刘备,赵云,蜀国,100,剑
4,刘备,马超,蜀国,99,霸王枪
5,刘备,黄忠,蜀国,98,弓箭
6,刘备,诸葛亮,蜀国,64,羽扇
7,曹操,张辽,魏国,95,刀
8,曹操,典韦,魏国,99,刀
9,曹操,郭嘉,魏国,64,""

spark-sql> load data local inpath '/home/hadoop/sanguo.txt' into table sanguo;

//查看数据
spark-sql> select * from sanguo;

后话

  • 元数据信息是保存在MySQL中,保存的是描述hive表的描述信息,比如database名称、表名,列的类型等元数据信息, 还保存了hdfs在什么位置;
  • hive存放的是业务数据,用来做离线分析的数据,是数据仓库;

相关推荐

[常用工具] git基础学习笔记_git工具有哪些

添加推送信息,-m=messagegitcommit-m“添加注释”查看状态...

centos7安装部署gitlab_centos7安装git服务器

一、Gitlab介1.1gitlab信息GitLab是利用RubyonRails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。...

太高效了!玩了这么久的Linux,居然不知道这7个终端快捷键

作为Linux用户,大家肯定在Linux终端下敲过无数的命令。有的命令很短,比如:ls、cd、pwd之类,这种命令大家毫无压力。但是,有些命令就比较长了,比如:...

提高开发速度还能保证质量的10个小窍门

养成坏习惯真是分分钟的事儿,而养成好习惯却很难。我发现,把那些对我有用的习惯写下来,能让我坚持住已经花心思养成的好习惯。...

版本管理最好用的工具,你懂多少?

版本控制(Revisioncontrol)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。...

Git回退到某个版本_git回退到某个版本详细步骤

在开发过程,有时会遇到合并代码或者合并主分支代码导致自己分支代码冲突等问题,这时我们需要回退到某个commit_id版本1,查看所有历史版本,获取git的某个历史版本id...

Kubernetes + Jenkins + Harbor 全景实战手册

Kubernetes+Jenkins+Harbor全景实战手册在现代企业级DevOps体系中,Kubernetes(K8s)、Jenkins和Harbor组成的CI/CD流水...

git常用命令整理_git常见命令

一、Git仓库完整迁移完整迁移,就是指,不仅将所有代码移植到新的仓库,而且要保留所有的commit记录1.随便找个文件夹,从原地址克隆一份裸版本库...

第三章:Git分支管理(多人协作基础)

3.1分支基本概念分支是Git最强大的功能之一,它允许你在主线之外创建独立的开发线路,互不干扰。理解分支的工作原理是掌握Git的关键。核心概念:HEAD:指向当前分支的指针...

云效Codeup怎么创建分支并进行分支管理

云效Codeup怎么创建分支并进行分支管理,分支是为了将修改记录分叉备份保存,不受其他分支的影响,所以在同一个代码库里可以同时进行多个修改。创建仓库时,会自动创建Master分支作为默认分支,后续...

git 如何删除本地和远程分支?_git怎么删除远程仓库

Git分支对于开发人员来说是一项强大的功能,但要维护干净的存储库,就需要知道如何删除过时的分支。本指南涵盖了您需要了解的有关本地和远程删除Git分支的所有信息。了解Git分支...

git 实现一份代码push到两个git地址上

一直以来想把自己的博客代码托管到github和coding上想一次更改一次push两个地址一起更新今天有空查资料实践了下本博客的github地址coding的git地址如果是Gi...

git操作:cherry-pick和rebase_git cherry-pick bad object

在编码中经常涉及到分支之间的代码同步问题,那就需要cherry-pick和rebase命令问题:如何将某个分支的多个commit合并到另一个分支,并在另一个分支只保留一个commit记录解答:假设有两...

模型文件硬塞进 Git,GitHub 直接打回原形:使用Git-LFS管理大文件

前言最近接手了一个计算机视觉项目代码是屎山就不说了,反正我也不看代码主要就是构建一下docker镜像,测试一下部署的兼容性这本来不难但是,国内服务器的网络环境实在是恶劣,需要配置各种镜像(dock...

防弹少年团田柾国《Euphoria》2周年 获世界实时趋势榜1位 恭喜呀

当天韩国时间凌晨3时左右,该曲在Twitter上以“2YearsWithEuphoria”的HashTag登上了世界趋势1位。在韩国推特实时趋势中,从上午开始到现在“Euphoria2岁”的Has...