如何通过Hive/tez与Hadoop的整合快速实现大数据开发

一、Hive的功能

Hive是基于Hadoop的一个外围数据仓库分析组件,可以把Hive理解为一个数据仓库,但这和传统的数据库是有差别的。

传统数据库是面向业务存储,比如 OA、ERP 等系统使用的数据库,而数据仓库是为分析数据而设计的。同时,数据仓库是在数据量巨大的情况下,为了进一步挖掘数据资源、为了企业决策需要而产生的,它不是所谓的 “大型数据库”。

Hive 通过将结构化的数据文件映射到一张数据库表上,然后通过执行 SQL 语句实现查询功能。它将 SQL 语句转换为 Hadoop 上的 MapReduce 任务提交运行,这种类 SQL 语言也称为 HQL,通过这种方法,就可以使不熟悉 MapReduce 程序的用户可以很方便地利用 SQL 语句实现大数据的查询、分析和汇总。

因此,可以将 Hive 理解为将 HQL 语句转换为 MR 的语言翻译器。它的数据分析是基于 MapReduce 的,而数据存储使用的是 HDFS。Hive 适合对离线数据(批数据)分析处理。

二、Hive 架构与应用场景

1、Hive架构

下图展示了Hive的运行和实现架构:

由图可知,Hive 主要由 Metastore、DB 和 Hiveserver2、Hive CLI 几部分组成。其中,Metastore 是 Hive 的核心,所有外围客户端比如 Beeline、Hue、Impala 最终都会连接到 Metastore,而 Metastore 再去访问 DB。

要访问 Hive,可以通过 Hive CLI(Command Line Interface)方式、程序连接方式 (JDBC/ODBC)、Web UI 方式进行。例如,你登录 Hadoop 外围机后,可以通过执行 hive 命令(hive CLI)去访问 Hive;如果你开发了一个程序,想让程序自动连接 Hive 实现查询分析,那么你就需要通过 Hiveserver2 方式连接到 Hive 上来;而如果你要给客户提供一个傻瓜式的查询平台,那么你就应该选择 Hue 这个 Web 查询工具。

由此可知,不同的应用需求,对 Hive 的访问方式也各不相同。下面我就来分别介绍下 Hive 中各个组件的功能及应用场景。


为了便于理解,我们将 Hive CLI、Beeline CLI、Hue、Impala 统称为 Hive 客户端

(1)MetaStore

MetaStore表示元数据存储,所谓的元数据就是Hive创建的数据库,表等信息,这些元数据可以存储在关系型数据库 Derby、MySQL 中。

可以把 MetaStore 理解为后端数据库的代理层,Hive 客户端连接到 MetaStore 后,MetaStore 再去连接后端 MySQL 数据库来存取元数据。这样,就可以有多个 Hive 客户端同时连接到 MetaStore,而且这些客户端不需要知道 MySQL 数据库的用户名和密码,它们只需要连接 MetaStore 服务即可。

MetaStore 服务实际上就是一种 Thrift 服务,通过它我们可以获取到 Hive 元数据,并且通过 Thrift 获取元数据的方式,屏蔽了数据库访问需要的驱动、URL、用户名、密码等细节。由此可知,通过 MetaStore 服务,实现了对访问数据库的统一认证和验权。

(2)HiveServer/HiveServer2

顾名思义,这是 Hive 上启动的一个服务,在早期的 Hive 版本中,启动的服务是 HiveServer。此服务启动后,Hive 客户端就可以通过 IP 加端口的方式对 Hive 进行访问,此服务主要用于远程客户端使用各种编程语言向 Hive 提交请求并查询结果的情况。远程客户端可以通过 jdbc、odbc 等开发接口访问 HiveServer 服务。

由此可知,HiveServer 是一种可选服务,当有程序需要连接 Hive 的时候,才需要它,这也是生产环境使用最多的一种方式。但 HiveServer 无法处理来自多个客户端的并发请求,因此,从 Hive 0.11.0 版本开始,HiveServer2 替代了 HiveServer。

HiveServer2 是 HiveServer1 的改进版,目前 1 已经被废弃,2 可以支持多客户端并发和身份认证。同时可以为开放的 API 客户端(如 JDBC 和 ODBC)提供更好的支持。

HiveServer2 服务是 Hive 推荐的使用模式,因为它更加安全并且不需要直接对用户使用的 HDFS、Metastore 进行赋权。

(3)Hive CLI

Hive CLI 表示命令行接口,也就是以命令行的形式输入 SQL 语句进行数据查询操作。例如,你直接登录到 Hive 所在的服务器,然后在命令行中执行 hive 命令,如下图所示:

这种使用模式是 Hive CLI,这种客户端模式是最古老的一种 Hive 访问模式,它将 SQL 在本地编译,然后直接访问 MetaStore,属于重客户端模式

目前,Hive CLI 已经被废弃,推荐使用 Beeline 模式。

(4)Beeline

Beeline 是一个新的 Hive CLI,它是一种基于 SQL 命令行的 JDBC 客户端,相比于 Hive CLI,它在安全性、稳定性、认证机制及界面使用上都有了很大提升。需要注意,使用 Beeline,需要依赖 Hiveserver2 服务,也就是 Hiveserver2 服务启动后,才能使用 Beeline 客户端。这从 Beeline 的运行流程上可以看出,Beeline 启动后,它首先会连接到 Hiveserver2 服务端口,接着再去请求 Metastore,而 Metastore 最后再去请求数据库,获取需要的元数据信息。

从 Hive 0.14 版本开始,Beeline 在通过 HiveServer2 工作时,会从 Hiveserver2 获取输出日志信息到标准错误输出(STDERR)。因此,我们在 beeline 命令行执行任务时,如果发生错误,会在屏幕输出错误信息。

Beeline 模式是将 SQL 提交到 Hiveserver2,然后由 Hiveserver2 负责编译,接着再去访问 Metastore,最后将分析任务提交到 Hadoop 上,相对于 Hive CLI,Beeline 是轻客户端模式。

2、Hive的应用场景

Hive 是目前企业使用最多的数据仓库工具,典型应用场景有日志数据分析、构建数据仓库及数据挖掘等。例如,要统计 App 应用一段时间的 PV、UV 数据,并将数据通过不同维度进行展示;又比如要统计一个气象数据,要求统计出来 2019 年全年排行前 10 的最高气温日期及具体的温度。这些都是 Hive 的专长,从这些应用场景中可以看出,这些需求都对时间没有特别要求,一般是按天、周、月、年来进行数据统计。这其实就是离线分析场景

此外,通过 Hive 还可以构建统一标准的数据仓库,从而提供基础数据,供上层应用进行更细化的数据分析。

三、Hive Metastore 三种运行模式

Metastore 作为访问元数据库的代理层,它有三种运行模式,即内嵌模式(Embedded)、本地模式(Local)及远程模式(Remote Server),每种模式对应不同的使用场景。

1. 内嵌模式

内嵌模式使用的是 Hive 内嵌的 Derby 数据库来存储元数据,它不需要额外启动 Metastore 服务。数据库和 Metastore 服务都嵌入在启动的 Hive 进程中。这个是默认的模式,配置简单,但一个 Hive 进程一次只能连接一个客户端。使用此模式,只需要下载 Hive 安装包,解压后在命令行中执行 hive 命令,启动即可使用。

如果另一个客户端也要使用 Hive 的话,只需解压安装包启动 hive 命令即可。由此可以看出,不同客户端、不同路径启动的 hive,每个 hive 进程都拥有自己的一套元数据,这些元数据无法共享。

内嵌模式只适用于实验环境,不适用于生产环境。

2、本地模式

本地模式不再使用内嵌的 Derby 作为元数据的存储介质,而是采用外部数据库来存储元数据。目前支持的外部数据库有 MySQL、PostgreSQL、Oracle 等,企业使用 MySQL 的比较多。

本地模式也不需要启动 Metastore 服务,当启动 Hive 服务后,Hive 进程里面会默认启动一个 Metastore 服务。如果我们采用的外部存储是 MySQL,那么 MySQL 可以和 Metastore 在一台机器上,也可以不在一台机器上。

Hive 在启动的时候会根据配置文件(hive-site.xml)中的 hive.metastore.uris 参数值来判断运行模式,如果没有配置此参数或者此参数为空,那么 Hive 将启动一个本地模式。

本地模式是一个多用户模式,多个客户端可以连接到同一个 MySQL 中,但每个客户端必须要有对 MySQL 的访问权限,也就是说每个连接到 Hive 的客户端都必须在 MySQL 库中进行授权。很显然,这种机制有很大问题,如果有几百个客户端需要连接到 Hive 的话,那么就要在 MySQL 中做几百个授权。此时,权限管理和数据安全都将面临极大考验。

这种模式可以作为公司内部测试、开发环境使用,不适用于生产环境。

3、远程模式

远程模式仍然是采用外部数据库来存储元数据,同时需要单独启动 Metastore 服务,并且 Metastore 服务和 Hive 服务是两个独立不同的进程。由于启动了 Metastore 服务,Hive 客户端只需要在 hive-site.xml 中配置 hive.metastore.uris 参数来指定 Metastore 服务所在机器的 IP 和端口,即可快速连接到后端的元数据库中,无需对客户端在数据库中进行授权操作。

在生产环境中,建议使用远程模式,它更加高效和安全。

Hive Metastore 的三种配置模式,其实也就是 Hive 的三种运行方式,你可以根据使用场景来决定使用哪种模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移动Web-动画

1、动画-animation 过渡&#xff1a;实现两个状态间的变化过程 动画&#xff1a;实现多个状态间的变化过程&#xff0c;动画过程可控&#xff08;重复播放、最终画面、是否暂停&#xff09; 1.1 实现步骤 1.1.1 定义动画 1.1.2 使用动画 <!DOCTYPE html> <html lang…

备战蓝桥杯---数据结构与STL应用(入门2)

话不多说&#xff0c;直接看题&#xff1a; 前4个操作我们可以用deque解决&#xff0c;第5个我们不用真的去反转&#xff0c;调换一下头尾即可。 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,k1,ee0; bool cm1(int a,int b){retur…

C++ 数论相关题目 博弈论:拆分-Nim游戏

给定 n 堆石子&#xff0c;两位玩家轮流操作&#xff0c;每次操作可以取走其中的一堆石子&#xff0c;然后放入两堆规模更小的石子&#xff08;新堆规模可以为 0 &#xff0c;且两个新堆的石子总数可以大于取走的那堆石子数&#xff09;&#xff0c;最后无法进行操作的人视为失…

网络安全从入门到精通(超详细)学习路线

首先看一下学网络安全有什么好处&#xff1a; 1、可以学习计算机方面的知识 在正式学习网络安全之前是一定要学习计算机基础知识的。只要把网络安全认真的学透了&#xff0c;那么计算机基础知识是没有任何问题的&#xff0c;操作系统、网络架构、网站容器、数据库、前端后端等…

GitCode|部分项目开源代码

1.EasyKeyboard 基于MFC的简单软键盘&#xff0c;使用vs2017开发 PangCoder / EasyKeyboard GitCode基于Windows平台的软键盘&#xff0c;使用VS2017开发&#xff0c;使用MFC框架https://gitcode.net/qq_36251561/easykeyboard 2.EncoderSimulator 基于WPF应用的编码器模拟工…

MySQL行格式原理深度解析

MySQL中的行格式&#xff08;Row Format&#xff09;是指存储在数据库表中的数据的物理格式。它决定了数据是如何在磁盘上存储的&#xff0c;以及如何在查询时被读取和解析的。MySQL支持多种行格式&#xff0c;每种格式都有其特定的优点和适用场景。 提升编程效率的利器: 解析…

正则表达式补充以及sed awk

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

Linux网络编程——网络套接字初识

文章目录 1. IP地址2. 端口号3. 初识TCP协议 && UDP协议4. 网络字节序5. socket创建API 1. IP地址 举个例子&#xff1a; 《西游记》中&#xff0c;唐僧要去取件&#xff0c;总是说从“东土大唐”来&#xff0c;前往“西天”拜佛求经&#xff0c;从哪里来&#xff0c;…

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符&#xff08;...&#xff09; 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中&#xff0c;深拷贝和浅拷贝是针对…

网络和Linux网络_15(IO多路转接)reactor编程_服务器+相关笔试题

目录 1. reactor的服务器 1.1 Sock.hpp 1.2 加协议分割报文 1.3 序列化和反序列化 Protocol.hpp main.cc Epoll.hpp TcpServer.hpp 2. 相关笔试题 答案及解析 本篇完。 1. reactor的服务器 Log.hpp和以前一样&#xff0c;因为下面要写ET模式所以Sock.hpp加了一个把…

【架构论文】SCALE: Secure and Scalable Cache Partitioning(2023 HOST)

SCALE: Secure and Scalable Cache Partitioning 摘要 LLC可以提高性能&#xff0c;但是会引入安全漏洞&#xff0c;缓存分配的可预测变化可以充当侧信道&#xff0c;提出了一种安全的缓存分配策略&#xff0c;保护缓存免受基于时间的侧信道攻击。SCALE使用随机性实现动态可扩…

【ArcGIS微课1000例】0098:查询河流流经过的格网

本实验讲述,ArcGIS中查询河流流经过的格网,如黄河流经过的格网、县城、乡镇、省份等。 文章目录 一、加载数据二、空间查询三、结果导出四、注意事项一、加载数据 加载实验配套数据0098.rar中的河流(黄河)和格网数据,如下图所示: 接下来,将查询河流流经过的格网有哪些并…

乔拓云教育系统:打造培训机构全面数字化转型新篇章

在当今数字化、信息化高速发展的时代&#xff0c;教育培训机构也需要与时俱进&#xff0c;借助先进的管理工具提升运营效率&#xff0c;优化学员学习体验。乔拓云教育系统正是这样一个全面、高效、一站式的解决方案&#xff0c;为教育培训机构提供强大的技术支持和全方位的服务…

微信扫码登录流程

微信官方文档使用 搜索“微信开放平台”点击导航栏的“资源中心”点击“网站应用”下的“微信登录功能”地址微信扫码登录是基于OAuth2的&#xff0c;所以需要第三方应用&#xff08;就是实现微信扫码登录的应用&#xff09;成为微信的客户端&#xff0c;获取AppId和AppSecret…

聊聊java中的Eureka和Nacos

本文主要来自于黑马课程中 1.提供者与消费者 在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0…

第九节HarmonyOS 常用基础组件20-Divider

1、描述 提供分割器组件&#xff0c;分割不同内容块或内容元素。 2、接口 Divider() 3、属性 名称 参数类型 描述 vertical boolean 使用水平分割线还是垂直分割线。 false&#xff1a;水平分割线 true&#xff1a;垂直分割线 color ResourceColor 分割线颜色 默认…

c++的发展史、缺省参数、命名空间你了解吗?

1.c的发展历史概述 1.1.什么是c C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机…

Java 面向对象进阶 01(黑马)

static案例代码&#xff1a; 代码&#xff1a; public class Student {private String gender;private String name;private int age;public static String teacherName ;public Student() {}public Student(String gender, String name, int age) {this.gender gender;this.…

图书管理系统(ArrayList和LinkedList)--versions3.0

目录 一、项目要求&#xff1a; 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0&#xff1a; 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次&#xff0c;点赞29次&#xff0c;收藏17次。本文使用…

Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal

经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本、Jest、Webpack 等等&#xff0c;而偶尔看到的调试相关的文章又全都是在写 inspect、launch.json 这些方案&#xff0c;其实有一定学习成本。 而其实在 VSCode 中早已内置了相当无脑的 Debug 方式&#xff0c;就…