基本概念

什么是Hive?

1、Facebook 开源

2、海量 结构化日志 数据统计工具

* 3、Hive是Hadoop的数据仓库工具,将结构化的数据文件映射为一张*

Hive本质

本质:将HQL转为MapReduce程序

  • 数据仓库通过SQL进行统计分析-----> 将SQL中常用的操作,用MapReduce写成很多模板-----> 将所有的MapReduce封装到Hive中。
  • 用户根据业务的需求编写相应的SQL语句-----> 将SQL语句传给Hive-----> 通过Hive匹配处相应的MapReduce模板-----> 运行MapReduce程序,生成相应的结果,返回给用户

1、Hive处理的数据存储在HDFS上

2、Hive分析数据底层的实现是在MapReduce上

3、运行程序的执行是在Yarn上

优缺点

# 优点
    1、操作接口采用SQL语法,SQL大家比较熟悉,方便快捷
    2、因为第一条,所以开发人员不用写MapReduce,方便了很多
    3、Hive支持用户用户自定义函数,用户可以根据自己的需求来自定义函数
# 缺点
    1、Hive执行的延迟比较高,适用于实时性要求不高的场合
    2、由于延迟比较高,所以对于小数据的处理没有优势,适用于大数据
    3、迭代式算法无法表达
    4、Hive调优比较困难

架构原理

image.png

解释:

1、用户接口Client

CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

2、元数据Metastore

表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3、Hadoop

使用HDFS进行存储,使用MapReduce进行计算

4、驱动器Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

与数据库

Hive采用了SQL语法,只是拥有类似的查询语言。

数据库可以应用在Online的应用中,而Hive是针对数据仓库设计

查询语言

SQL被广泛的应用在数据仓库中,所以Hive设计了类SQL的查询语言

数据更新

数据仓库中的内容是读多写少的,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。**

数据库中的数据是经常要修改的

执行延迟

1、Hive查询,没有设计的索引,需要扫描整个表

2、使用MapReduce进行Hive查询,本身MapReduce就有一定的延时

3、小数据来讲,数据库是快的,但是对于大数据,Hive的优势才能体现出来

数据规模

Hive建立在集群上,利用MapReduce进行计算,所以支持很大规模的数据

安装部署

准备工作

1、将Hive安装包上传到/e3base/e3base560下,解压

tar -zxvf hive-3.1.2-e3base5.6.0-x86.tgz

2、创建Hive软连接

ln -s ~/e3base560/hive-3.1.2-e3base5.6.0-x86 ~/e3base/hive

3、配置Hive的环境变量,并source .bash_prefile

## HIVE
export HIVE_HOME=$IN_HOME/hive
export PATH=$HIVE_HOME/bin:$PATH

# 一定注意要source
source .bash_profile

4、创建logs目录

mkdir -p /e3base/e3-info/hive/logs/metastore_15001
mkdir -p /e3base/e3-info/hive/logs/server2_15101

配置

Hive的配置文件均处于/e3base/hive/conf目录下

  • 生成密钥文件

    # 如果需要重新生成密码,需要将原先的hive.jceks删除
    hadoop credential create javax.jdo.option.ConnectionPassword -provider jceks://file/e3base/hive/conf/hive.jceks
  • 上传tez依赖到HDFS

    $ hadoop fs -mkdir /tez  在指定位置创建目录
    $ hadoop fs -put $HIVE_HOME/tez/package/tez-0.10.1-e3base5.6.0.tar.gz /tez/  将本地***拷贝到***中
  • hadoop-env.sh配置

    # HADOOP_HOME/etc/hadoop下的配置文件,根据实际情况增加下面的配置:
    export TEZ_HOME=$IN_HOME/hive/tez
  • hive-env.sh配置

    # 按照实际情况修改路径信息
    export HADOOP_HOME=/e3base/hadoop   
  • hive.site.xml配置

    <configuration>
        <property>
            <name>hive.zookeeper.quorum</name>
            <value>dchao,dchao01,dchao02</value>
        </property>
        <property>
            <name>hive.zookeeper.client.port</name>
            <value>11001</value>
        </property>
        <property>
            <name>hive.metastore.uris</name>
            <value>thrift://e3base04:15001,thrift://e3base05:15001</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://192.168.9.195:3306/hivedb?createDatabaseIfNotExist=true</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>hive</value>
        </property>
        <property>
            <name>hadoop.security.credential.provider.path</name>
            <value>jceks://file/e3base/hive/conf/hive.jceks</value>
        </property>
        <property>
            <name>hive.server2.thrift.bind.host</name>
            <value>e3base04</value>
        </property>
        <property>
            <name>hive.users.in.admin.role</name>
            <value>e3base</value>
        </property>
    </configuration>

参数介绍:

1、hive.zookeeper.quorum:该集群中的配置的zookeeper的主机名

2、hive.zookeeper.client.port:该集群中的配置的zookeeper集群的端口

3、hive.metastore.uris:metastore访问地址,可配置多个时以逗号隔开

4、hadoop.security.credential.provider.path:密匙文件的位置

5、javax.jdo.option.ConnectionURL:jdbc链接远程mysql数据库实例的地址

jdbc:mysql://172.16.9.195:3306/hivedb?createDatabaseIfNotExist=true

hivedb:是对应mysql主机的数据库实例的名字

6、javax.jdo.option.ConnectionUserName:远程mysql元数据存放的mysql服务的登陆用户名。(不能使用mysql的root用户)

7、javax.jdo.option.ConnectionPassword:远程mysql元数据存放的mysql服务的登陆用户密码。

8、hive.server2.thrift.bind.host:hiveserver2的启动地址。

9、hive.users.in.admin.role:hive库的admin角色名

  • hive-log4j2.properties配置

    # hive metastore运行日志路径
    hive.log.dir=/e3base/e3-info/hive/logs/metastore_15001  
    
    # 注意:
        1、在conf配置文件中,并没有hive-log4j2.properties,而是存在许许多多的hive-log4j2.properties-templete文件。
        2、我们在编写配置文件的时候,只需要复制该模板文件,并改名即可,然后再hive-log4j2.properties文件中进行更改配置
  • 集群分发

    # 仅仅是一个例子,不可以复制粘贴
    for i in e3base05;do scp -r /e3base/e3base560/hive-3.1.2-e3base5.6.0-x86 $i:/e3base/e3base560;ssh $i ln -s /e3base/e3base560/hive-3.1.2-e3base5.6.0-x86 /e3base/hive ;done;
    
    # 根据上述中,自己做的这些配置修改,进行集群分发。需要将每个修改的位置全部进行分发

问题1

在对Hive进行初始化的时候,出现SQL1045错误。详细信息如下:

image.png

# 解决办法
1、将所有的MySQL用户的密码全部修改为 ROOT用户的密码
2、使用可视化工具连接到虚拟机的数据库
    下午为具体的信息。
    连接上之后,再MySQL数据库中,找到user表,打开user表,将数据库中主机名不是%的主机全删掉 
    具体看下图

image.pngimage.png

问题2

启动Hiveserver2,任务启动后,检查$E3_INFO_HOME/hive/logs/server2_15101/下的server2服务日志。查看hive.log之后,发现连结被拒绝。

$ nohup hive --service hiveserver2 --hiveconf hive.server2.thrift.port=15101 --hiveconf hive.metastore.uris=thrift://dchao01:15001,thrift://dchao02:15001  --hiveconf hive.server2.zookeeper.namespace=hiveserver2_zk --hiveconf hive.log.dir=/e3base/e3-info/hive/logs/server2_15101 2>&1 >> /e3base/e3-info/hive/logs/server2_15101/server2_15101.nohup &

解决:

1、首先,需要思考,配置的主机的名称是否正确

经过排查之后发现,并不是主机名称配置错误。

2、更改hive-env.sh文件中的配置

"metastore"、"hiveserver2" 分配的内存太大,导致主机资源不够,使得连接不上

image.png

将原来的内存值1024M改为512M,重新启动,问题解决。

初始化

使用mysql作为hive元数据数据库,执行

schematool -initSchema -dbType mysql

# 出现一下提示,说明成功
Initialization script completed
schemaTool completed

启动

1、启动metastore服务

$ nohup hive --service metastore -p 15001 --hiveconf hive.log.dir=/e3base/e3-info/hive/logs/metastore_15001 2>&1 >> /e3base/e3-info/hive/logs/metastore_15001/metastore_15001.nohup &

参数介绍:

1、nohup: no hang up不挂起,用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。**

2、启动hiveserver2服务

nohup hive --service hiveserver2 --hiveconf hive.server2.thrift.port=15101 --hiveconf hive.metastore.uris=thrift://dchao01:15001,thrift://dchao02:15001  --hiveconf hive.server2.zookeeper.namespace=hiveserver2_zk --hiveconf hive.log.dir=/e3base/e3-info/hive/logs/server2_15101 2>&1 >> /e3base/e3-info/hive/logs/server2_15101/server2_15101.nohup &

验证

beeline -u jdbc:hive2://dchao01:15101
End

本文标题:Hive

本文链接:https://www.tzer.top/archives/132.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2021 年 09 月 18 日
如果觉得我的文章对你有用,请随意赞赏