Apache Hive2.1.1安装部署

来源:互联网 发布:java判断链表是否有环 编辑:程序博客网 时间:2024/06/05 14:48

转载请注明出处:http://blog.csdn.net/u012842205/article/details/71713842


一、Apache Hive简介

Apache Hive是基于Hadoop的一个数据仓库工具,用于使用SQL语法查询、读取、写入和管理大数据量的分布式数据结构。可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。作为一个SQL引擎,提供从数据源到用户的一个映射,目前Hive支持的数据源可以是HDFS、HBase等,而底层的执行引擎来自Apache Tez、Apache Spark、MapReduce。而Hive的SQL语法也支持标准的SQL(SQL:2003、SQL:2011等)。

Hive本质是将SQL转换为MapReduce程序,也即是说,对于数据的查询、写入、清洗等操作,都是通过Hive转化成MapReduce作业进行的。其底层依赖MapReduce,所以在配置过程中,也得配置好一个yarn服务。

再者,Hive使用RDBMS存储从数据源到用户定义数据表的一个映射关系。所以需要一个RDBMS。Hive目前支持的RDBMS为四中:

MS SQL Server2008 R2mssqlMySQL5.6.17mysqlOracle11goraclePostgres9.1.13
postgres

 本文部署使用的Hive为Apache版本2.1.1,其中MySQL使用 Ver 14.14 Distrib 5.7.17Hadoop使用2.7.3。部署的操作系统环境为CentOS 7.2.1511,节点主机名称为hiveserver。本文只记录了Hive的部署和配置,其他依赖组件的安装配置不再赘述。

此处需要先说明,本文部署的Hive服务主要是启动hiveserver2和hivemetastore两个进程,这两个进程我只部署在了单一节点上,并且笔者也不知道Hive是否能部署成集群。也即是说,Hive我只是部署在了一个节点。


二、下载、解压tar

从Apache Hive官方网站下载合适版本的部署包(apache-hive-2.1.1-bin.tar.gz),这里我们选择使用2.1.1版本。将部署包上传到服务器上,切换到部署包所在路径,解压路径为/home/hive:

tar -xzvf ./apache-hive-2.1.1-bin.tar.gz -C /home/hive/
解压完成后,会在/home/hive/apache-hive-2.1.1-bin下产生几个比较重要的目录:

bin: 一些启动和运维脚本,一些工具,此目录下的脚本多是可执行的。

conf: 配置目录,此目录下放置Hive所有的配置文件。

lib: 编译好的Hive jar和相关依赖jar。

logs: 所有日志目录

scripts: 里面几乎都是sql文件,用于进行RDBMS元数据结构初始化,比如存储映射关系的一些MySQL表,转换函数等。

我们主要关注的就是配置、bin和日志目录。


三、配置

主要是在$HIVE_HOME目录下配置conf中的两个文件hive-site.xml和hive-env.sh。这两个文件都有一个后缀为.template的模板,可以直接复制出hive-site.xml与hive-env.sh。个人建议对于hive-site.xml不要使用hive-site.xml.template复制,因为模板文件中配置项太多,而且其中都是默认配置值,我们只需要覆盖很少的几个配置项即可,自己创建一个hive-site.xml也行。而如果系统环境变量配置没有问题,完全可以不用再配置一个hive-env.sh。

以下是本文的hive-site.xml配置文件,罗列出了所有更改过的配置,其他配置请自行查阅官方配置文档。

<property>    <name>hive.exec.scratchdir</name>    <value>/tmp</value>  </property>
用于运行作业时存储临时文件的路径。
<property>  <name>hadoop.config.dir</name>  <value>$HADOOP_HOME/etc/conf</value></property>
根据字面意思也可以知道,指定Hive的配置目录。

<property>  <name>fs.defaultFS</name>  <value>hdfs://hdfsservice:8020</value></property>
配置可访问的HDFS服务URL,若配置或使用过HDFS,这个值应该很好理解。上例是服务名(可能是主机名,也可能是服务名)为hdfsservice的HDFS。

<property>  <name>javax.jdo.option.ConnectionURL</name>  <value>jdbc:mysql://mysqlservice/hive_meta?createDatabaseIfNotExist=true</value></property>
配置可访问的RDBMS元数据的jdbc地址,URL,也就是MySQL的链接字符串。这里我们已经指定了数据库名称为hive_meta。虽然后面加了参数createDatabaseIfNotExist,但若在后续初始化元数据库的步骤里没有成功创建,则最好手动创建这个数据库。

<property>  <name>javax.jdo.option.ConnectionUserName</name>  <value>hiveuser</value></property>
访问RDBMS元数据的用户名,也就是访问MySQL的用户名,按你的MySQL配置。

<property>  <name>javax.jdo.option.ConnectionDriverName</name>  <value>com.mysql.jdbc.Driver</value></property>
访问RDBMS元数据的JDBC驱动类,我们指定MySQL的驱动。
<property>  <name>javax.jdo.option.ConnectionPassword</name>  <value>hiveuserpasswd</value></property>
访问RDBMS元数据的密码,也就是访问MySQL的用户密码,按你的MySQL密码配置。

<property>  <name>hive.metastore.uris</name>  <value>thrift://hiveserver:9083</value></property>
这里我们配置的是可供远程访问的元数据服务(hivemetastore),所以配置这个选项。这样我们的hivemetastore和hiveserver2理论上可以部署在不同的节点上。当然本文还是部署在了同一个节点。hivemetastore服务监听这个地址和端口,从hiveserver2来的对元数据的访问请求都从这个端口进出。配置中hiveserver是当前节点的hostname。
 
<property>  <name>hive.metastore.port</name>  <value>9083</value></property>
同上

<property>  <name>hive.metastore.local</name>  <value>false</value></property>
是否使用本地metastore,这里的本地metastore指Hive自带的Derby数据库,一个非常简单的关系型数据库,内嵌于Hive中。我们已经使用了MySQL,这个配置项设置false。
<property>  <name>hive.metastore.warehouse.dir</name>  <value>/user/hive/warehouse</value></property>
注意:这个配置项设置的是HDFS路径,也就是说,若使用的元数据存储在HDFS,则所有的数据都存储于这个目录下,这个不是元数据(比如CSV文件到Hive表的映射关系),而是真正的数据文件位置。

<property>  <name>hive.metastore.schema.verification</name>  <value>false</value></property>
当设置为true,Hive会检测metastore中存储的version信息是否和Hive jar中记录的version信息一致,若不一致,则很多请求都不会被执行,且抛出异常。这里可以设置成false。以后都不再检测。
<property>  <name>hive.server2.thrift.port</name>  <value>10000</value></property>
配置Hiveserver2的访问端口,这个端口是暴露给Hive JDBC客户端的,当有来自用户的访问请求时,从这个端口获得返回的数据集。


<property>  <name>hive.server2.bind.host</name>  <value>master1</value></property>
同上。


四、运行

第一次启动时,必须构建元数据库,这里使用Hive自带的schema-tool.sh,在$HIVE_HOME/bin/路径下。使用如下命令

bin/schematool -dbType mysql -initSchema
若运行失败,想重新建立,可能需要手动先删除MySQL中的hive_meta数据库,再重试。一般使用MySQL数据库存元数据很少出现构建失败的,倒是使用内嵌的Derby时出问题比较多。

运行成功后,以后都不再需要初始化,除非想重建元数据库。


(1)运行hivemetastore

bin/hive --service metastore

注意:开启以上两个服务都会将输出写入到STDOUT和STDERR,且不是daemon进程。之前我尝试配置log4j,但貌似不是这个问题。后来使用nohup切换成daemon进程了,输出重定向到log中。


(2)运行hiveserver2

切换到$HIVE_HOME路径下,使用命令:

bin/hiveserver2

五、使用测试

启动了两个服务后,可以使用客户端工具连接服务器,尝试使用:

(1)使用bin/hive

直接运行命令即可


(2)使用bin/beeline

运行命令,出现命令行提示符,这时候使用connect命令:

!connect jdbc:hive2://hiveserver:10000/default

这个URL地址的主机和端口在上面配置时已经说明,default为hive默认存在的数据库。jdbc驱动使用hive2,这里必须使用hive2,主要是hive的版本问题。

后面出现输入用户名之类的,用户名最好写运行HDFS服务的用户名,密码可写可不写,反正没用。若没有报错了,则链接成功,可以创建表啥的试试。


六、一些注意事项

1、本文使用的是MySQL数据库作为元数据存储,所以必须有mysql 的JDBC驱动,从官网下载后,放置在$HIVE_HOME/lib下即可。

2、保证配置的几个端口号能通过系统的防火墙和其他操作系统限制。

3、环境变量HIVE_HOME最好配置一个,但我试过不配置,貌似也没事。

4、HADOOP_HOME必须能让Hive找到,若找不到,手动在hive-env.sh中指定具体路径。这个路径主要是找hadoop的配置文件,可执行脚本的。非常重要。当然,还可以配置更明确的一些变量,比如说: YARN_HOME,MAPRED_HOME等。

5、不要删除Hive部署根目录下的几个文本文件(LICENSE、NOTICE、RELEASE_NOTES.txt、README.txt),记得之前删除了某一个文件,导致Hive启动报错,说找不到jar啥的,后来查看脚本源码,发现会检测某个脚本是否存在,若不存在则找某几个jar,若存在则找另一些jar,这可能和源码安装有关系,总之比较吐血。


七、参考

官方配置文档:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

官方文档:http://hive.apache.org

其他博客:http://sishuok.com/forum/blogPost/list/6220.html

http://www.yiibai.com/hive/hive_installation.html