百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

Hive架构及搭建方式

connygpt 2024-09-08 13:27 5 浏览

Hive架构及搭建方式

[TOC]

前言

本文档基于hive 3.1.2编写

hive的基础知识

基本架构

  • 整个hive由hiveserver2和hive 客户端组成
  • hive客户端有三种,beeline 、使用jdbc链接hiveserver、或使用hive CLI(这个已经过时,hive官方已经不推荐,推荐beeline)
  • hive server本身由hive server2和metastore组成
  • metastore是hive的元数据管理组件
  • hcatalog 架设在metastore上,暴露一组api,使得其它框架,比如Pig,FLink能够使用hive的元数据管理功能,从而以表视角去管理数据
  • webchat 是在hcatalog基础上暴露restful接口
  • hive 的实际数据存储在hadoop的hdfs中
  • hue提供一个图形化的方式,方便用户做基于sql的开发,当然还有其他附加功能metastore hive的数据本质上存储在hdfs中的。如何以表的视角看到数据,这就是metastore的功劳,它存储了表的schema信息、序列化信息、存储位置信息等

metastore本身由两部分组成

  • metastore server
  • metatore db

这个经典的架构,像任何一个单体java应用一样,server是应用本身,db来存储数据。但具体metastore整体的部署模式上,有三种

内嵌服务和数据库

metastore server和metastore DB同hive server部署在一起,以内嵌的方式部署 其中metastore DB是启动了一个内嵌的Derby数据库

内嵌服务

metastore server还是跟hive一起部署。 但metastore DB使用独立的Mysql来承接

服务和数据库单独部署

除了数据库独立部署之外,metastore service本身也独立部署

hcatalog

hcatalog 架设在metastore上,暴露一组api,使得其它框架,比如Pig,FLink能够使用hive的元数据管理功能,从而以表视角去管理数据

demo

hadoop distcp file:///file.dat hdfs://data/rawevents/20100819/data

hcat "alter table rawevents add partition (ds='20100819') location 'hdfs://data/rawevents/20100819/data'"

上述命令先将文件拷贝到hdfs,然后通过hcatalog,将这份数据做为表rawevents的一个新分区

客户端

客户端的本地模式

上述介绍的metastore的嵌入或remote部署,都是以hiveserver的视角来说的。hiveserver本身是独立的部署。但在hive客户端来说,可以通过remote模式,连接到已经部署好的remote server 。 还可以启动客户端的时候,顺带起一个本地的hive server和其对应的metastore。这一点一定要搞清楚

beeline

做为hive推荐的新一代客户端。他使用Thrift 远程调用。 beeline的本地模式

$HIVE_HOME/bin/hiveserver2 #先独立部署hiveserver
$HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT # 然后以host加port的形式跟hiveserver链接

beeline的本地模式

$HIVE_HOME/bin/beeline -u jdbc:hive2://  #就是不加host和port,该操作会在同一个进程启动hiveserver 和metastore,以及beeline 。 不建议这样使用,只做单元测试

本地和远程的区别,就是是否指定远程的Host和port。没有的话,就是本地模式

beeline的自动模式

每次通过beeline连接远端的hiveserver时,需要指定很长一段的jdbc url,很麻烦,如果我们想敲击beeline命令,直接就连接远端的hiveserver2,则可以在hive的配置文件目录添加beeline-site.xml配置文件,文件内容大致如下

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>beeline.hs2.jdbc.url.tcpUrl</name>
  <value>jdbc:hive2://localhost:10000/default;user=hive;password=hive</value>
</property>

<property>
  <name>beeline.hs2.jdbc.url.httpUrl</name>
  <value>jdbc:hive2://localhost:10000/default;user=hive;password=hive;transportMode=http;httpPath=cliservice</value>
</property>

<property>
  <name>beeline.hs2.jdbc.url.default</name>
  <value>tcpUrl</value>
</property>
</configuration>

其中配置了beeline连接的两种方式,和具体的jdbc连接字符串。一种使用tcp,一种使用http。默认是用tcp

jdbc

jdbc链接hive也有两种模式

  • For a remote server, the URL format is jdbc:hive2://<host>:<port>/<db>;initFile=<file> (default port for HiveServer2 is 10000).
  • For an embedded server, the URL format is jdbc:hive2:///;initFile=<file> (no host or port).

部署

一个hive的完整部署涉及五个组件,主要需要部署前三个

  1. metastore的部署
  2. hiveserver2的部署
  3. client的部署
  4. hcatalog server 的部署(非必须)
  5. webhcat server的部署(非必须)

其中1,2两部可以何在一起,即hiveserver2内嵌metastore, 只是将metastore的DB,外挂到Mysql。

具体到物理服务器上,上述三个组件,可以部署到三个不同机器上,当然hive client一般会在多个机器上。

三个组件对应的配置都可以是hive-site.xml,但配置内容不一定相同。比如hiveserver2需要配置,meta DB的连接信息,但client则不需要这些信息。

除了hive-site.xml之外,hive还支持在其它几个地方进行配置

  • 在启动命令时 通过--hiveconf参数,指定定制化的配置,如bin/hive --hiveconf hive.exec.scratchdir=/tmp/mydir
  • 在 hivemetastore-site.xml文件中指定,metastore相关的配置
  • 在hiveserver2-site.xml中指定,hiveserver2独享的配置。

以上这些路径和配置文件中拥有相同配置时,hive识别优先级如下,从左至右,依次升高 hive-site.xml -> hivemetastore-site.xml -> hiveserver2-site.xml -> '-hiveconf'

所以,最佳的配置策略是:

  1. 在hive-site.xml中配置,hiveserver2和hive client都共用的配置,这样方便该配置直接分发到多个机器
  2. 将metastore相关的配置放到 hivemetastore-site.xml 中。meta数据库相关配置,只在metaserver部署的机器上存在,不会四处分发数据库密码
  3. 将hiveserver2独有的配置放到hiveserver2-site.xml 中

部署hiveserver2

以下配置,采用内嵌metastore server , remote metastore DB的方式进行hiveserver 部署

在需要部署hive的机器上。创建一个hive账号,adduser hive 并将其加入hadoop组,所有后续配置和启动都以hive用户进行

下载hive安装包。将其中conf下的各template文件去掉,并按需进行配置。 hive-default.xml.template需要改成hive-site.xml

hive-default.xml.template包含了所有的hive各组件相关的默认配置。

详细部署文档:https://cwiki.apache.org/confluence/display/Hive/AdminManual+Configuration#AdminManualConfiguration-HiveMetastoreConfigurationVariables

在hdfs中创建hive数据存放路径

在hdfs中创建以下文件,并给hive所属组赋写权限

  $ $HADOOP_HOME/bin/hadoop fs -mkdir       /tmp
  $ $HADOOP_HOME/bin/hadoop fs -mkdir       /user/hive/warehouse
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /tmp
  $ $HADOOP_HOME/bin/hadoop fs -chmod g+w   /user/hive/warehouse

/user/hive/warehouse是hive中的表数据实际存储的地方。它是默认路径,你当然可以在hive-site.xml中通过设置hive.metastore.warehouse.dir属性来指定新的路径

配置hive的环境变量

export HIVE_HOME=/opt/apache-hive-3.1.2-bin/
export PATH=$HIVE_HOME/bin:$PATH

配置日志输出路径

hive的默认输出路径为/tmp/<user.name>/hive.log,如果我们以hive用户启动,那么该路径为/tmp/hive/hive.log

/tmp路径是linux用来存放各应用程序运行时的中间状态数据,一般会在操作系统重启后,自动进行清理。 当然你可以修改hive的log4j文件,来指定hive.log.dir=<other_location>路径

也可以在启动hiveserver2时,动态的去通过hiveconf参数指定路径bin/hiveserver2 --hiveconf hive.root.logger=INFO,DRFA

hive的临时文件配置

hive运行时也会在host本地,和hdfs中存放临时文件,称之为scratch文件。存放的文件路径为 hdfs :/tmp/hive-<username> 本地:/tmp/<username>

值得说明的是,hive-site.xml模板中,有大量路径配置是${java.io.tmpdir}/${user.name}/,${java.io.tmpdir}表示该配置的默认值是取Java使用临时目录,一般在linux下也即/tmp,${user.name}表示取当前启动hive的用户。你如果不特殊指定,可删除对应的配置项。而不要直接配置中也写成${java.io.tmpdir}/${user.name}/,xml中是识别不了这些占位符的。

配置metastore 的DB信息并初始化

在hive-site.xml对应的目录下,创建一个hivemetastore-site.xml文件,用于配置metastore相关信息

初始化metastore db

$HIVE_HOME/bin/schematool -dbType <db type> -initSchema

其中dbType的取值可以是derby, oracle, mysql, mssql, postgres

参考资料 https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration

启动hiveserver2

$HIVE_HOME/bin/hiveserver2

上述命令为前台运行,最好以no hang up 加后后台方式运行

nohup $HIVE_HOME/bin/hiveserver2 > /opt/apache-hive-3.1.2-bin/logs/hive_runtime_log.log < /dev/null &

启动后hive的web界面对应的端口是:10002

基本客户端部署

软件包分发

将上述hive发型包,同配置,拷贝到需要启动beeline的机器上,即完成客户端的配置。配置文件只需要hive-site.xml,可根据具体机器环境,去修改相应的路径配置信息,不需要hivemetastore-site.xml 和 hiveserver2-site.xml文件

环境变量配置

export HIVE_HOME=/opt/apache-hive-3.1.2-bin/
export PATH=$HIVE_HOME/bin:$PATH

日志路径配置

同hiveserver一样,根据具体情况,做一些路径配置修改

启动

使用$HIVE_HOME/bin/beeline -u jdbc:hive2://$HS2_HOST:$HS2_PORT即可连接hiveserver2。

由于hive在hdfs中使用的目录,默认是/user/hive/warehouse,所以为了避免权限相关的错,需要在通过beeline链接是加-n参数,用于指定当前客户端使用的用户。并且该用户要有/user/hive/warehouse和其下文件的相关权限,没有的话需要单独加。权限模型,同Linux类似。如果有权限问题,一般的错误类似

Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.security.AccessControlException Permission denied: user=yarn, access=WRITE, inode="/user/hive/warehouse/test.db":hive:hadoop:drwxr-xr-x

带用户名链接为形式为:

beeline -u jdbc:hive2://master:10000 -n hive

这里以hive用户链接到hiveserver

beeline整体使用文档:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients

hiveserver高可用部署

服务端配置

在所有需要启动hiverserver的机器上,配置hiveserver2-site.xml。在其中做如下配置

<!--启动高可用配置-->
<property>
    <name>hive.server2.support.dynamic.service.discovery</name>
    <value>true</value>
</property>
<!--配置在zk中的地址空间-->
<property>
    <name>hive.server2.zookeeper.namespace</name>
    <value>hiveserver2</value>
</property>
<!--配置在zk的地址-->
<property>
    <name>hive.zookeeper.quorum</name>
    <value>master:2181,slave1:2181,slave2:2181</value>
</property>

同时记住,需要部署的hiverserver的机器,都要有相同metastore的配置,保证他们连得时同一个mysql,可将hivemetastore-site.xml配置拷贝至多个需要启动hiveserver的机器

参考资料:http://lxw1234.com/archives/2016/05/675.htm

客户端连接

用beeline的连接方式如下:

beeline -u "jdbc:hive2://master:2181,slave1:2181,slave2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2" -n hive

注意其中的jdbc url一定要加引号

认证

这里选择Kerberos作为认证选项。其需要配置的三个配置项如下:

Authentication mode:

hive.server2.authentication – Authentication mode, default NONE. Options are NONE (uses plain SASL), NOSASL, KERBEROS, LDAP, PAM and CUSTOM.

Set following for KERBEROS mode:

hive.server2.authentication.kerberos.principal – Kerberos principal for server.

hive.server2.authentication.kerberos.keytab – Keytab for server principal.

使用了kerberos认证后的beeline链接方式

beeline -u "jdbc:hive2://master:2181,slave1:2181,slave2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2"

上述命令使用前,一定保证已经通过kinit实现了当前机器的kerberos认证。否者beeline命令会报错,因为没有取到kerberos认证票据。

该命令会自动去读取,当前登录的kerberos用户信息,在执行的命令的时候带上

INFO  : Executing with tokens: [Kind: HDFS_DELEGATION_TOKEN, Service: ha-hdfs:haixue-hadoop, Ident: (token for test: HDFS_DELEGATION_TOKEN owner=test, renewer=yarn, realUser=hive/master@HAIXUE.COM, issueDate=1594627135369, maxDate=1595231935369, sequenceNumber=66, masterKeyId=27)]

比如当前kerberos的tgt是test用户,那么该hivesql 对应的owner就是test。实际组件之间的通信认证是使用的hive/master@HAIXUE.COM 用户。但授权粒度会控制到test上。

这个特性是hive配置的的hive.server2.enable.doAs 属性来控制的,该属性为true时,表示运行以提交用户作为最终sql执行的用户

另外,最好我们在hiveserver的配置文件中,将hive.server2.allow.user.substitution关闭为false. 因为该选项,会允许用户以-n参数指定一个用户。这样会导致一个用户以自己的kerberos凭证,操作别人的库表。但禁用后,hue就无法将其登录用户做为提交job的人。

基于hive-site.xml的客户端连接

上述记录的连接hiveserver2的方式,是通过jdbc来实现的。但有些依赖hive的程序,则只能通过hive-site.xml 这种方式连接hiveserver。典型的就是hue

hue会去${HIVE_CONF_DIR}环境变量或者/etc/hive/conf路径下找hive-site.xml和beeline-hs2-connection.xml两个配置文件,读取其中的信息,实现对hiveserver的连接。

如果集群配置了kerberos,那么需要在hive-site.xml中配置,跟hiveserver2-site.xml一样的kerberos认证配置,例如

<property>
    <name>hive.server2.authentication</name>
    <value>KERBEROS</value>
</property>
<property>
    <name>hive.server2.authentication.kerberos.principal</name>
    <value>hive/master@HAIXUE.COM</value>
</property>
<property>
    <name>hive.server2.authentication.kerberos.keytab</name>
    <value>/opt/keytab_store/hive.service.keytab</value>
</property>

像hue 是使用beeline连接,还可以配置beeline-hs2-connection.xml,在其中指定一些些连接hiveserver2的代理用户信息,不过目前发现不配置依然可以使用。如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>beeline.hs2.connection.user</name>
  <value>hive</value>
</property>
<property>
  <name>beeline.hs2.connection.password</name>
  <value>hive</value>
</property>
</configuration>

一些错误

错误1 guava

初始化metastore schema是报错

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

原因是hadoop路径share/hadoop/common/lib/下的guava包同hive的lib下的guava包版本不一致。

解决办法,删除hive的guava包,将hadoop的对应guava包拷贝过来

错误2,mysql驱动

[hive@master bin]$ ./schematool -dbType mysql -initSchema
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/apache-hive-3.1.2-bin/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-3.2.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL:     jdbc:mysql://xxx.xx.xx.xx:3306/hive?createDatabaseIfNotExist=true
Metastore Connection Driver :     com.mysql.jdbc.Driver
Metastore connection User:     root
org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver
Underlying cause: java.lang.ClassNotFoundException : com.mysql.jdbc.Driver
Use --verbose for detailed stacktrace.
*** schemaTool failed ***

问题原因,hive缺乏mysql的驱动

解决办法,下载一个mysql的驱动,安装到hive的lib下

错误3

当使用beeline客户端:beeline -u jdbc:hive2://master:10000链接,hiveserver2时,报以下错误

Error: Could not open client transport with JDBC Uri: jdbc:hive2://master:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hive is not allowed to impersonate anonymous (state=08S01,code=0)
Beeline version 3.1.2 by Apache Hive

我们是以hive用户,启动的hiveserver2。所以,所有客户端,无论以书面用户链接到hiveserver2,最终hiveserver2去访问hadoop集群时,都是以hive的用户去访问的。

但如果你没在hadoop中,做相关的配置,那hadoop默认是不允许hive这个用户作为其他用户的代理用户使用集群的,所以需要在hadoop的core-site.xml中,做以下配置

   <!--基础权限控制,允许来之master,slave1,slave2上的所有组的用户,以hive用户身份使用Hadoop集群,这里hive也是一个用户-->
    <property>
        <name>hadoop.proxyuser.hive.hosts</name>
        <value>master,slave1,slave2</value>
    </property>
    <property>
        <name>hadoop.proxyuser.hive.groups</name>
        <value>*</value>
    </property>
    <!--以下配置跟hadoop.proxyuser.hive.groups二选一,不用两个都配置。用于指定hadoop.proxyuser.hive.hosts机器上,具体哪些用户可以代理到hive上-->
    <property>
         <name>hadoop.proxyuser.super.users</name>
         <value>user1,user2</value>
   </property>

参考资料

https://cwiki.apache.org/confluence/display/Hive/GettingStarted https://cwiki.apache.org/confluence/display/Hive/HCatalog+InstallHCat https://stackoverflow.com/questions/22533814/what-is-use-of-hcatalog-in-hadoop https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients

相关推荐

自学Python,写一个挨打的游戏代码来初识While循环

自学Python的第11天。旋转~跳跃~,我~闭着眼!学完循环,沐浴着while的光芒,闲来无事和同事一起扯皮,我说:“编程语言好神奇,一个小小的循环,竟然在生活中也可以找到原理和例子”,同事也...

常用的 Python 工具与资源,你知道几个?

最近几年你会发现,越来越多的人开始学习Python,工欲善其事必先利其器,今天纬软小编就跟大家分享一些常用的Python工具与资源,记得收藏哦!不然下次就找不到我了。1、PycharmPychar...

一张思维导图概括Python的基本语法, 一周的学习成果都在里面了

一周总结不知不觉已经自学Python一周的时间了,这一周,从认识Python到安装Python,再到基本语法和基本数据类型,对于小白的我来说无比艰辛的,充满坎坷。最主要的是每天学习时间有限。只...

三日速成python?打工人,小心钱包,别当韭菜

随着人工智能的热度越来越高,许多非计算机专业的同学们也都纷纷投入到学习编程的道路上来。而Python,作为一种相对比较容易上手的语言,也越来越受欢迎。网络上各类网课层出不穷,各式广告令人眼花缭乱。某些...

Python自动化软件测试怎么学?路线和方法都在这里了

Python自动化测试是指使用Python编程语言和相关工具,对软件系统进行自动化测试的过程。学习Python自动化测试需要掌握以下技术:Python编程语言:学习Python自动化测试需要先掌握Py...

Python从放弃到入门:公众号历史文章爬取为例谈快速学习技能

这篇文章不谈江流所专研的营销与运营,而聊一聊技能学习之路,聊一聊Python这门最简单的编程语言该如何学习,我完成的第一个Python项目,将任意公众号的所有历史文章导出成PDF电子书。或许我这个Py...

【黑客必会】python学习计划

阅读Python文档从Python官方网站上下载并阅读Python最新版本的文档(中文版),这是学习Python的最好方式。对于每个新概念和想法,请尝试运行一些代码片段,并检查生成的输出。这将帮助您更...

公布了!2025CDA考试安排

CDA数据分析师报考流程数据分析师是指在不同行业中专门从事行业数据搜集、整理、分析依据数据作出行业研究评估的专业人员CDA证书分为1-3级,中英文双证就业面广,含金量高!!?报考条件:满18...

一文搞懂全排列、组合、子集问题(经典回溯递归)

原创公众号:【bigsai】头条号:程序员bigsai前言Hello,大家好,我是bigsai,longtimenosee!在刷题和面试过程中,我们经常遇到一些排列组合类的问题,而全排列、组合...

「西法带你学算法」一次搞定前缀和

我花了几天时间,从力扣中精选了五道相同思想的题目,来帮助大家解套,如果觉得文章对你有用,记得点赞分享,让我看到你的认可,有动力继续做下去。467.环绕字符串中唯一的子字符串[1](中等)795.区...

平均数的5种方法,你用过几种方法?

平均数,看似很简单的东西,其实里面包含着很多学问。今天,分享5种经常会用到的平均数方法。1.算术平均法用到最多的莫过于算术平均法,考试平均分、平均工资等等,都是用到这个。=AVERAGE(B2:B11...

【干货收藏】如何最简单、通俗地理解决策树分类算法?

决策树(Decisiontree)是基于已知各种情况(特征取值)的基础上,通过构建树型决策结构来进行分析的一种方式,是常用的有监督的分类算法。决策树算法是机器学习中的一种经典算法,它通过一系列的规则...

面试必备:回溯算法详解

我们刷leetcode的时候,经常会遇到回溯算法类型题目。回溯算法是五大基本算法之一,一般大厂也喜欢问。今天跟大家一起来学习回溯算法的套路,文章如果有不正确的地方,欢迎大家指出哈,感谢感谢~什么是回溯...

「机器学习」决策树——ID3、C4.5、CART(非常详细)

决策树是一个非常常见并且优秀的机器学习算法,它易于理解、可解释性强,其可作为分类算法,也可用于回归模型。本文将分三篇介绍决策树,第一篇介绍基本树(包括ID3、C4.5、CART),第二篇介绍Ran...

大话AI算法: 决策树

所谓的决策树算法,通俗的说就是建立一个树形的结构,通过这个结构去一层一层的筛选判断问题是否好坏的算法。比如判断一个西瓜是否好瓜,有20条西瓜的样本提供给你,让你根据这20条(通过机器学习)建立起...