本文是学习时的自我总结,用于日后温习。如有错误还望谅解,不吝赐教
一、安装方式(内嵌模式,本地模式远程模式)
安装环境以及前提说明:
Hive是依赖于hadoop系统的,因此在运行Hive之前需要保证已经搭建好hadoop集群环境。
本例中使用的hadoop版本为2.6.1,Hive版本为2.1.1版。
1.Hive的3种安装方式:
1)内嵌模式(元数据保存在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错)
2)本地模式(本地安装mysql 替代derby存储元数据)
3)远程模式(远程安装mysql 替代derby存储元数据)
2.内嵌模式参数:
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/usr/local/hive/bin/metastore_db;create=true</value>
描述了hive元数据存储的位置
3.Mysql的几个操作
1)查询平台本身的Mysql版本和安装的MySQL是否是同一个版本,不一致要删除旧的数据库
2)安装缺少的两个rpm包:libaio 和 perl。联外网(虚拟机要桥接到外网,配置外网后如果ping IP可行,ping域名不行,则需要把ifcfg-eth0复制一份拷贝到dns中)或下载后拷贝到服务器
3)按项目规模选择合适的配置文件
①my-small.cnf是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。
②my-medium.cnf是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。
③my-large.cnf是为专用于一个SQL数据库的计算机而设计的。由于它可以为该数据库使用多达512MB的内存,所以在这种类型的系统上将需要至少1GB的RAM,以便它能够同时处理操作系统与数据库应用程序。
④my-huge.cnf是为企业中的数据库而设计的。这样的数据库要求专用服务器和1GB或1GB以上的RAM。
这些选择高度依赖于内存的数量、计算机的运算速度、数据库的细节大小、访问数据库的用户数量以及在数据库中装入并访问数据的用户数量。随着数据库和用户的不断增加,数据库的性能可能会发生变化。
4)考虑安全问题要对root用户设置密码并删除空用户;创建一个普通用户,并给普通用户赋予localhost和%(远程)的权限;为普通用户创建一个数据库
5)查看权限和更新权限
SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;
UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='hive';
6)初始化MySQL数据库
schematool -dbType mysql -initSchema
4.本地模式参数
1)<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value>
为Hive创建的访问MySQL的用户的库空间
2)<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
MySQL的JDBC驱动(需要把mysql的驱动包放到目录 <HIVE_HOME>/lib 中)
3)<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
为Hive创建的访问MySQL的用户
5.远程模式需要配置那些文件
1)配置环境变量:/.bashrc
2)配置Hadoop和Hive的路径:hive-env.sh
3)hive-default.xml.template --> hive-site.xml
4) hive.server2.thrift.port– TCP 的监听端口,默认为10000。
hive.server2.thrift.bind.host– TCP绑定的主机,默认为localhost
5)启动
hive --service metastore &
hive --service hiveserver2 &
二、Hive
1. 什么是Hive
是建立在Hadoop基础上的数据仓库基础架构。可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为QL,类似于SQL语句。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的mapper和reducer来处理内建的mapper和 reducer 无法完成的复杂的分析工作。
Hive 是 SQL解析引擎,它将SQL语句转译成Map/Reduce Job然后在Hadoop执行。
Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在Map/Reduce Job里使用这些数据。
2. Hive实现WordCount
- 创建一个数据库,如create database word;
- 建表
create external table word_data(line string) row format delimited fields terminated by '\n' stored as textfile location '/home/hadoop/worddata';
- 根据MapReduce的规则,我们需要进行拆分,把每行数据拆分成单词,这里需要用到一个hive的内置表生成函数(UDTF):explode(array),参数是array,其实就是行变多列:
create table words(word string);
insert into table words select explode(split(line, " ")) as word from word_data;
split是拆分函数,跟java的split功能一样,这里是按照空格拆分,所以执行完hql语句,words表里面就全部保存的单个单词 - 这样基本实现了,因为hql可以group by,所以最后统计语句为:
select word, count(*) from word.words group by word;
注释:word.words 库名称.表名称,group by word这个word是create table words(word string) 命令创建的word string
3.Java连接Hive查询表信息
public class HiveTest {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static ResultSet res;
public static void main(String[] args) throws Exception {
Class.forName(driverName);//加载驱动
Connection conn = DriverManager.getConnection(
"jdbc:hive2://192.168.111.219:10000/default", "hive", "123456");//建立连接
Statement stmt = conn.createStatement();//声明
res = stmt.executeQuery("select * from userinfo");//用声明stmt对象下的executeQuery方法查询
while (res.next()) {
System.out.println(res.getInt(1) + "\t" + res.getString(2));
}
res.close();
stmt.close();
conn.close();
}
}
4.Hive支持的数据类型
1)基本数据类型:数值类型、布尔型和字符串(TIMESTAMP、BINARY)
TINYINT 1字节 有符号整数
SMALLINT2字节 有符号整数
INT 4字节 有符号整数
BIGINT 8字节 有符号整数
FLOAT 4字节 单精度浮点数
DOUBLE 8字节 双精度浮点数
2)复杂数据类型:ARRAY、MAP 和 STRUCT
5.Hive的数据类型转换
1)隐式类型转换的规则:
任何整数类型可以隐式地转换为一个范围更广的类型。
所有整数类型、FLOAT 和 STRING 类型都能隐式转换为 DOUBLE。
TINYINT、SMALLINT 和 INT 都可以转换为 FLOAT。
BOOLEAN 类型不能转换为其他任何类型。
TIMESTAMP 可以被隐式转换为 STRING。
2)显示数据类型转换(CAST)
例如,CAST(‘1’ AS INT) 把字符串’1’转换成整数值 1。
6.内表和外表
EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)。
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
11.Hive的三种启动方式
1) hive 命令行模式
进入hive安装目录,输入bin/hive的执行程序,或者输入 hive –service cli
用于linux平台命令行查询,查询语句基本跟mysql查询语句类似
2) hive web界面的启动方式
bin/hive –service hwi (& 表示后台运行)
用于通过浏览器来访问hive,感觉没多大用途,浏览器访问地址是:127.0.0.1:9999/hwi
3) hive 远程服务 (端口号10000) 启动方式
bin/hive –service hiveserver2 &(&表示后台运行)
用java,python等程序实现通过jdbc等驱动的访问hive就用这种起动方式了,这个是程序员最需要的方式
二、数据库
1.hive会为每个数据库创建一个目录。数据是库中的表将会以这个数据库目录的子目录形式存储。
有一个例外就是default数据中的表,因为这个数据库本身没有自己的目录。
数据库所有的目录位于属性hive.metastore.warehouse.dir所指定的顶层目录之后。
用户可以通过如下命令来修改这个默认的位置
create database financials location '/my/preferred/directory';
- 建立数据库:create database if not exists financials;
- 显示Hive中所包含的数据库:show databases;
- 使用正则表达式匹配来筛选出需要的数据库名:show databases like 'h.*';
- 为数据库增加一个描述信息并查看:create database financials comment 'Holds all financial tables'; describe database financials
- 切换数据库:use financials
- 显示当前数据库:set hive.cli.print.current.db=true
- 删除数据库:drop database if exists financials(库中没有表); drop database if exists financials CASCADE;(库中有标强删)
- 用root登陆Mysql,给用户添加CREATE,DROP权限:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON hive.* TO hive@'%' identified by '123456';
FLUSH PRIVILEGES;
三、数据类型举例
1、建表命令
CREATE TABLE employee(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)
row format delimited fields terminated by '\001'
collection items terminated by '\002'
MAP KEYS terminated by '\003'
LINES terminated by '\n'
stored as textfile;
2、查看表结构:describe employee;
3、导数据:load data local inpath '/root/employees.txt' into table employee;
4、查询表内容
SELECT * FROM employee;
SELECT name ,salary FROM employee;
SELECT name , subordinates[0] FROM employee;
SELECT name , deductions["State Taxes"] FROM employee;
SELECT name , address.city FROM employee;
四、建表方式
1.直接建立表
2.指定表空间建立表
CREATE TABLE mydb.employee(
name STRING,
subordinates ARRAY<STRING>)
row format delimited fields terminated by '\001'
collection items terminated by '\002'
LINES terminated by '\n'
stored as textfile;
3.复制表结构建立新表(LIKE)
CREATE TABLE IF NOT EXISTS copy_employee LIKE employee;
4.复制指定表字段结构及数据并建立表(AS SELECT)
CREATE TABLE copy_part_employee AS SELECT name,subordinates from employee;
五、加载数据
1.从本地加载数据到表中:load data local inpath '/root/employees.txt' into table employee;
从HDFS中加载数据到表中:load data inpath '/test/employees.txt' OVERWRITE into table employee;
2.从原有的表employee中追加数据到表copy_employee:
insert INTO table copy_employee select * from employee
从原有的表employee中加载数据到表copy_employee,并替换掉原来的数据
insert OVERWRITE table copy_employee select * from employee;
3.创建表的时候通过select加载数据:
create table cr_employee as SELECT * from employee;
创建表的时候通过select 指定建立的字段并加载指定字段的数据
create table cr_employee1 as SELECT name from employee;
4.直接把与表结构相符的数据文件复制到表指定的存储位置
dfs -put /root/employees.txt /user/hive/warehouse/employee;
六、表操作
1.表重命名(RENAME TO):ALTER TABLE employee RENAME TO rm_emp;
2.修改列信息(CHANGE COLUMN对某个字段进行重命名,并修改其位置、类型或者注释):
ALTER TABLE employee CHANGE COLUMN
name rename STRING COMMENT 'The people name';
3.增加列(ADD COLUMNS在表的最后添加字段)
ALTER TABLE employee ADD COLUMNS(
addcol1 STRING COMMENT 'Application name',
addclo2 INT COMMENT 'The current session id');
4.删除列或者替换列(REPLACE COLUMNS替换原来所有的字段)
ALTER TABLE employee REPLACE COLUMNS(
rename STRING COMMENT 'name to rename',
resalary FLOAT COMMENT 'salary to resalary',
resub ARRAY<STRING> COMMENT 'subordinates to resub');
八、分区和分桶、视图
1. 分区:
所谓分区(Partition) 对应于数据库的 Partition 列的密集索引。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。
有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念。
分区表指的是在创建表时指定的partition的分区空间。一个表可以拥有一个或者多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
分区是以字段的形式在表结构中存在,通过describetable命令可以查看到字段存在,但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)
2. 分桶
桶是更为细粒度的数据范围划分。
Hive采用对 列值哈希 除以 桶的个数 求余 的方式决定该条记录存放在哪个桶当中
优点:获得更高的查询处理效率;使取样(sampling)更高效。
3. 视图
和关系数据库中的视图一个概念,可以向用户集中展现一些数据,屏蔽一些数据,提高数据库的安全性。
九、Hive中order by、sort by、distribute by、cluster by的区别
order by对输入做全局排序,只有一个reducer(多个reducer无法进行全局),输入规模较大时,需要较长的计算时间。与数据库的区别在于必须指定limit,因为数据量大时也只在一台服务器上,会出现无法输出结果的情况,进行limit,就只有n*map number条记录,一个reduce也可以处理
sort by在数据进入reducer前排序,sort by只保证同一reduce中的数据可以按指定字段排序
distribute by按照指定的字段对数据进行划分到不同的输出reduce/文件中
cluster by具有distribute by和sort by的功能,但是排序只能是倒排
十、Hive在建表时,可以通过'STORED AS FILE_FORMAT' 指定存储文件格式。有以下几种:
- TextFile:存储空间较大,压缩之后的文件不能分割与合并,查询效率低;可直接存储,加载速度最快;这种是默认的格式。
- SequenceFile:hadoop API提供的一种二进制文件支持,存储空间最大,可分割与合并,查询效率高,需要text文件转换来加载
- RcFile:是一种行列存储相结合的存储方式。
1)将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block;
2)块数据列式存储,有利于数据压缩和快速的列存取。查询效率最高、存储空间最小、但加载最慢。
十一、Sqoop = Sql to Hadoop
- Sqoop的作用:允许用户将数据从结构化存储器抽取到Hadoop 中,用于如MapReduce、Hive的进一步的处理。Sqoop可以将这些结果导回数据存储器,供其他客户端使用。
- Sqoop import命令参数的含义
sqoop import
--connect jdbc:mysql://localhost/hadoopguide #jdbc连接字符串
--table widgets #读取的表名
-m 1 map #任务的个数
--target-dir /widgets #hdfs目标路径
3. Sqoop导出命令的含义
sqoop export --connect jdbc:mysql://localhost/hadoopguide -m 1 --table sales_by_zip --export-dir /user/hive/warehouse/zip_profits --input-fields-terminated-by '\0001'
--connect mysql连接字符串
-m mapreduce的个数
--table 表明
--export-dir 导出路径
--input-fields-terminated-by 输入字段的分割字符