摘要:hive的安装,可能遇到问题及解决;提及一些hive元数据;提及了一下内外部表。
前置
linux集群系统配置:[1] 大数据学习前夕[01]:系统-网络-SSH
hadoop集群环境:[2] 大数据学习[02]:hadoop安装配置
安装mysql并配置好用户(这个必须要安装与配置的):[3]大数据学习前夕[04]:Mysql安装[Hive]
下载
[hadoop@hadoop01 ~]$ wget http://www-eu.apache.org/dist/hive/hive-1.2.2/apache-hive-1.2.2-bin.tar.gz
解压
[hadoop@hadoop01 ~]$ tar vxzf apache-hive-1.2.1-bin.tar.gz
配置
[hadoop@hadoop01 conf]$ cp hive-env.sh.template hive-env.sh
#增加hadoop_home:
export HADOOP_HOME=/home/hadoop/hadoop
修改hive-site.xml
[hadoop@hadoop01 conf]$ vim hive-site.xml
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop01:9083</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>AAAaaa111</value>
</property>
</configuration>
配置一下HIVE的环境变量
[hadoop@hadoop01 conf]$ sudo vim /etc/profile
[hadoop@hadoop01 conf]$ source /etc/profile
lib目录下增加一个mysql-connector-java-5.1.6.jar驱动;
复制
scp -r apache-hive-1.2.1-bin hadoop@hadoop02:~/
scp -r apache-hive-1.2.1-bin hadoop@hadoop03:~/
启动hive
启动方法1:hive --service metastore &
或
启动方法2:nohup hive --service metastore -v &
启动报错:
这个因为数据库中有root@hadoop01没有密码引起的,把没有密码的删除了就可以了。
解决方法:把mysql里root用户没有密码全删除了,参见大数据学习前夕[04]:Mysql安装[Hive]。
创建表
在命令行输入hive就打印相应日志,接着就进入hive shell界面。
创建一张伪表dual
CREATE TABLE IF NOT EXISTS `dual` (
`name` string
)
创建一个文件/home/hadoop/dual,在里面写一些字符串;为dual的插入作准备;
hive> load data local inpath '/home/hadoop/dual' into table dual;
可以看到数据加载入其中了,里面的基本操作命令与mysql差多,不过,HSQL没有insert into…value这样的方法,一般都是采用文件加载,或从别的表查询来更新的。
构造自己的插入方法
创建测试表student
CREATE TABLE student(
`student_id` string,
`student_name` string
)
COMMENT 'This is the student table'
partitioned by(`born` string,`sex` int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
stored AS ORC;
编写自己的插入SQL
INSERT OVERWRITE TABLE student05 PARTITION (born = '2015-07-08',sex = 0)
SELECT
'dlmu_01' as student_id,
'happyprince' as student_name
FROM dual
limit 1;
可能会遇到的问题
上面的创建表有可能会出现:Specified key was too long; max key length is 767 bytes 这样的错误; 文章hive创建表错误[ Specified key was too long]具体处理解决方法:
第一步:查看数据库的字符
mysql> show variables like '%char%';
mysql>alter database 库名 character set latin1;
再操作创建表,查看是否还是报错,如果还是报同样的错误,接着第二步;
第二步:直接把数据库给删了
第三步:配置了mydql文件:把字符集都设置成了latin1;
[root@hadoop01 ~]# vi /etc/my.cnf
[mysqld]
character-set-server=latin1
lower_case_table_names=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=latin1
[mysql]
default-character-set=latin1
第四步:重启MYSQL; 重启HIVE;
这个是mysql的字符集问题,还未来得及深入研究,先这样处理,有知道好方法的请指教!
hive元数据
进入mysql,打开hive数据库,show tables;
看几个表:
version表
mysql> select * from version;
+--------+----------------+-----------------------------------------+
| VER_ID | SCHEMA_VERSION | VERSION_COMMENT |
+--------+----------------+-----------------------------------------+
| 1 | 1.2.0 | Set by MetaStore hadoop@192.168.137.101 |
+--------+----------------+-----------------------------------------+
VER_ID:ID主键;SCHEMA_VERSION :Hive版本;VERSION_COMMENT:版本说明
有时数据异常了,会修改这个表的内容,所以当hive由于版本问题启动不了时,可以来这里看看。
数据库表[DBS,DATABASE_PARAMS]
mysql> select * from dbs;
[一起学Hive]之十四-Hive的元数据表结构详解说明得比较全;
- Hive表和视图相关的元数据表
主要有TBLS、TABLE_PARAMS、TBL_PRIVS,这三张表通过TBL_ID关联。 - Hive文件存储信息相关的元数据表
主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS
由于HDFS支持的文件格式很多,而建Hive表时候也可以指定各种文件格式,Hive在将HQL解析成MapReduce时候,需要知道去哪里,使用哪种格式去读写HDFS文件,而这些信息就保存在这几张表中。 - Hive表字段相关的元数据表
主要涉及COLUMNS_V2 - Hive表分区相关的元数据表
主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS
等等。。。
hive内部表与外部表
内部表:数据与元数据都要管。创建时,会把数据移动hive数据仓库指定的位置,删除时会把数据与记录的位置一起删;
外部表:只管元数据,不管数据;创建时,要指定一个数据路径,hive不会管你的数据在哪里,也不会移动它,只是记录路径,删除时,也只是删除路径,数据不管。
参考引用
[1] 大数据学习前夕[01]:系统-网络-SSH
[2] 大数据学习[02]:hadoop安装配置
[3]大数据学习前夕[04]:Mysql安装[Hive]
[4][一起学Hive]之十四-Hive的元数据表结构详解
【作者:happyprince, http://blog.csdn.net/ld326/article/details/78023101】