Hive本质、架构、玩法

守听  金牌会员 | 2024-6-13 21:13:52 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

目录
Hive本质
Hive主要有以下3个模块
Metastore
架构 
Hive日志配置
HQL执行过程
Hive四种玩法:
1)CLI
2)HiveServer2
3)Beeline
4)Web UI


Hive本质

Hive是构建在hadoop上的数据堆栈,也可以说是一个操作hdfs文件的客户端,它可以将结构化的数据文件映射成表,并提供类 SQL查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。Hive执行引擎可以是MapReduce、Spark、Tez,假如是MR,Hive就会把HQL翻译成MR进行数据计算。
由于Hive是针对数据堆栈应⽤设计的,⽽数据堆栈的内容是读多写少的。因此,Hive中不⽀持 对数据的改写和添加,所有的数据都是在加载的时间中确定好的。
Hive不适合⽤于联机事件处理(OLTP),也不提供实时查询功能。它最适合应⽤在基于⼤量不可变数据的批处理 作业。Hive 的特点是可伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输⼊格式的松散耦合。 Hive 的⼊⼝是DRIVER ,执⾏的SQL语句⾸先提交到DRIVER驱动,然后调COMPILER表明驱动,终极表明成 MapReduce 使命执⾏,末了将结果返回。
   优点:
  1. 简单、容易上手 (提供了雷同 sql 的查询语言 hql),使得精通 sql 但是不了解 Java 编程的人也能很 好地进行大数据分析;
  2. 灵活性高,可以自界说用户函数 (UDF) 和存储格式;
  3. 为超大的数据集设计的计算和存储能力,集群扩展容易;
  4. 统一的元数据管理,可与 presto/impala/sparksql 等共享数据;
  5. 执行耽误高,不适合做数据的实时处理,但适合做海量数据的离线处理。
  


Hive主要有以下3个模块

⽤户接⼝模块:含CLI、HWI、JDBC、Thrift Server等,⽤来实现对Hive的访问。CLI是Hive⾃带 的下令⾏界⾯;HWI是Hive的⼀个简单⽹⻚界⾯;JDBC、ODBC以及Thrift Server可向⽤户提供进 ⾏编程的接⼝,此中Thrift Server是基于Thrift软件框架开辟的,提供Hive的RPC通信接⼝。
驱动模块(Driver):含编译器compiler、优化器optimizer、执⾏器executor等,负责把HiveQL语句转换成⼀系列MR作业, 所有下令和查询都会进⼊驱动模块,通过该模块的剖析变异,对计算过程进⾏优化,然后按照指定 的步调执⾏。
元数据存储模块(Metastore):是⼀个独⽴的关系型数据库,通常与MySQL数据库连接后创建的 ⼀个MySQL实例,也可以是Hive⾃带的Derby数据库实例。此模块主要保存表模式和其他体系元数 据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据地点位置信息等。
Metastore

metastore是Hive最紧张的部件,在 Hive 中,表名、表结构、字段名、字段范例、表的分隔符等统一被称为元数据。所有的元数据默认存储在 Hive 内置的 derby 数据库中,但由于 derby 只能有一个实例,也就是说不能有多个下令行客户端同时访问,所以在现实生产情况中,通常使用 MySQL中的自建数据库代替derby。Hive 进行的是统一的元数据管理,就是说你在 Hive 上创建了一张表,然后在 presto、impala、sparksql中都是可以直接使用的,它们会从 Metastore 中获取统一的元数据信息,同样的你在 presto、impala、sparksql 中创建一张表,在 Hive 中也可以直接使用。
hive创建的内部表,默认放在hdfs的/usr/hive/warehouse文件夹下

 可以看到db_msg.db、myhive.db是数据库,其他的是表,而这些表创建时默认放在另一个default库中只是在hdfs中没有显示,在hive中才气显示出来。由此可见hive的表和库其实就是一个个hdfs文件夹,表和库可以是并列同级关系。表有内外之分,创建时默认是内部表,而external_stu1是外部表,外部表和内部表的区别就在于外部表只是把hdfs的文件数据和hive的表相干联,在hive中删除外部表,hdfs的文件数据依然存在不会被删除,而删除内部表,表的文件数据和表本身会一同删除。

架构 


Hive日志配置

  1. -- Hive中的日志分为两种
  2. 1. 系统日志,记录了hive的运行情况,错误状况。
  3. 2. Job 日志,记录了Hive 中job的执行的历史过程。
  4. 系统日志存储在什么地方呢 ?
  5. 在hive/conf/hive-log4j.properties 文件中记录了Hive日志的存储情况,
  6. 如果没有hive-log4j.properties。那么需要找到该文件夹下的hive-log4j.properties.templete,这个是模板文件,运行mv命令把templete重命名成properties文件即可。
  7. properties文件默认的存储情况:
  8. property.hive.root.logger=WARN,DRFA
  9. property.hive.log.dir=/tmp/${user.name} # 默认的存储位置,一般是/tmp/root,此处改成hive/logs
  10. property.hive.log.file=hive.log  # 默认的文件名
  11. Job日志又存储在什么地方呢 ?
  12. //Location of Hive run time structured log file
  13.     HIVEHISTORYFILELOC("hive.querylog.location", "/tmp/" + System.getProperty("user.name")),
  14. 默认存储与在/tmp/{user.name}目录下。但是我没找到。。。
复制代码
 properties文件的日志存放目录修改之后如下:

 日志目录是后来配置的,于是又把/tmp/root目录下的hive日志手动移到了hive/logs下:

HQL执行过程

Hive 在执行一条 HQL 的时间,会颠末以下步调:
   1. 语法剖析:Antlr 界说 SQL 的语法规则,完成 SQL 词法,语法剖析,将 SQL 转化为抽象 语法树 AST Tree;
  2. 语义剖析:遍历 AST Tree,抽象出查询的基本构成单位 QueryBlock;
  3. 天生逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
  4. 优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变动,合并不须要的 ReduceSinkOperator,减少 shuffle 数据量;
  5. 天生物理执行计划:遍历 OperatorTree,翻译为 MapReduce 使命;
  6. 优化物理执行计划:物理层优化器进行 MapReduce 使命的变动,天生终极的执行计划。
  Hive四种玩法:

1)CLI

配置 hive情况变量(通常是/etc/profile文件)后,在恣意目录下直接输入下令 hive即可启动(或者hive --service cli),前提是要启动hdfs(start-dfs.sh)和hive元数据服务(start-hivemetastore.sh自己写的脚本配置到情况变量),因为hive就是操作hdfs的文件的。
留意!!!

留意第一行提到Hive-on -MR is deprecated在2.x版本已经废弃不保举使用,后续都是hive on spark (on Tez),但是MapReduce的hive优化还是建议学一下。

上面这种情况可能就是没启动元数据服务。 
hive通常是在集群情况中使用的,假如只启动了一台服务器,那么在启动hive时会报错,如下:

name node处于安全模式,服务器数量少于最小要求数量,这种情况要么等18s后重新启动cli,要么启动第二台服务器并启动上面的hdfs。
2)HiveServer2

启动hiveserver2服务,提供thrift端口供其他客户连接,启动之后就可以使用hive之外的其他工具操作hdfs文件,比如DBserver,IDEA的数据库插件
   需要在hdfs的core-site.xml文件中加如下配置:
  <property>
                <name>hadoop.proxyuser.root.groups</name>
                <value>*</value>
                <description>答应root用户署理任何其他用户</description>        
    </property>
    <property>
                <name>hadoop.proxyuser.root.hosts</name>
                <value>*</value>
                <description>答应署理恣意服务器的请求</description>        
    </property>
root也可以换成hadoop等其他用户,我这里设置成了超级用户root
   恣意目录下启动hiveserver2(前台)或者切换到背景
   自己写的背景脚本,配置到情况变量中
  [root@linux01 bin]# cat start-hiveserver2.sh 
#!/bin/bash
nohup $HIVE_HOME/bin/hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &
#启动hiveserver2服务,提供thrift端口供其他客户连接
  3)Beeline

启动beeline必须先启动hiveserver2,启动beeline后,键入
   !connect jdbc:hive2://linux01:10000
  并输入用户名密码即可,这里的登录用户可以是恣意用户因为hadoop的core-site.xml设置了root用户可以署理恣意用户。linux01是我的服务器名
   

  4)Web UI

   在 hive-site-xml 中添加 hive 配置。
      <property>
        <name>hive.server2.webui.host</name>
        <!--主机名或ip-->
        <value>linux01</value>
    </property>
    <property>
        <name>hive.server2.webui.port</name>
        <value>10002</value>
    </propert>
  启动hive,欣赏器即可访问10002端口

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表