humidy
作者humidy2015-07-30 18:16
信息分析/架构师, 某公司

Hive(CDH5)部署指南

字数 9076阅读 6188评论 0赞 1

编写者胡旻     版权所有 转载请注明

 

对于写过WordCount的MapReduce程序的同学来说。会感受到这是Hadoop中数据处理的低层次实现,实际上直接编写MapReduce程序只是Hadoop中数据处理的一种方式,而且其实用性比较有限。

 

Hive就是设计出来简化Hadoop中数据处理的问题,它能够屏蔽MapReduce中处理数据过滤、聚合和分组的细节。能够通过简单的语句自动生成相关MapReduce代码。因此Hive是一个上层的数据处理语言,事实上也没有必要专门为此设计一门新的语言。因为SQL语言已经是关系型数据处理的事实标准。对于Hive的开发者,结论是显而易见的。开发一种SQL方言,构建的Hive可以将SQL方言编译成MapReduce框架。Hive提供的方言我们称为HiveQL,值得一提的是像Pig这样的项目,采用一种新的语言来从较高的层面进行抽象。

 

在Hadoop集群上使用SQL能力的这种需求一直在增加,也需要集成一些应用能够和Hadoop集群上的SQL接口进行联动。这些需求使得Hive成为Hadoop生态系统中必备的一个组件。

 

Hive架构

一般来说,Hive可以执行下列任务:编写一个HiveQL查询,将其编译成MapReduce任务,将这个任务提交到集群,并将结果返回给用户。为了能将HiveQL语句编译成MapReduce代码,Hive必须具备理解要查询的数据结构的能力。Hive将数据组织成熟悉的关系表,每一列都有相应定义的类型,另一方面,Hive操纵存储在Hadoop集群上的数据,而且不会在数据上强加任何模式。这意味着Hive需要提供一个附加层来存储表的元数据。Hive通过元数据服务(Metastore)来实现这一层。默认的Hive架构内部组件如下所示:

11.png

元数据服务(Metastore)是一个包含两个组件的服务。第一个组件服务可以接受Hive客户端的连接。并返回其需要的表信息。第二个组件是关系型数据库,元数据服务可以用来在磁盘上持久化元数据。Hive元数据服务支持(MySQL, PostgreSQL, Oracle)这些数据库。MySQL是使用最多的一种选择。元数据服务能够以不同的方式运行,(内嵌、本地和远程)

你可以将元数据服务以本地服务的方式连接不同的Hive客户端。或者,你可以运行一个远程的元数据服务,可以接受不同机器的多个客户端的连接。对于生产集群来说,运行一个远程的元数据服务是最常见的选择。这种方式使得你可以很容易的在多个客户端之间共享Hive的元数据。为了从后台的关系型数据库中隔离用户,你也可以运行多个元数据服务器来满足高可用的目的。

 

我们当前提到的Hive客户端,意为Hive的命令接口。类SQL的接口,允许Hive通过JDBC和ODBC来支持相关应用。这使得Hive查询引擎和数据可用性得到增强。这些应用不是和元数据服务器直接通信,而是依赖于Hive Server来提供查询的编译和元数据的访问服务。

 

我们会坚持将Hive元数据服务、HiveServer和元数据背后的数据库部署在独立的机器上。这也是可选的,你也能选取将这些服务和其它Hadoop组件服务共用。这取决于集群中客户端和Hive中表的数目。

 

部署HiveMetaStore

IP地址

作用

服务

10.80.12.55

关系型数据库

MySQL

10.80.14.22

元数据服务

Metastore、hive-server2

10.80.14.27

客户端

Client

 

在我们安装Hive元数据服务之前,我们必须确认后台有一个可用的数据库。对于我们的集群,我们会选用MySQL数据库。通常后台数据库位于Hadoop集群外部,另外Hive元数据的丢失会带来严重的后果。因为你需要重新创建所有表的定义。对存储元数据的数据库设置合适的HA和备份是非常重要的。

 

在MySQL安装配置好后,你需要为Hive的元数据创建一个用户和数据库。

这里因为我们已经设置了软件源(搭建了本地源),所以可以使用如下命令

yum install hive-metastore

Hive的配置和Hadoop组件的配置相似。配置文件,包括含有所有属性和说明的模板文件,都位于/etc/hive/conf中。这里有很多的配置选项,我们会关注其中主要的参数,使得Hive尽快的运行起来。所有的属性都需要添加到hive-site.xml文件中。

注:我们需要将hdfs-site.xml、mapred-site.xml和yarn-site.xml文件从hadoop集群上拷贝到Hive相关服务器的/etc/hadoop/conf文件夹中,否则Hive将无法和HDFS通信以及启动MapReduce任务。

首先,我们需要指定后台使用哪一种数据库驱动,在我们这会添加如下属性

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

 

使用MySQL配置Hive元数据库

安装和启动mysql,使用mysql命令台工具,创建hive_meta数据库和hive的mysql用户

$ mysql -u root -p

Enter password: ******

 

mysql> create database hive_meta;

Query OK, 1 row affected (0.03 sec)

 

mysql>  grant all privileges on hive_meta.* to 'hive'@'localhost' identified by 'hive';

Query OK, 0 rows affected (0.03 sec)

 

mysql>  grant all privileges on hive_meta.* to 'hive'@'%' identified by 'hive';

Query OK, 0 rows affected (0.03 sec)

 

mysql> exit

Bye

 

 

一些参数提供了连接访问数据库的凭证,如下所示

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://${hostname}/hive_meta </value>

<name>javax.jdo.option.ConnectionUserName</name>

<value>${hivemetauser}</value>

<name>javax.jdo.option.ConnectionPassword</name>

<value>${hivemetapassword}</value>

数据库的连接字符串使用简单的JDBC格式,MYSQL用户和密码应该匹配在MYSQL安装后创建的用户和密码。

如之前我们提到的,你可以运行一些元数据服务,为了高可用的目的使用同样的后台数据库。你需要为这些元数据指定连接属性,我们将其设定在hive.metastore.uris变量中。

<name>hive.metastore.uris</name>

<value>thrift://hive.hadoop.test.com:9083</value>

在之前的代码中,hive.hadoop.test.com是运行元数据服务的主机名,9083是默认的监听端口。我们可以通过修改/etc/default/hive-metastore来改变PORT变量值。确保端口对于所有的Hive客户端可用。

最后,我们需要指明Hive中表数据的存储位置。在Hive中,每一个数据库和表都由HDFS上的目录和一系列的文件来表示。我们可以通过变量hive.metastore.warehouse.dir指定这些文件的默认位置。

<name>hive.metastore.warehouse.dir</name>

<value>/warehouse</value>

为了启动元数据服务,我们还需要以下步骤

1.       Hive的warehouse目录应该创建在HDFS上,并且拥有合适的权限,以hdfs用户运行以下命令

# sudo –u hdfs hdfs dfs -mkdir /warehouse

# sudo –u hdfs hdfs dfs -chmod a+w /warehouse

 

2.       注意到我们允许所有的用户有权限去写/warehouse目录。这对允许多个用户使用Hive来说是非常重要的。另一种方式是将所有的Hive用户分配到一个组,并将/warehouse的拥有者加入这个组

 

3.       下载并安装MySQL的JDBC驱动。这个驱动不包含在Hive的软件包中,由于许可证的不同,你需要在http://dev.mysql.com/downloads/connector/j/上下载,并解压拷贝.jar文件到Hive的lib目录下,参考命令如下:

cp mysql-connector-java-5.1.25-bin.jar /usr/lib/hive/lib/

 

4.       使用下列命令启动Hive元数据服务:

# service hive-metastore start

我们需要经常检查错误日志文件,来确认服务是不是真的正确的启动。默认状态,Hive的日志文件可以在/var/log/hive目录中找到。

 注:在安装过程中遇到以下问题

问题一:hive的Specifiedkey was too long; max key length is 767 bytes问题

在安装Hive时,经常报异常。

后来采用输出日志的方式来开启hive:hive -hiveconf hive.root.logger=DEBUG,console

这样在执行命令时,就会输出日志,出现异常可以很快定位。

--------------------------------------------------------------------------------

ERROR DataNucleus.Datastore: Error thrown executing CREATE TABLE `SD_PARAMS`

(

    `SD_ID` BIGINT NOT NULL,

    `PARAM_KEY` VARCHAR(256) BINARY NOT NULL,

    `PARAM_VALUE` VARCHAR(4000) BINARY NULL,

    CONSTRAINT `SD_PARAMS_PK` PRIMARY KEY (`SD_ID`,`PARAM_KEY`)

) ENGINE=INNODB : Specified key was too long; max key length is 767 bytes

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

这是字符集的问题,在数据库上执行 alter database hive character set latin1;来修改字符集,问题解决

这里我之前的数据库设置的默认的都是utf-8

问题二:hive的Versioninformation not found 错误问题解决办法

安装HIVE 过程中要注意

 

1,mysql 是否正常运行

 

2.   创建好mysql 用户并分配好相应的访问权限以及数据库端口号等

 

3.   mysql-connector-java-5.1.26-bin.jar  是否放到hive/lib 目录下 建议修改权限为777 (chmod 777 mysql-connector-java-5.1.26-bin.jar)

 

4. 修改conf/hive-site.xml 中的 “hive.metastore.schema.verification”  值为 false  即可解决 “Caused by: MetaException(message:Version information not found in metastore. )”

 

5.       调试 模式命令  hive -hiveconf hive.root.logger=DEBUG,console

6.        

<property> 

   <name>hive.metastore.schema.verification</name> 

   <value>false</value> 

    <description> 

    Enforce metastore schema version consistency. 

    True: Verify that version information stored in metastore matches with one from Hive jars.  Also disable automatic schema migration attempt. Users are required to manully migrate schema after Hive upgrade which ensures proper metastore schema migration. (Default) 

    False: Warn if the version information stored in metastore doesn't match with one from in Hive jars. 

    </description> 

 </property> 

 

部署Hive客户端

在这一部分,我们将安装Hive客户端,并连接到Metastore。Hive的客户端能够集群的任何机器上,但是在生产环境中,我们会将其安装在网关服务器上。通常,作为Hadoop的管理员,需要提供系统中不同的用户通过Hive客户端接入集群的能力。将这些用户在网关机器上进行隔离使得相应的权限管理控制更加方便。

可以使用下列语句来进行客户端Client的安装

yum install hive

注:和安装部署Hive的Metastore类似,我们需要将Hadoop的配置文件拷贝到客户端机器上,以便提供Hive访问HDFS和使用MapReduce。

和Metastore一样,Hive的客户端Client也会使用hive-site.xml这个配置文件。我们不需要将Metastore的配置文件拷贝到客户端。因为metastore的整个想法是封装访问后台数据库。而Hive客户端不需要访问MySQL数据库。所以只有在Hive的Metastore中我们才需要在配置文件中设定访问MySQL的一些凭证。

所以你需要单独来配置Hive客户端的配置文件。幸运的是,这里只需要配置一些关键的参数,就可以让Hive运行起来。

首先,我们需要指定使用远程Metastore。在hive-site.xml中添加如下参数

<name>hive.metastore.local</name>

<value>false</value>

注:新版本已经不需要这个参数了

接下来你需要将Hive的客户端指向特定的HiveMetastore

<name>hive.metastore.uris</name>

<value>thrift://hive.hadoop.test.com:9083</value>

配置这两个参数对于Hive客户端来说足够了。为了运行运行Hive客户端,运行如下Hive命令:

12.png

你能看到一些打印在屏幕上的Hive日志文件信息。日志级别和位置将在hive-log4j.properties文件中定义和调整。

你可以参考下列网站https://cwiki.apache.org/confluence/display/Hive/Tutorial详细了解Hive的表创建,写HiveQL查询等内容。

 

安装Hive服务

这个时候,我们已经安装了Hive的元数据服务和Hive的客户端,并做好了相应的配置。这种安装对只是计划使用Hive CLI的用户已经够用。但是如果你需要通过使用Hive的JDBC和ODBC对应用提供访问。我们就要配置Hive Server服务。这样使得Hive能够支持比较高层面的应用和Beeline及BI工具。这也使得你可以通过Python/Perl和其它语言来访问Hive。

 

这里我们会将Hive Server和HiveMetastore放到同一台物理设备上。但这不是必须的,你完全可以将Hive Server安装在集群的其它机器上。

 

当前在CDH的资源库中有两个HiveServer的版本HiveServer1和HiveServer2。我们选择HiveServer2因为其提供客户端并发支持,额外的安全选项和一些其它的改进。HiveServer2体现了所有的最新开发的功能,HiveServer1是为了体现兼容性还保留。

可以利用下列的命令来开启HiveServer2

yum install hive-server2

如果你仔细看包中的内容,你会注意到其中只提供了服务的启动和停止脚本。所有需要的二进制文件已经随Hive Client和Hive Metastore的安装而存在了。

 

这里有一些参数,我们需要添加到/etc/hive/conf/hivesite.xml文件中用来支持HiveServer2。首先我们要允许并发终端支持:

<name>hive.support.concurrency</name>

<value>true</value>

HiveServer2使用Zookeeper集群来管理表锁。适合一致性管理。这里我们可以使用Hadoop NameNode HA Zookeeper集群。

<name>hive.zookeeper.quorum</name>

<value>

nn1.hadoop.test.com:2181,nn2.hadoop.test.com:2181,jt1.hadoop.test.com:2181

</value>

因为我们将HIveServer2和HiveMetastore安装在同一台机器上,我们使用同样的配置文件。如果你决定将HiveServer2安装在独立的机器上,你需要用hive.metastore.uris选项来指向元数据。

默认情况,HIveServer2会使用10000端口。但你可以通过修改/etc/defaults/hive-server2文件中的HIVE_PORT参数来更改这个值。启动HIveServer2的命令如下:

Service hive-server2 start

 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广