大数据系列(四)数据仓库hive的搭建使用

Hive的介绍

博主这篇文章,有hive的基本用法,对日志统计和分析,有兴趣的可以去点个赞咯:https://blog.csdn.net/zl592886931/article/details/90049733

Hive的产生背景

根据博主前面对于MapReduce的讲解,可以回想一下,我们做一个再简单不过的wordcount(我们都可以用java的计算函数几行代码搞定),需要以下步骤:

建立mapper => 建立reduce => 建立driver => 运行

试想一下,如果不懂java,是不是和大数据say goodbye了。再想一下,改个需求,是不是代码要做到哭?
这种统计,我放在sql数据库里一个group by全部搞定。传统关系型数据库发展了一个宇宙纪元,谁不会sql?谁会大数据?

所以在这样比较冲突的环境下,Hive诞生啦。它可以让你使用sql的方式来运行MR。这有多酸爽?想想就舒服了

Hive概述

首先来看下Hive的爸爸是谁:

Hive是由Facebook开源的,用于解决海量结构化日志统计问题的框架。

Hive是构建在hadoop之上的数据仓库,Hive的数据存储在hdfs(关系类似于关系型数据库中数据和视图,Hive是视图),并且Hive提供了SQL的查询语言:HQL,因为底层引擎是MR,So,对于其他大数据计算框架比如spark等的支持,简直狼狈为奸~

那么问题来了,都有那么多的框架了,我凭什么用Hive? 说的对,那我们用spark吧?云计算上面全部都有了,我为什么要自己搭建?干脆买云吧。 那开源那么多产品,我为什么还要做程序,不然做一个PPT方案架构师吧?所以,小伙伴们,路如何选择只有靠自己的坚持,既然我们选择了程序员,那么对于技术应该有所追求抑或是偏执。哪怕将来做了管理,做了业务,技术始终是我们的根本。我坚信,将来核心竞争力一定是研发!!!

Hive架构

Hive的体系架构

首先我们来看一下hive的架构图(百度上找了一个,有点模糊,各位姥爷放下手中的砖):
在这里插入图片描述

上图最顶层两个,提供了shell命令以及thrift协议,可以支持jdbc的命令传输。左边的Metastore是炒鸡核心的东东,它是所有数据的元信息(数据存放位置、创建者、类型、名称等等),通常存在在mysql。通过这些元数据信息,可以快速找到在hbase(hdfs)中数据存放的位置。

输入sql => hive根据元信息找到相关底层数据位置(mysql)=> 经过sql解析器解析为MR => 拿到最终结果

Hive的部署架构

首先明确一点,hive是可以操作hdfs数据的客户端,它自己并不是真的存储了底层数据,所以对于hdfs的集群来说,hive仅仅只是客户端,而不是一个服务集群,通常来说,hive只是为了让熟悉sql的人操作hdfs而已,通常hive的场景是离线的数据统计, so,我们在生产环境部署的时候,无需hive集群以及节点通信,只需要部署在机器上,能访问hadoop即可。不过需要注意:hive的元信息通常我们把它存在mysql,所以mysql挂了你hive就凉凉斯密达,所以我们尽可能让mysql高可用。
博主花了一张图,来描述一下hive普通的部署体系框架(这里是框架,不是架构,对于公司或者业务来说,只要能贴合业务,更响应式,那么就是最好的架构):
在这里插入图片描述
再次重申一点:

Hive是为了使用sql来方便操作hdfs而诞生,适合处理离线海量结构化数据场景的,并不适合实时查询,比如现在页面需要分页查询数据什么的,hive会把你坑死。
比如这样的场景:现在我们hdfs中有大量的日志文件,我们现在需要统计出来我们整个应用体系每天的日活量、成交量、区域分布等,如果你不想写MR,那么你用Hive写sql进行group by 是不是很爽~~~~

Hive与RDBMS数据库的区别

hive既然使用hql(sql)命令,那么它是不是和关系型数据库一样呢?其实并不是的,两者也只是看上去相似,但是实现细节完全不一样:

  • RDBMS可以快速实现select等各种查询,延时很低,而hive需要将hql转换成MR,然后操作hdfs,所以会慢上不少,所以说它是离线场景
  • hive尽可能的使用查询做统计和分析而不要用insert这样的操作,对于RDBMS来说,插入一条就是一条,对于hive来说,兄弟,这是要转换成MR来执行的,还是效率低啊
  • hive适合离线操作在确切的来说,它面向的使用群体不是用户,不然代价和成本有点大,我们试想一下,现在老板要看一个我们公司产品的日活、周成交量、月点击量等等,我们通常运维或者开发直接使用hive进行离线计算和统计即可,肯定不是让老板登上后台管理,然后有个按钮,点击进行统计,或者直接有个看板,实时查询统计,那么你应该可以say goodbye啦 -。-(如果实时查看或者实时统计,那就上spark和hbase吧)
  • hive也是有集群的,不过hive构建在hadoop之上,所以说,集群简直是低成本和廉价,而RDBMS的集群,简直贵到你破产,都是集群,双方的计算和存储能力也有天差地别,前者处理PB级别数据是毛毛雨,而后者处理PB已经是被逼疯了。

既然上面说,hive、hadoop体系这么好,为什么还用mysql这种关系型数据库? 大兄弟醒醒,看看我们的标题,是不是大大大大数据, 现在市面上的企业,有几家真正做大数据的? 大部分都是用mysql这种数据库可以解决一切了。部署简单,人人都会,你会花费大的代价去搭建一套分布式集群吗?然后运维的成本开销也是很大滴。
只有最适合公司业务发展并且能快速做到响应式的架构,才是最好的架构,无论多小或者多大。

Hive的部署搭建(阿里云)

上面讲了这么多废话,我们开始部署(博主使用的全是root账户,so,生产环境尽量别使用root,博主是为了写大数据系列文章,拉了几台阿里云的服务器),另外以下出现的hive_home是你hive的安装目录

首先我们确保已经安装了hadoop集群,参考博主的此篇文章:

https://blog.csdn.net/zl592886931/article/details/89818448

然后我们下载hive包,博主使用的是3.1.1:

wget http://mirror.bit.edu.cn/apache/hive/hive-3.1.1/apache-hive-3.1.1-bin.tar.gz

下载之后,我们来解压,然后把文件夹名字换成hive,不然看着好不爽(强迫症,打死我):

tar -zxf apache-hive-3.1.1-bin.tar.gz -C /root/
mv apache-hive-3.1.1-bin/ hive

继续,我们来配置一下环境变量,记得resource~~

vi /etc/profile
加入export HIVE_HOME=/root/hive
然后在PATH中加入HIVE_HOME/bin
source /etc/profile
如下图在这里插入图片描述
使用hive --help 看看成功了没(下面说明ok拉):

Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cleardanglingscratchdir cli fixacidkeyindex help hiveburninclient hiveserver2 hplsql jar lineage llapdump llap llapstatus metastore metatool orcfiledump rcfilecat schemaTool strictmanagedmigration tokentool version 
Parameters parsed:
  --auxpath : Auxiliary jars 
  --config : Hive configuration directory
  --service : Starts specific service/component. cli is default
Parameters used:
  HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
  HIVE_OPT : Hive options
For help on a particular service:
  ./hive --service serviceName --help
Debug help:  ./hive --debug --help

接下来我们开始更改配置文件,首先进入==/hive_home/conf==, 你可以看到配置模板

首先我们来修改hive-env.sh(如果你配置了hadoop的环境变量,这个其实可以不用配置,就怕有人忘记啦)

cp hive-env.sh.template hive-env.sh
配置一下:HADOOP_HOME=你自己的hadoop路径

继续配置,我们来配置一下炒鸡牛逼的hive-site.xml,为什么说它牛逼,因为它根本没有,你得自己创建
vi hive-site.xml
这里注意:博主懒得自己搭建mysql,使用阿里云的RDS(mysql) mysql如果自己搭建,就下载mysql的包即可,不过只有下面配置可能会报错,我们来看一看具体都是什么坑,没有兴趣看的童鞋直接跳到 最终的hive-site配置 看最终的配置

<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://数据库链接:3306/hive?createDatabaseIfNotExist=true</value>
        <description>JDBC connect string for a JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>数据库账号</value>
        <description>username to use against metastore database</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>数据库密码</value>
        <description>password to use against metastore database</description>
    </property>
</configuration>

既然要链接mysql,肯定需要mysql的mysql-connector-java链接包,我们去 hive_home/lib目录下,直接下载jar:

wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar

来来来,我们启动一波:

执行hive命令,启动拉
然后输出show databases;
然后就报错了,卧槽,为什么,我们看一下错误:

错误信息:Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

这个错误说明你的元信息没有初始化,我们来初始化一下元信息:

hive --service metastore

然后默默等待,卧槽,又tmd报错了:

错误信息:Version information not found in metastore.

来来来,继续,我们通过添加下面配置解决上面的问题,加在hive-site.xml中:

<property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
        <description>To solve Exception: Version information not found in metastore</description>
    </property>

好,我们继续初始化元信息,再次执行hive --service metastore,经过漫长的等待,我CNMLGB,又报错了,hive爸爸,我求求你了:

报错信息: 
Required table missing : "`DBS`" in Catalog "" Schema "". 
DataNucleus requires this table to perform its persistence operations. 
Either your MetaData is incorrect, or you need to enable "datanucleus.schema.autoCreateTables"

原来是找不到对应的schema和表,再来,我们加入下面的配置,还在hive-site.xml中:

<property>
        <name>datanucleus.autoCreateSchema</name>
        <value>true</value>
    </property>
    <property>
        <name>datanucleus.fixedDatastore</name>
        <value>true</value>
    </property>
    <property>
        <name>datanucleus.autoCreateTables</name>
        <value>True</value>
    </property>

来来来,我们继续,这次我们换个姿势搞,先进入bin下面,执行下面命令,初始化我们的mysql

./schematool -initSchema -dbType mysql

成功之后,我们在hive启动,然后show databases; 我尼玛,成功了。

最终的hive-site配置

这里附上最终的配置:

<configuration>
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://数据库链接:3306/hive?createDatabaseIfNotExist=true
        </value>
        <description>JDBC connect string for a JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>数据库账号</value>
        <description>username to use against metastore database</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>数据库密码</value>
        <description>password to use against metastore database</description>
    </property>
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
        <description>To solve Exception: Version information not found in metastore</description>
    </property>
    <property>
        <name>datanucleus.autoCreateSchema</name>
        <value>true</value>
    </property>
    <property>
        <name>datanucleus.fixedDatastore</name>
        <value>true</value>
    </property>
    <property>
        <name>datanucleus.autoCreateTables</name>
        <value>True</value>
    </property>
</configuration>

回顾一下上面启动hive的过程:

  1. 配置好hive-site
  2. 在bin下面执行==./schematool -initSchema -dbType mysql ==
  3. 使用hive启动
  4. 使用sql语句测试
    最后是不是漏了什么?(hive --service metastore压根没用上啊,什么鬼)
    然后我们执行了:

create database hive_test
最终发现在mysql的dbs表中,多了一条数据,正是hive_test, 在hive中使用showdatabases; 果然多了hive_test,并且,我们看到DB_LOCATION_URI这个字段的值为:hdfs://master:9000/user/hive/warehouse,我们使用hadoop命令(hadoop fs -ls /user/hive/warehouse)查看一下是否有这个文件,果然有。说明执行了sql,直接映射在了hadoop的hdfs中。很赞~
类似的,我们创建了一个表create table hive_test_table (id varchar(10));,在tbls找到了记录

撒花,我们的hive搭建已经完毕

Hive DDL

全称为:data definition language(CREATE、ALTER、DROP等), 与关系型数据库非常相似
那它和hdfs对应关系是啥,我们来看下:

HiveHDFS
databaseHDFS的一级目录
tableHDFS的二级目录
partition(分区表,如果没有,table下面直接存数据,相当于HDFS的文件)也是一个目录
bucketHDFS的文件

Hive DML

全称为:data manipulation language(SELECT、UPDATE、INSERT、DELETE), 与关系型数据库非常相似

所有相关的基础sql操作可以参考文档,这里就不做描述了,毕竟生产环境直接上操作界面,或者用程序跑,很少直接用命令框跑,当然这是必须要掌握的,
官方文档地址附上:https://cwiki.apache.org/confluence/display/Hive/Home
再来一个别人总结的:https://www.jianshu.com/p/f7ac6589d532

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值