SparkSQL与Hive的整合

文章目录

      • SparkSQL与Hive的整合
        • 1.1. Spark On Hive
          • 1.1.1. Hive的准备工作
          • 1.1.2. Spark的准备工作
          • 1.1.3. Spark代码开发
          • 1.1.4. Spark On Hive案例
        • 1.2. Hive On Spark
        • 1.3. SparkSQL命令行
        • 1.4. SparkSQL分布式查询引擎
          • 1.4.1. 开启ThriftServer服务
          • 1.4.2. beeline连接ThriftServer
          • 1.4.3. 代码连接
          • 1.4.4. 任务查看

SparkSQL与Hive的整合

1.1. Spark On Hive

SparkSQL其实就是一个Spark框架下的执行引擎,可以对结构化的数据使用SQL的方式,将SQL翻译成为SparkCore的代码去完成计算。SparkSQL支持不同的数据源,可以读取各种数据文件的数据、可以通过JDBC读取MySQL的数据,在实际开发过程中,有时候我们需要使用SparkSQL去处理Hive中的数据。这就是SparkSQL与Hive的整合方式之一:Spark On Hive

其实Spark只是一个计算引擎,本身是没有元数据管理的功能的。而我们在前面使用到的无论是DSL风格的处理方式,还是SQL风格的处理方式,所谓的“元数据”、“表”,其实都是向DataFrame注册的。DataFrame中记录了“表”、“字段”、“类型”等信息,就可以将SQL语句解析成为Spark程序来运行了。

但是Hive不同,Hive本身就是有一个元数据库(MetaStore)的,因此我们需要使用SparkSQL处理Hive的数据的时候,无需再注册表、注册字段等信息,直接从Hive的元数据库(MetaStore)中获取元数据即可。

1.1.1. Hive的准备工作
  1. 配置Hive的元数据服务:修改hive的配置文件 hive-site.xml

    <!-- 配置Hive的MetaStore服务,使用thrift协议,设置好主机名和端口号 -->
    <property><name>hive.metastore.uris</name><value>thrift://qianfeng01:9083</value>
    </property>
    
  2. 启动Hive的元数据服务

    # 开启Hive的metastore服务
    # 这种方式开启的服务是一个前台进程,不方便使用
    hive --service metastore# 开启Hive的metastore服务,并设置为后台进程
    # 这种方式开启的元数据服务是后台进程,方便交互了,但是不方便查看日志,并且随着session的退出,服务会中断
    hive --service metastore &# 启动后台进程,将日志输出到指定位置
    nohup hive --service metastore > /var/log/metastore.log 2>&1 &
    
1.1.2. Spark的准备工作
  1. 在spark的conf目录下,创建hive-site.xml文件,存放连接到hive的配置信息

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value></property><property><name>hive.metastore.uris</name><value>thrift://qianfeng01:9083</value></property>
    </configuration>
    

    Spark程序在运行的时候,相关的配置信息的加载次序:

    • 首先加载conf目录下的配置文件。
    • 再加载代码中进行的配置。

    其实只需要让SparkSQL程序知道metastore服务在哪里就可以了,如果不配置上面的这个文件也可以,不过就需要在代码中配置了。为了避免每一次在写程序的时候,都在代码里面去配置,简单起见,就直接创建这个文件,将连接到Hive元数据服务的配置都放进去。这样每次Spark程序在启动的时候,都可以自动的加载到。

  2. 准备MySQL的驱动包

    因为Hive的元数据保存到了MySQL数据库,Spark SQL程序如果需要访问的话,肯定需要从MySQL数据库中读取元数据信息。此时就必须要这个jar包了。

    将准备好的mysql-connector-java-8.0.26.jar文件存放到spark的jars目录下。

    注意:

    • 如果需要运行本地模式,那么本地的Spark的jars目录下需要存放有这个jar包。
    • 如果需要运行集群模式,那么集群中的Spark的jars目录下需要存放有这个jar包。
1.1.3. Spark代码开发
# @Author   : 千锋大数据教研院
# @Company  : 北京千锋互联科技有限公司from pyspark.sql import SparkSession# 这里的 .enableHiveSupport() 表示的就是打开Hive支持,此时就可以访问到Hive的数据了。
# 注意:
# 如果没有在spark的conf目录下面创建hive-site.xml并正确的设置hive的元数据服务
# 那么在创建SparkSession对象的时候,就必须要设置hive的元数据服务信息
# .config("spark.sql.warehouse.dir", "hdfs://qianfeng01:9820/user/hive/warehouse")
# .config("hive.metastore.uris", "thrift://qianfeng01:9083")
spark = SparkSession.builder\.master("local[*]")\.appName("hive-enable")\.enableHiveSupport()\.getOrCreate()# spark.sql("select * from mydb.emp").show()
spark.sql("select * from mydb.emp join mydb.dept on mydb.emp.deptno = mydb.dept.deptno;").show()spark.stop()
1.1.4. Spark On Hive案例

基本的Spark On Hive的程序就编写完成了。我们也可以结合之前的内容,整合其他的数据源与Hive配合使用

在Hive中有一张表,存储了用户的名字与身份证号。读取这个表中的数据,通过身份证号解析出生日、性别、年龄等信息,并将结果保存到Hive中。

"""
需求: 从 Hive 的mydb.users表中通过身份证号,解析出用户的生日、年龄、性别信息,并将结果存入到一个新的表中
res:usernameidcardphonebirthdayagegender
create table if not exists mydb.res(username string,idcard string,phone string,birthday string,age string,gender string
)
row format delimited
fields terminated by ','
"""import os
import re
import datetime
from pyspark.sql import SparkSession
from pyspark.sql.types import MapType, StringTypeos.environ.setdefault("HADOOP_USER_NAME", "root")def calculate_age(year, month, day) -> int:now = datetime.datetime.now()age = now.year - yearif now.month < month:age -= 1elif now.month == month and now.day < day:age -= 1return agedef parse_idcard(idcard: str) -> dict:# 1. 验证身份证号码是否合法m = re.fullmatch(r'(\d{6})'r'(?P<year>(19|20)\d{2})'r'(?P<month>0[1-9]|1[0-2])'r'(?P<day>[012][0-9]|10|20|30|31)'r'\d{2}'r'(?P<gender>\d)'r'[0-9xX]', idcard)if m is None:return {}# 2. 解析每一部分year = m.group('year')month = m.group('month')day = m.group('day')age = calculate_age(int(year), int(month), int(day))gender = '男' if int(m.group('gender')) % 2 != 0 else '女'birthday = '-'.join([year, month, day])return {"birthday": birthday, "age": age, "gender": gender}with SparkSession.builder.master("local[*]").appName("exercise").enableHiveSupport().getOrCreate() as spark:# 注册 UDF 函数spark.udf.register("parse_idcard", parse_idcard, MapType(StringType(), StringType()))# 查询数据res = spark.sql("""selectusername, idcard,phone,parse_idcard(idcard)['birthday'] as birthday,parse_idcard(idcard)['age'] as age,parse_idcard(idcard)['gender'] as genderfrom   mydb.users""")# 将查询结果写出到 Hive 指定的表中,这个表需要提前存在res.write.insertInto("mydb.res")
1.2. Hive On Spark

其实Hive On Spark的意思就是,将Hive的底层计算引擎替换成Spark!Hive默认的计算引擎是MapReduce,而这个是可以替换的。只需要使用set hive.execution.engine=spark即可完成替换,同时需要指定Spark的Master。

# 使用Hive On Spark非常简单
# 只要用set hive.execution.engine命令设置Hive的执行引擎为spark即可
# 默认是mr
set hive.execution.engine=spark;
# 这里,是完全可以将其设置为Spark Master的URL地址的
set spark.master=spark://192.168.10.101:7077
# 注意上面这种配置是只适用于匹配的版本才可以,如果高版本的话现在是没有这种功能的,需要自行编译
# 参考官方文档:https://cwiki.apache.org//confluence/display/Hive/Hive+on+Spark:+Getting+Started

但是需要注意,HiveOnSpark并不是适合所有场景的,因为Spark是内存计算的计算引擎,需要消耗大量的内存资源,不利于其他程序的计算应用。因此需要使用Spark来处理Hive的数据的时候,SparkOnHive是一个比较常见的选择。

1.3. SparkSQL命令行

在Spark的bin目录下,有一个脚本文件spark-sql,这个脚本文件会启动一个命令交互界面,可以使得我们在命令行上直接使用Spark来操作Hive的数据。

在3.3.1.章节的部分,已经在spark的conf目录下面创建出来一个hive-site.xml文件,其中定义了hive的元数据相关的信息,这样我们就可以直接使用了。

image-20230214181016887

1.4. SparkSQL分布式查询引擎

在Spark中有一个服务是ThriftServer服务,通过这个服务,用户可以通过JDBC连接ThriftServer来访问SparkSQL的数据。连接后可以直接通过编写SQL语句访问SparkSQL的数据。在配置ThriftServer的时候,至少需要配置ThriftServer的主机名和端口号,如果需要使用Hive的数据的话,还需要再提供Hive的Metastore的URIs。

如果你前面已经配置完成了Spark On Hive,那么在你的Spark的conf目录下已经存在了一个文件:hive-site.xml,在这个文件中已经配置好了Hive的Metastore的URIs了。

1.4.1. 开启ThriftServer服务
$SPARK_HOME/bin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000\
--hiveconf hive.server2.thrift.bind.host=qianfeng01\
--master local[*]

这里的--master可以设置为local模式、Standalone模式或者YARN模式。

1.4.2. beeline连接ThriftServer

ThriftServer服务启动之后,默认件监听的是10000端口,我们可以使用一些客户端工具来连接到这个服务。例如beeline。

image-20230216144155303

1.4.3. 代码连接

如果需要需要使用ThriftServer连接到SparkSQL,进而操作Hive的数据的话,我们需要安装Hive的依赖。

pip3 install pyhive
# @Author   : 千锋大数据教研院
# @Company  : 北京千锋互联科技有限公司from pyhive import hive# 通过Spark ThriftServer,创建到Hive的连接对象,
conn = hive.Connection(host="qianfeng01", port=10000, username="root", database="mydb")
# 创建一个光标对象,用来操作hive
cursor = conn.cursor()with conn, cursor:# 执行SQL语句cursor.execute("select * from emp join dept on emp.deptno = dept.deptno")result = cursor.fetchall()for r in result:print(r)
1.4.4. 任务查看

ThriftServer提交到Spark的任务,我们可以通过http://192.168.10.101:4040/jobs/来查看到。

image-20230216145609484

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(持续更新)linux网络编程中需要注意的内核参数与网络机制

目录 零、基本说明 一、内核参数 二、相关机制 1、GRO &#xff08;1&#xff09;适用场景 &#xff08;2&#xff09;优缺点 &#xff08;3&#xff09;相关操作 2、Nagle 算法 &#xff08;1&#xff09;基本规则 &#xff08;2&#xff09;优缺点 &#xff08;3&…

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Matlab笔记---clear、clc、clear all应用

在MATLAB中&#xff0c;clear、clc 和 clear all 是三个常用的命令&#xff0c;它们各自有不同的作用&#xff1a; clc&#xff1a; clc 命令用于清除MATLAB命令窗口中的所有输出。它不会删除任何变量、函数或文件&#xff0c;只是清除屏幕上的显示内容&#xff0c;让你可以更…

Qt 一个简单的QChart 绘图

Qt 一个简单的QChart 绘图 先上程序运行结果图&#xff1a; “sample9_1QChart.h” 文件代码如下&#xff1a; #pragma once#include <QtWidgets/QMainWindow> #include "ui_sample9_1QChart.h"#include <QtCharts> //必须这么设置 QT_CHARTS_USE_NAME…

分布式事物XA、BASE、TCC、SAGA、AT

分布式事务——Seata 一、Seata的架构&#xff1a; 1、什么是Seata&#xff1a; 它是一款分布式事务解决方案。官网查看&#xff1a;Seata 2.执行过程 在分布式事务中&#xff0c;会有一个入口方法去调用各个微服务&#xff0c;每一个微服务都有一个分支事务&#xff0c;因…

MySQL为什么使用B+树来作索引

我来详细解释一下B树的结构和特点。 graph TDA[根节点 40|70] --> B[20|30]A --> C[50|60]A --> D[80|90]B --> E[10|15]B --> F[25|28]B --> G[35|38]C --> H[45|48]C --> I[55|58]C --> J[65|68]D --> K[75|78]D --> L[85|88]D --> M[9…

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…

以太网链路详情

文章目录 1、交换机1、常见的概念1、冲突域2、广播域3、以太网卡1、以太网卡帧 4、mac地址1、mac地址表示2、mac地址分类3、mac地址转换为二进制 2、交换机的工作原理1、mac地址表2、交换机三种数据帧处理行为3、为什么会泛洪4、转发5、丢弃 3、mac表怎么获得4、同网段数据通信…

Shell编程 脚本的运行方式与注释

目录 shell脚本的运行方式 1. 路径运行 2.bash或sh加脚本运行 ​编辑 3.source在加脚本路径运行 shell脚本注释 单行注释 多行注释 shell脚本的运行方式 我们在/usr/etc/demo01目录下新建了一个脚本 a.sh &#xff0c;脚本内容是要求输出数字1&#xff0c;怎么运行呢 1…

智算网络中Scale-out和Scale-up网络的技术原理

智算网络中Scale-out网络和Scale-up网络的本质区别是什么&#xff1f; 一、什么是智算中心的Scale-out网络和Scale-up网络 数据中心网络总体上可分为两大类&#xff1a;通算网络和智算网络。通算网络主要用于支持传统的计算任务和应用&#xff0c;如企业的IT系统、网站托管、电…

HCIA笔记7--OSPF协议入门

文章目录 0. 路由分类1. OSPF介绍1.1 概念1.2 报文类型 2. 邻接关系的建立2.1 邻居关系的建立2.2 邻接关系的形成2.3 ospf状态机 3. DR与BDR3.1 为什么要有DR和BDR&#xff1f;3.2 DR和BDR的选举原则 4. ospf的配置4.1 内部优先级 5. 问题5.1 三层环路如何解决&#xff1f; Ref…

mysql排序问题

mysql 建数据库时&#xff0c;需要指定 字符集 和 排序规则 建表时&#xff0c;也可以指定 也可以指定具体的字段 安照下面的sql顺序执行插入&#xff0c;它们的排序是什么样的&#xff1f; INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

vulhub复现CVE-2021-44228log4j漏洞

目录 一&#xff1a;漏洞概述 二&#xff1a;漏洞原理 三&#xff1a;漏洞利用 lookup功能&#xff1a; JNDI解析器&#xff1a; ldap服务&#xff1a; RMI&#xff1a; 四&#xff1a;漏洞复现 4.1靶场 4.2dnslog测试 4.3部署jndi-injection-exploit 4.4打开监听端口 4.5触发请…

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中&#xff0c;我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而&#xff0c;有时我们会遇到“IP地址获取失败”的困扰&#xff0c;这不仅阻碍了我们的网络访问&#xff0c;还可能带来一系列的网络连接问题。那么&#xff0c;IP地址获取…

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下&#xff1a; //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…

十一、容器化 vs 虚拟化-Docker

文章目录 前言一、Docker 介绍1. 简介2. 应用场景3. 特点4. Docker和虚拟机之间的区别5. 解决痛点1. 解决依赖兼容2. 解决操作系统环境差异3. 小结 二、Docker 架构三、工作流程五、Docker 核心组件及其工作机制1. Docker 客户端&#xff08;Docker Client&#xff09;2. Docke…

linux学习笔记01 基础命令

目录 创建 touch 创建文件 &#xff08;创建但是不打开&#xff09; vi / vim 创建文件 (创建一个文件并打开) mkdir 创建文件夹 切换目录 cd 查看 pwd 查看当前目录完整路径 ls 查看目录信息 dir 查看目录信息 ll 表示查看目标目录下的信息 ls -a 查看当前目录下的…

【深度学习】深刻理解多模态模型CLIP

CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09; 是由 OpenAI 提出的一个多模态模型&#xff0c;旨在学习视觉和语言的联合表示&#xff0c;能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行&#xff1b;当前是秒级时间戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者&#xff0c;我总喜欢翻看各种项目附带的论文&#xff0c;虽然大多时候是瞎研究&#xff0c;但却乐在其中。该项目能够完美保留公式、图表、目录和注释&#xff0c;对于需要阅读外文文献的…