Monthly Archive: 三月 2015

【翻译】部署hive

安装及配置Metastore:

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hive_metastore_configure.html

安装及配置HiveServer2:

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hiveserver2_configure.html

配置hive运行内存:

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hive_install.html

预安装环境参考:

yarn:http://bananalighter.com/cdh-yarn-installation/

zookeeper: http://bananalighter.com/cdh-install-zookeeper

物理环境:hadoop01、02、03三台机器。

1.Hive metastore server安装

(1) 安装hive包

选用hadoop01作为元数据服务所在机器,安装hive-metastore

yum install hive-metastore hive-server2

(2) 在hadoop02上安装metastore所用的mysql数据库

yum install mysql-server

service mysqld start

chkconfig mysqld on

yum install mysql-connector-java

ln -s /usr/share/java/mysql-connector-java.jar /usr/lib/hive/lib/mysql-connector-java.jar
mysql初始化安装

mysql_secure_installation

[...]

Enter current password for root (enter for none):

OK, successfully used password, moving on...

[...]

Set root password? [Y/n] y

New password:

Re-enter new password:

Remove anonymous users? [Y/n] Y

[...]

Disallow root login remotely? [Y/n] N

[...]

Remove test database and access to it [Y/n] Y

[...]

Reload privilege tables now? [Y/n] Y

All done!

(3) 修改hive-site.xml参数

参照1-(1)表修改参数。

注意以下参数请根据自己实际情况填写,主机、账号及密码不要搞错。

javax.jdo.option.ConnectionURL jdbc:mysql://hadoop01/metastore
javax.jdo.option.ConnectionUserName hive
javax.jdo.option.ConnectionPassword yourpassword
hive.metastore.uris thrift://hadoop01:9083

(4) 创建metastore所用的mysql实例及账号

数据库的示例脚本位置为:/usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.13.0.mysql.sql;

注意hive schema的版本应该与metastore一致,否则会报schema的错。

$ mysql -u root -p

Enter password:

mysql> CREATE DATABASE metastore;

mysql> USE metastore;

mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.13.0.mysql.sql;

 

mysql> CREATE USER 'hive'@'hadoop01' IDENTIFIED BY 'mypassword';

...

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'hadoop01';

mysql> GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'hadoop01';

mysql> FLUSH PRIVILEGES;

mysql> quit;

2.安装Hive server2

(1) 安装hive包

为三台测试机hadoop01~03安装hive server2。

yum install hive-metastore hive-server2

(2) 配置到zookeeper的连接参数

参考表中的内容配置hadoop01。

与Hive server2有关的配置
hive.support.concurrency true Enable Hive’s Table Lock Manager Service
hive.zookeeper.quorum hadoop01,hadoop02,hadoop03 Zookeeper quorum used by Hive’s Table Lock Manager
hive.zookeeper.client.port 2181 The port at which the clients will connect.

然后拷贝hive-site.xml文件到hadoop02、hadoop03的对应位置。

本步骤未正确配置会引发hive server无法获得锁的错误。

3.创建Hive在hdfs上的工作目录

在hdfs上创建 /user/hive/warehouse目录,并将权限修改为1777.

该目录为hive的默认工作目录。如果需要指定,则需要在hive-site.xml文件中配置参数:hive.metastore.warehouse.dir

4.启动hive metastore及hive server2

(1) 启动metastore service

在hadoop01上执行:

service hive-metastore start

(本步骤需要正确部署zookeeper,zookeeper部署参考文初链接)

(2) 启动hive server2

在hadoop01-03上执行:

[root@hadoop01 ~]# service hive-server2 start

Started Hive Server2 (hive-server2):[  OK  ]

(3) 检查日志

检查/var/log/hive目录下*.log文件内容有无异常、报错。有就搜索引擎解决吧。

5.使用配置

(1) reducer设置

参数:hive.exec.reducers.bytes.per.reducer

说明:每个reducer读取的字节数大小。假如输入是10G,本属性值为1G,则系统将会分配10个reducer。

修改方法:

编辑hive-site.xml,添加:

<property>

  <name>hive.exec.reducers.bytes.per.reducer</name>

  <value>256MB</value>

  <description>Size per reducer.</description>

</property>

重启HiveServer2生效。

参数:mapred.reduce.tasks

说明:设置reducer任务数量。设置-1则系统自动根据情况

修改方法:

编辑hive-site.xml,添加:

<property>

<name>mapred.reduce.tasks</name>

<value>-1</value>

</property>

重启HiveServer2生效。

(2) HiveServer2内存

拷贝/etc/hive/conf/hive-env.sh.template 为/etc/hive/conf/hive-env.sh

下面的例子配置HiveServer2及Metastore的运行内存为2G,hive client的总内存为2G

# Hive Client memory usage can be an issue if a large number of clients

# are running at the same time. The flags below have been useful in

# reducing memory usage:

#

 if [ "$SERVICE" = "cli" ]; then

   if [ -z "$DEBUG" ]; then

     export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xmx2048m -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:+UseParNewGC -XX:-UseGCOverheadLimit"

   else

     export HADOOP_OPTS="$HADOOP_OPTS -XX:NewRatio=12 -Xmx2048m -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-UseGCOverheadLimit"

   fi

 fi
 

# The heap size of the jvm stared by hive shell script can be controlled via:

#

 export HADOOP_HEAPSIZE=1024

#

# Larger heap size may be required when running queries over large number of files or partitions.

# By default hive shell scripts use a heap size of 256 (MB).  Larger heap size would also be

# appropriate for hive server (hwi etc).

重启HiveServer2及Metastore生效。

(3) 关闭任务推测式执行

修改hive-site.xml文件,添加:

<property>

  <name>hive.mapred.reduce.tasks.speculative.execution</name>

  <value>false</value>

  <description>Whether speculative execution for reducers should be turned on.</description>

</property>

重启HiveServer2生效

修改mapred-site.xml文件,添加:

<property>

<name>mapreduce.reduce.speculative</name>

<value>false</value>

</property>

重启hadoop-yarn-resourcemanager生效

(4) cli设置

编辑hive-site.xml,添加:

<property>

  <name>hive.cli.print.header</name>

  <value>true</value>

  <description>Whether to print the names of the columns in query output.</description>

</property>

<property>

  <name>hive.cli.print.current.db</name>

  <value>true</value>

  <description>Whether to include the current database in the Hive prompt.</description>

</property>

展示效果:

hive (lesson1)> select * from goods_price;

OK

goods_price.id  goods_price.name        goods_price.price       goods_price.supplier    goods_price.class_name

20151001        mengniu 2.0     yihaodian       niunai

20151002        yili    2.5     yihaodian       niunai

20151003        UHT     3.0     yihaodian       niunai

Time taken: 0.829 seconds, Fetched: 3 row(s)

 

 

 

 

 

HiveQL

参考链接:

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

1.数据定义语言(DDL)

  • 创建、修改、删除数据库

创建数据库

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path]

[WITH DBPROPERTIES (property_name=property_value, …)];

语法解释:

  • 数据库注释:COMMENT
  • 在hdfs上的路径: LOCATION
  • 使用Key-value的方式为数据库注释

使用实例:

create database lesson1test comment ‘lesson1test’ with dbproperties(‘user’=’banana’);

修改数据库的key-value注释

ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, …);

— (Note: SCHEMA added in Hive 0.14.0)

修改数据库的用户

ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;

— (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)

删除数据库

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

使用实例

alter database lesson1test set dbproperties(‘user’=’lighter’);

alter database lesson1test set owner user hdfs;

drop database if exists lesson1test;

  • 创建、截断、删除表(带分区)

创建表

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

[(col_name data_type [COMMENT col_comment], …)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]

[

[ROW FORMAT row_format]

[STORED AS file_format]

| STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)]  — (Note: Available in Hive 0.6.0 and later)

]

[LOCATION hdfs_path]

语法解释:

  • 是否是外部表: EXTERNAL
  • 表格注释: COMMENT
  • 定义分区信息:PARTITIONED BY
  • 行格式化方式(1.决定了是否使用hive自带的序列化函数2.可用于指定属性分隔符): ROW FORMAT

创建表使用实例:

CREATE TABLE goods_price(

id INT,

name STRING,

price FLOAT

)

COMMENT ‘Goods table’

PARTITIONED BY(supplier STRING, class_name STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ‘,’

STORED AS TEXTFILE;

复制表结构:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name

LIKE existing_table_or_view_name

[LOCATION hdfs_path];

使用实例:

create table if not exists copy_table like lesson1.goods_price;

截断表(保留表结构,删除数据):

TRUNCATE TABLE table_name [PARTITION partition_spec];

partition_spec:

(partition_column = partition_col_value, partition_column = partition_col_value, …)

使用实例(可指定一个partition_column,也可都指定):

truncate table copy_table partition (supplier=’yihaodian’,class_name=’shupian’);

truncate table copy_table partition (supplier=’yihaodian’);

删除表(任何删除动作都会删除相关的元数据):

DROP TABLE [IF EXISTS] table_name [PURGE];     — (Note: PURGE available in Hive 0.14.0 and later)

语法解释:

不指定PURGE,则被删除数据被移到.Trash/Current。

使用PURGE则直接删除(不可恢复)。

使用实例:

drop table if exists copy_table;

  • 修改表、分区、列

修改表名(保留表结构,删除数据):

ALTER TABLE table_name RENAME TO new_table_name;

使用实例:

alter table goods_price rename to new_goods_price;

增加表分区(未修改表结构,只是多了一个分区值):

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec

[LOCATION ‘location1’] partition_spec [LOCATION ‘location2′] …;

partition_spec:

: (partition_column = partition_col_value, partition_column = partition_col_value, …)

使用实例:

alter table new_goods_price add if not exists partition (supplier=’taobao’,class_name=’shupian’);

alter table new_goods_price add if not exists partition (supplier=’jingdong’,class_name=’shupian’) location ‘/user/hive/warehouse/lesson1.db/goods_price/supplier=jingdong/class_name=shupian’;

表知识扩展——内部表和外部表

表类型 语句 是否将数据拷贝到warehouse 删除表是否删除数据
内部表 create table;
外部表 create external table;

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径。

内部表不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据

表知识扩展——表分区

意义:避免全表扫描。Where语句采用分区限定的话,表查询会限制在分区内进行,提高效率和准确率。

  • 数据通过存储目录划分分区。
  • 指定多个分区时,hdfs上存储目录按照分区创建顺序形成树形结构。
  • 分区字段的选择:时间段、不同服务的数据、IP段等等。

两个分区时的二级树形存储目录(先supplier后class_name),由下图可见supplier目录是class_name的上级目录。

QQ截图20150330151934

2.数据操作语言(DML)

  • 文件数据导入表

命令:

LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]

语法解释:

  • 指定数据文件目录: INPATH
  • 覆盖原有数据: OVERWRITE
  • 指定分区(顺序无先后,但需要明确指定每一个分区)

partition(supplier=’yihaodian’,class_name=’niunai’);

使用实例:

load data local inpath ‘/tmp/20150313/niunai’ into table goods_price partition(supplier=’yihaodian’,class_name=’niunai’);

  • 查询结果数据插入表

命令(增加数据):

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …)] select_statement1 FROM from_statement;

使用实例:

insert into table copy_table partition(class_name=’niunai’,supplier=’yihaodian’) select id,name,price from goods_price;

命令(覆盖原有数据):

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …) [IF NOT EXISTS]] select_statement1 FROM from_statement;

使用实例:

insert overwrite table copy_table partition(class_name=’niunai’,supplier=’yihaodian’) select id,name,price from overwrite_table;

  • UPDATE&DELETE

命令:

UPDATE tablename SET column = value [, column = value …] [WHERE expression]

DELETE FROM tablename [WHERE expression]

使用实例:

Hive 0.14支持,目前最新发行版为Hive 0.13

 

安装HUE

Configuring CDH Components for Hue

参考:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_cdh_hue_configure.html

Hue install

yum install hue
yum install hue-server

HttpFS Configuration

配置HUE成为其他用户及组的代理,HUE将接管其他用户的任意动作。

HttpFS: Verify that /etc/hadoop-httpfs/conf/httpfs-site.xml has the following configuration:

<!-- Hue HttpFS proxy user setting -->
<property>
  <name>httpfs.proxyuser.hue.hosts</name>
  <value>*</value>
</property>
<property>
  <name>httpfs.proxyuser.hue.groups</name>
  <value>*</value>
</property>

Verify that core-site.xml has the following configuration:

<property>  
<name>hadoop.proxyuser.httpfs.hosts</name>  
<value>*</value>  
</property>  
<property>  
<name>hadoop.proxyuser.httpfs.groups</name>  
<value>*</value>  
</property>

如果需要新添上述参数,则要重启hadoop以生效。

root下编辑/etc/hue/conf.empty/hue.ini

更新hadoop.hdfs_clusters.default.webhdfs_url参数(直接在文中搜索webhdfs_url)。

将webhdfs_url参数改为如下(注意是14000端口):

webhdfs_url=http://FQDN:14000/webhdfs/v1/

Hive Configuration

HUE需要指向HiveServer2。因此需要更新hue.ini如下:

[beeswax]
  # Host where Hive server Thrift daemon is running.
  # If Kerberos security is enabled, use fully-qualified domain name (FQDN).
  ## hive_server_host=localhost

 hive_server_host=localhost


 # Port where HiveServer2 Thrift server runs on.
 ## hive_server_port=10000

 hive_server_port=10000


 # Hive configuration directory, where hive-site.xml is located
 ## hive_conf_dir=/etc/hive/conf

 hive_conf_dir=/etc/hive/conf

 Start Hue server

service hue start

 

 

 

 

mysql (登录)权限

对于多个不同机器访问数据库的权限,需要在权限分配时指定其主机名,并同时指定密码。

如:hadoop02、hadoop03两台机器要登录mysql,需要赋权:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'hadoop02' identified by 'yourpassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'hadoop03' identified by 'yourpassword';
FLUSH PRIVILEGES;

使用通配符无效,这一条不太科学。以后有机会再验证:

#本命令为何无效? 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' identified by 'yourpassword';

 

【翻译】Hive 架构设计

原文:https://cwiki.apache.org/confluence/display/Hive/Design

system_architecture

Hive 架构

图左展现了Hive的组件及其与hadoop的接口。

  • UI——用户接口。将用户查询或其他操作提交到系统。2011年以后拥有命令行接口及基于web的图形化接口。
  • Driver——接收查询的组件。它实现了会话操作的概念,提供了可基于JDBC/ODBC接口执行及获取API的模型。
  • Compiler——解析查询,在metastore的表和分区metadata的帮助下,对不同查询块、查询表达式进行语义分析,最终生成执行计划。
  • Metastore——存储仓库中不同表及分区,包括列及列属性的全部的结构信息。串行器及解串行器需要读写数据及存储对应数据的HDFS文件。
  • Execution Engine——执行Compiler产生的执行计划。执行计划是各阶段的有向无环图。执行引擎管理不同阶段的依赖,并在恰当的系统组件上执行前述阶段。

上图同时展现了一次查询的处理过程。UI调用了Driver的执行接口(step 1)。Driver创建了一个查询会话,并将查询发送给Compiler来生成执行计划(step 2)。Compiler从metastore中获取必要的元数据(steps 3和4)。元数据用来检查查询树中的表达式格式,并根据查询预期来削减分区。Compiler产生的执行计划(step 5)是map或reduce各种任务阶段的有向无环图,是一次元数据操作或者HDFS的操作。对map/reduce阶段来说,执行计划包含map的执行树(执行树在mappers上执行)以及reduce的执行树(需要reducers的操作)。执行引擎将各种状态提交给恰当的组件(steps 6, 6.1, 6.2 and 6.3)。每个任务中关联了表或中间输出的解串器被用于从HDFS中读取行,前述操作过程将通过相应的操作树。一旦产生了输出,结果会被串行器写入HDFS的临时文件(发生在不需要reduce的mapper中)。临时文件用于向随后的map/reduce执行计划阶段提供数据。DML操作的最终临时文件将被移动到表所在位置,保证脏数据不会被读取到。对于查询来讲,临时文件的内容是作为Driver获取命令的一部分,由执行引擎直接从HDFS读取的(steps 7、8和9)。

Hive 数据模型

Hive中的数据组织形式为:

  • 表——与关系型数据库中的表类似。可以过滤、投影、连接和合并。此外,表中所有数据存储在HDFS中。Hive同时支持外部表的概念,一个表可以在一个已存在的HDFS文件或目录上创建,方式是向表格创建DDL提供对应的目录。表内行的组织形式为各数据类型的列,与关系型数据库类似。
  • 分区——每个表可以拥有一到多个分区键,用来定义数据储存方式。例如:表T的数据分区ds用于存储日期,其数据文件在HDFS上存储目录为:<table location>/ds=<date>。分区使得系统可以通过查询预测减少检索的数据量。例如:一个针对T表中行的查询,如果符合T.ds = ‘2008-09-01’ 的预期,则仅需要查找 <table location>/ds=2008-09-01/ 目录下的文件。
  • 桶——(你们大学计算机数据结构课程的内容终于用上了!)请参考桶排序与哈希表的相关知识。在Hive中,每个桶作为分区目录中的一个文件存储。桶使得系统可以依据数据例子迅速定位查询(有一些查询是使用表上的SAMPLE字句完成的)。

除了常见的列数据类型(整数、浮点数、字符串、日期和布尔值),Hive同时支持数组和图。此外,用户可以组合基本类型来自定义数据类型。类型系统与序列化及对象检查器接口(object inspector interfaces)紧密捆绑。用户可以通过实现对象检查器来创建类型,使用对象检查器可以实现对象在HDFS上的序列化。前述两个接口使得Hive具有了扩展能力,使得Hive可以理解其他数据格式及复杂类型。内建对象检查器为创建复杂类型提供了基础类型。图和数组格式内建了诸如大小、索引等功能。内嵌数据类型通过圆点查看,例如a.b.c = 1, 这个公式查看了a的b域内的c域,并与1进行比较。

METASTORE

 动机

元数据存储提供了两个重要却常被忽视的数据仓库功能:数据抽象及数据发现。

数据抽象:如果没有Hive提供的数据抽象功能,用户需要在查询的时候同时提交数据格式、数据提取器及数据装载信息。在Hive中,前述数据在表创建时即给出,每次表被引用时都会重用。这与传统数据仓库很相似。

数据发现:使得用户可以发现及浏览数据仓库中的相关或者特定数据。可以使用元数据构建其他工具来对外提供数据,丰富数据信息,提高可用性等。

Hive通过提供元数据仓库实现了前述两大功能。元数据仓库服务与Hive查询进程紧密集成在一起,因此hive数据及其元数据是同步的。

Metadata Objects

  • 数据库——表命名空间。未来可用作管理单元。非用户提供的表将放入default数据库。
  • 表——一张表的元数据包括列的清单,所有人信息,存储信息,还包括序列化信息。还可以包含任何用户提供的键值、数据值。存储信息包含其下数据的存储路径、文件输入输出格式及桶信息。序列化信息包括串行器解串器的实现类,以及其他实现所需信息。所有信息都可以在建表时指定。
  • 分区——每个分区可以拥有自己的列、序列化及存储信息。

Metastore Architecture

元数据存储是数据库或文件对象的存储仓库。数据库备份仓库采用……(这段翻译的性价比有点低,意会吧)

Hive Query Language

HiveQL是类SQL语言。创建表,表载入数据,表查询上与SQL语法类似。允许用户嵌入MapReduce脚本。兼容任何语言编写的,使用简单行数据流接口的脚本——从标准输入读入行,向标准输出写入行。另一个HiveQL独有的特性是多表插入(理解为将一份输入看成多个表,提供给多个查询请求,而且其扫描过程还是共享的:扫一次,提供给多个查询)。这个概念中,用户可以对一个输入使用一条HiveQL语句执行多种查询。Hive优化了查询,可以在多个查询中共享对输入数据的扫描,这将查询的吞吐能力提高了几个量级。其他内容见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual。

Compiler

  • 语法分析器——将查询字符串转化为语法分析树的表述。
  • 语义分析器——将语法分析树转化为内部查询表述(依然基于块而不是执行树)。
  • 逻辑计划发生器——将内部查询表述转化为逻辑计划,逻辑计划由执行器的树组成。
  • 查询计划发生器——将逻辑计划转化为一系列的MapReduce任务。

 

 

cdh zookeeper安装

一、安装zookeeper包

在hadoop01~03上安装:

yum install zookeeper zookeeper-server

二、生成myid

hadoop01:

service zookeeper-server init --myid=1

hadoop02:

service zookeeper-server init --myid=2

hadoop03

service zookeeper-server init --myid=3

三、编辑配置文件(以下是默认参数)

/etc/zookeeper/conf/zoo.cfg

maxClientCnxns=50
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/var/lib/zookeeper
# the port at which the clients will connect
clientPort=2181
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

四、测试zookeeper

zookeeper-client -server hostname:port

 

参考:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_zookeeper_package_install.html

 

 

【翻译】安装Hive

参考:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_hive_install.html

一、安装Hive

1.安装hive包

yum install hive-metastore hive-server2

2.配置hive组件的堆大小及垃圾回收(暂时保持默认)

 

二、配置Hive元存储

Hive元数据服务使用关系型数据库存储Hive表及分区的信息。使用元数据服务API对外提供前述信息的客户端连接。接下来的部分介绍部署选项及推荐配置。

1.元数据部署模式

嵌入式模式

hive_embeddedmetastore

 

默认安装模式。将元数据存储在derby中。数据库及及元数据服务都嵌入在HiveServer进程中,随HiveServer一起启动。这种模式配置最简单,但同时仅支持一个活动用户,不能用于生产。

本地模式

hive_localmetastore

Hive元数据服务内嵌在HiveServer中,但元数据数据库在单独进程中执行,并可以在分离的主机上。内嵌的元数据服务通过JDBC与元数据数据库通信。

远程模式(CDH推荐的生产环境部署方案)

hive_remotemetastore

元数据服务在独立的JVM进程中,HiveServer2, HCatalog, Cloudera Impala™,及其他进程与元数据服务通过网络API(通过 hive.metastore.uris 参数进行配置)通信。元数据服务通过JDBC与元数据数据库通信(通过 javax.jdo.option.ConnectionURL 参数进行配置)。元数据服务、元数据数据库及HiveServer可以在同一主机上运行,但是将HiveServer分离到单独的主机可以提供更好的可用性和扩展性。

远程模式较之本地模式先进之处在于:远程模式不需要管理员为每一个Hive用户共享JDBC登陆信息。HCatalog需要这种模式。

2.安装元数据数据库

 (1)安装mysql

yum install mysql-server
service mysqld start
yum install mysql-connector-java
ln -s /usr/share/java/mysql-connector-java.jar /usr/lib/hive/lib/mysql-connector-java.jar
mysql_secure_installation
[...]
Enter current password for root (enter for none):
OK, successfully used password, moving on...
[...]
Set root password? [Y/n] y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
[...]
Disallow root login remotely? [Y/n] N
[...]
Remove test database and access to it [Y/n] Y
[...]
Reload privilege tables now? [Y/n] Y
All done!
chkconfig mysqld on

 (2)创建mysql实例及账号

$ mysql -u root -p
Enter password:
mysql> CREATE DATABASE metastore;
mysql> USE metastore;
mysql> SOURCE /usr/lib/hive/scripts/metastore/upgrade/mysql/hive-schema-0.12.0.mysql.sql;

mysql> CREATE USER 'hive'@'hadoop01' IDENTIFIED BY 'mypassword';
...
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'hive'@'hadoop01';
mysql> GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'hadoop01';
mysql> FLUSH PRIVILEGES;
mysql> quit;

3.配置元数据服务相关参数(hive-site.xml)

配置连接到mysql数据库的参数。可以将此配置文件传播到每一台hive主机上。每一台Hive的相关主机(client, metastore, HiveServer)都需要配置hive.metastore.uris。该文件中其他的参数仅用于配置metastore服务所在主机。

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://hadoop01/metastore</value>
  <description>the URL of the MySQL database</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hive</value>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>mysql2015</value>
</property>

<property>
  <name>datanucleus.autoCreateSchema</name>
  <value>false</value>
</property>

<property>
  <name>datanucleus.fixedDatastore</name>
  <value>true</value>
</property>

<property>
  <name>datanucleus.autoStartMechanism</name> 
  <value>SchemaTable</value>
</property> 

<property>
  <name>hive.metastore.uris</name>
  <value>thrift://hadoop01:9083</value>
  <description>IP address (or fully-qualified domain name) and port of the metastore host</description>
</property>

<property>
<name>hive.metastore.schema.verification</name>
<value>true</value>
</property>

 三、配置HiveServer2

1.向hive-site.xml添加参数

适当的配置Hive表锁管理器。这需要安装zookeeper。

<property>
  <name>hive.support.concurrency</name>
  <description>Enable Hive's Table Lock Manager Service</description>
  <value>true</value>
</property>

<property>
  <name>hive.zookeeper.quorum</name>
  <description>Zookeeper quorum used by Hive's Table Lock Manager</description>
  <value>hadoop01,hadoop02,hadoop03</value>
</property>

2.创建hive在hdfs上的工作目录

在hdfs上创建 /user/hive/warehouse目录,并将权限修改为1777。

hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod 1777 /user/hive/warehouse

四、打开服务

1.启动元数据服务

在hadoop01上:

service hive-metastore start

2.启动hive server2

在hadoop01~03上:

[root@hadoop01 ~]# service hive-server2 start
Started Hive Server2 (hive-server2):[  OK  ]

3.检查启动日志(/etc/hive/conf/hive-site.xml),没有报错则可测试hive。

五、测试使用

 1.测试连接

[root@hadoop01 hive]# beeline 
Beeline version 0.13.1-cdh5.3.1 by Apache Hive
beeline> !connect jdbc:hive2://hadoop01:10000 hive yourpassword org.apache.hive.jdbc.HiveDriver
Connecting to jdbc:hive2://hadoop01:10000
Connected to: Apache Hive (version 0.13.1-cdh5.3.1)
Driver: Hive JDBC (version 0.13.1-cdh5.3.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop01:10000>

 2.测试执行

0: jdbc:hive2://hadoop01:10000> show tables;                                                                       
+-----------+--+
| tab_name  |
+-----------+--+
+-----------+--+
No rows selected (0.232 seconds)
0: jdbc:hive2://hadoop01:10000>

 

大功告成。