Hive的安装与MySQL结合
#HIVE可以在任意节点搭建,实验在master
链接:http://pan.baidu.com/s/1i4LCmAp 密码:302x hadoop+hive下载
##原封不动的复制,必死无疑,请根据实际填写相关参数和路径
1、 Hive的基础设施
a、基于已经搭建好的hadoop
b、下载hive版本,注意和hadoop对应起来
2、安装hive
a、下载好的包解压到/usr/local/命名为hive
tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /usr/local
cd /usr/local
mvapache-hive-1.2.1-bin hive
b、设置环境变量
vim/etc/profile
exportHIVE_HOME=/usr/local/hive
exportHIVE_CONF_DIR=/usr/local/conf
exportPATH=$PATH:$HIVE_HOME/bin
exportHIVE_LIB=$HIVE_HOME/lib
到此就可以启动hive
[root@mycat ~]# hive
Logging initialized using configuration injar:file:/usr/local/hive/lib/hive-common-1.2.1.jar!/hive-log4j.properties
hive> show databases;
OK
default
Time taken: 1.096 seconds, Fetched: 1row(s)
默认情况下,Hive元数据保存在内嵌的Derby 数据库中,只能允许一个会话连接,只适合简单的测试。为了支持多用户多会话,则需要一个独立的元数据库,我们使用 MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。
二、使用MySQL存储元数据
1、启动mysql5.6版本(操作过程略)
2、配置hive文件,配置文件在/usr/local/hive/conf/目录下有.template的模板文件,复制为hive-env.sh
[root@mycat conf]# cp hive-env.sh.templatehive-env.sh
[root@mycat conf]# vim hive-env.sh
##这里的配置和/etc/profile重复,可以不配置,配置环境变量即可
1、环境变量
exportHADOOP_HEAPSIZE=1024
HADOOP_HOME=/usr/local/hadoop
export HIVE_CONF_DIR=/usr/local/hive/conf
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
2、复制一个从模版文件复制一个hive-site.xml的文件
cp /usr/local/hive/conf/hive-default.xml.template ./hive-site.xml
通过name标签里的值找到value,修改值,配置文件下载:
http://down.51cto.com/data/2260702
##原封不动的复制,必死无疑,请根据实际填写相关参数和路径,标记红色的注意修改自己的实际
#需要在数据库里添加存储元数据的库
##连接数据库的用户名和密码,授权用户名和密码
配置输出的日志信息
hive.log.dir=/home/hive
hive.log.file=hive.log
log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter
3、 根据配置创建HIVE存储数据的目录
mkdir /home/hive/tmp -p
4、 配置jdbc连接器
1、下载包并解压
2、拷贝mysql-connector-java-5.1.6-bin.jar 到hive 的lib下面
若在操作删除表的时候发现提示:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException
则需要替换mysql-connector-java包的版本
链接:http://pan.baidu.com/s/1qXIGeSG 密码:iykt 下载包
cp mysql-connector-java-5.1.6-bin.jar /usr/local/hive/lib/
页面提示
http://192.168.1.114:50070/explorer.html#/home提示这个需要修改
Permission denied: user=dr.who, access=READ_EXECUTE,inode="/home":root:supergroup:drwx-wx-wx
在vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml添加如下,后重启
#配置完这些把namenode节点重启生效
测试hive操作可以在mysql显示及在HADOOP页面也能展示出来
登陆hive
5.2创建内部表
内部表特点:数据加载到内部表中是,如果数据在本地会在将本地数据拷贝一份到内部LOCATION指定的目录下,如果数据在hdfs上,则会将hdfs中的数据mv到内部表指定的LOCATION中。删除内部表时,会删除相应LOCATION下的数据。
create table neibu_table(id int);
show tables #进行查看
hive在hdfs中的默认位置是/user/hive/warehouse,该位置可以修改,是由配置文件hive-site.xml中属性hive.metastore.warehouse.dir决定的,会在/home/hive/warehouse/testdb.db下创建student目录。
通过浏览器可以查看
先来说下Hive中内部表与外部表的区别:(重点)
1)创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
2)删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
另外需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否符合schema的,hive 遵循的是 schema on read(读时模式),只有在读的时候hive才检查、解析具体的 数据字段、schema。
读时模式的优势是load data 非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。
写时模式的优势是提升了查询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费要多的加载时间。
1、内部表操作:
加载数据到表中方法:
##注意aa文件的数据要先创建好
hive> LOAD DATA LOCAL INPATH '/home/aa'INTO TABLE neibu_table;
Loading data to table default.neibu_table
Table default.neibu_table stats: [numFiles=1, totalSize=10]
OK
Time taken: 0.639 seconds
Select * from neibu_table
使用select* 不加条件时,不执行MapReduce,执行比较快;最后一行显示的是null,原因是文件中有一行空格;
注意:内部表会将数据拷贝一份到表目录下面,如果删除内部表元数据,那么该元数据下面的数据也会被删除;
第二种加载数据到student中的方法
注意bb.txt文件的路径,并写入一列数字;
执行命令hadoop fs -put bb.txt /home/hive/warehouse/neibu_table或者 hdfsdfs -put t /home/hive/warehouse/neibu_table
添加一个库:create database hive20161120
2、分区表:将每个小时或每天的日志文件进行分区存储,可以针对某个特定时间段做业务分析,而不必分析扫描所有数据;
创建表a20161120,有多个列的情况创建表,指定分隔符为\t
创建分区表:
CREATE TABLE fenqu(id int) PARTITIONED BY (d int);
LOAD DATA LOCAL INPATH 'bb.txt INTO TABLE fenquPARTITION (d=1);
LOAD DATA LOCAL INPATH 'bb2.txt' INTO TABLE fenquPARTITION (d=2);
3、 桶表
(表连接时候使用,根据桶的个数进行取模运算,将不同的数据放到不同的桶中)
创建桶类型的表
create table student4(id int) clustered by(id)into 4 buckets;
必须启用桶表
set hive.enforce.bucketing = true;
插入数据,这里并没有使用load,而是用的insert,insert加载数据使用了mapreduce。
insert into table student4 select id fromstudent3;
在hive 添加的表可以在mysql查看他的元数据信息,在配置问建立定义的库下记录所有所有相关的记录
Eg:select * from TBLS;
4、外部表:
导入数据和内部表一样 ,这里不做重复
hive> drop table outer_table;
OK
Time taken: 0.081 seconds
hive> show tables;
OK
Time taken: 0.023 seconds
hive> create external table outer_table(id int)
> ;
OK
Time taken: 0.037 seconds
hive> select * from outer_table
> ;
OK
1
2
3
4
5
6
7
8
9
10
Time taken: 0.044 seconds, Fetched: 10 row(s)