Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,
可以用来进行数据提取转化加载(ETL),这是一种可以存储、
查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的
类SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。同时,
这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和
reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
具体介绍请看:
具体架构是:
主要分为以下几个部分:
- 用户接口,包括 CLI,Client,WUI。
- 元数据存储,通常是存储在关系数据库如 mysql, derby 中。
- 解释器、编译器、优化器、执行器。
- Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算。
- 用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。
- Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
- 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。
- Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from tbl 不会生成 MapRedcue 任务)。
Hive 将元数据存储在 RDBMS 中,有三种模式可以连接到数据库:
1.Single User Mode: 此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test
2.Multi User Mode:通过网络连接到一个数据库中,是最经常使用到的模式。
3.Remote Server Mode:用于非 Java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer,客户端利用 Thrift 协议通过 MetaStoreServer 访问元数据库
在原数据的存储中,本文章使用第二种模式。
使用的包有:
1.hive-0.6.0.tar.gz 2.mysql-5.5.9-linux2.6-x86_64.tar.gz 3.mysql-connector-java-5.1.11-bin.jar
配置步骤:
1.cd /data && tar -zxvf hive-0.6.0.tar.gz && mv mysql-connector-java-5.1.11-bin.jar hive-0.6.0/lib
2. chown -R hadoop:hadoop hive-0.6.0
3. cd /data/hive-0.6.0/conf && vi hive-site.xml
//以下是配置mysql jdbc的数据源,按需填写
4.vi hive-log4j.properties
在这里我只配置:hive.log.dir=/data/hive-0.6.0/log //目录需存在
可以不进行配置,默认为/tmp/${system user}
5. useradd mysql
6. cd /data && tar -zxvf mysql-5.5.9-linux2.6-x86_64.tar.gz && ln -s /data/mysql-5.5.9-linux2.6-x86_64 /usr/local/mysql
7. chown -R mysql:mysql /usr/local/mysql /data/mysql-5.5.9-linux2.6-x86_64
8. 配置/etc/my.cnf
9.cd /data/mysql-5.5.9-linux2.6-x86_64/ && MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0scripts/mysql_install_db --user=mysql
10. /etc/init.d/mtysql.server start
11.bin/mysql -u root //按需修改root密码 这里省略
12. mysql>CREATE USER 'hadoophive'@'%' IDENTIFIED BY '123456';
13. mysql>GRANT ALL PRIVILEGES ON *.* TO 'hadoophive'@'%'
到这里你可以启动hive,如果启动后能登陆出现hive>,那安装算告一段落了
14.cd /data/hive-0.6.0/bin && ./hive --service hiveserver 10000 > /data/hive-0.6.0/logs/stdout_${_time}.log 2> /data/hive-0.6.0/logs/stderr_${_time}.log &
15.cd /data/hive-0.6.0/bin && ./hive
结果如下:
[hadoop@hadoop-237-13 bin]$ ./hive
Hive history file=/tmp/hadoop/hive_job_log_hadoop_201108171926_25725236.txt
hive>
额外测试:
一。创建表
1.hive>create table test(id INT,name STRING);
2.show tables;
出现你的表就代表操作成功。
二。使用外部数据
$HADOOP_HOME/bin/hadoop fs -mkdir /img
$HADOOP_HOME/bin/hadoop fs -put access.log /img
hive>CREATE EXTERNAL TABLE IMG_ANA(clientIp STRING,tmp1 STRING,tmp2 STRING,time STRING,finename STRING,status STRING,size INT,reffer STRING,useragent STRING,tmp3 STRING,machineip STRING,mastatus STRING,tmp4 INT,tmp5 STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY "|" STORED AS TEXTFILE LOCATION '/img/acchive';
具体参数语法请查看
Create Table CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常。
EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数 据会被一起删除,而外部表只删除元数据,不删除数据。
LIKE 允许用户复制现有的表结构,但是不复制数据。
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表的具体的列的数据。
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行 CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。
表名和列名不区分大小写,SerDe 和属性名区分大小写。表和列的注释是字符串。
$HADOOP_HOME/bin/hadoop fs -ls /img 能看出/img/acchive证明创建成功
再做一次数据导入$HADOOP_HOME/bin/hadoop fs -put access.log /img/acchive
hive>select * from iIMG_ANA limit 10;返回数据则为成功啦。
hive搭建很简单,要看看如何使用起来才行