首页 > 技术文章 > Hive

mrxiaohe 2016-03-14 00:24 原文

 

 

1.Hive
1.1在hadoop生态圈中属于数据仓库的角色。他能够管理hadoop中的数据(数据管理功能),同时可以查询hadoop中的数据。
  本质上讲,hive是一个SQL解析引擎。Hive可以把SQL查询转换为MapReduce中的job来运行。
Hive所使用的语言HiveQL是一种类似SQL的语言, 它与大部分的SQL语法兼容, 但是并不完全支持SQL标准, 如HiveQL不支持更新操作, 也不支持索引和事务, 它的子查询和
join操作也很局限, 这是因其底层依赖于Hadoop云平台这一特性决定的, 但其有些特点是SQL所无法企及的。
例如多表查询、支持create table as select和集成MapReduce脚本等 hive有一套映射工具,可以把SQL转换为MapReduce中的job,可以把SQL中的表、字段转换为HDFS中的文件(夹)以及文件中的列。 这套映射工具称之为metastore,一般存放在derby、mysql中(关系型数据库中)。 Hive构建在Hadoop之上,Hive对外提供不同的接口(web接口,JDBC接口,命令行接口),不同的接口会连接不同的驱动,通过驱动,Hive把我们的SQL转化为m
/r的执行, 转化为对HDFS的执行。 转化的工作是驱动来做的,驱动在运行的时候会查询Metastore中的内容。我们可以把Hive理解为一个客户端工具,他让我们执行SQL操作,然后把SQL操作转化为对Hadoop的操作。
 我们理解Hive,他就是一个客户端的工具,所以无所谓把它区分为是集群,还是伪分布的安装,他就是一个客户端工具。
1.2 hive在hdfs中的默认位置是/user/hive/warehouse,是由配置文件hive-conf.xml中属性hive.metastore.warehouse.dir决定的。
                      Hive的安装
2.hive的安装 (1)解压缩、重命名、设置环境变量 export HIVE_HOME=/usr/local/hive export ....:$HIVE_HOME/BIN:.... source /etc/profile (2)在目录$HIVE_HOME/conf/下,执行命令mv hive-default.xml.template hive-site.xml重命名 在目录$HIVE_HOME/conf/下,执行命令mv hive-env.sh.template hive-env.sh重命名 如上两项内容可以不做修改 (3)修改hadoop的配置文件hadoop-env.sh,修改内容如下: export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin (4)在目录$HIVE_HOME/bin下面,修改文件hive-config.sh,增加以下内容:(直接加到最前面就行) export JAVA_HOME=/usr/local/jdk export HIVE_HOME=/usr/local/hive export HADOOP_HOME=/usr/local/hadoop 通过hive命令就可以进入hive终端,和mysql一样,可以执行show databases; use 数据库名; show tables; 命令
                    安装mysql
3.安装mysql rpm -qa |grep mysql 检测是否安装,如果已经安装,需要删除 (1)删除linux上已经安装的mysql相关库信息。rpm -e xxxxxxx --nodeps 执行命令rpm -qa |grep mysql 检查是否删除干净 (2)执行命令 rpm -i mysql-server-******** 安装mysql服s务端 (3)启动mysql 服务端,执行命令 mysqld_safe & (4)执行命令 rpm -i mysql-client-******** 安装mysql客户端 (5)执行命令mysql_secure_installation设置root用户密码(默认的为空) Reload privilege tables now? yes 其他的 他都选的否 登录:mysql -uroot -padmin (才密码设置为了admin) 退出:quit 4. 使用mysql作为hive的metastore (1)把mysql的jdbc驱动放置到hive的lib目录下 (2)修改hive-site.xml文件,修改内容如下: <property> <name>javax.jdo.option.ConnectionURL</name>连接的JDBC的url 36:21 <value>jdbc:mysql://hadoop0:3306/hive?createDatabaseIfNotExist=true</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>admin</value> </property> 在win7中连接linux中的mysql,用一个客户端软件,类似于MysqlBench。创建一个连接,填好连接名,IP(主机名),还有我们linux端mysql的用户名和密码,然后连接测试,是连接不上的 因为mysql,默认不允许远程连接,需要执行几个命令。我们登录mysql ,执行授权命令,grant all on hive.* to 'root'@'%' indentified 'admin' 意思是给任意地方的root用户授权hive库的所有权限,并且用密码admin登录。 flush privilege;刷新权限表,此时就能连接了。metasotre是hive元数据的集中存放地。metasotre默认使用内嵌的derby数据库作为存储引擎
                            Hive的metastore
metasotre是hive元数据的集中存放地。metasotre默认使用内嵌的derby数据库作为存储引擎
Derby引擎的缺点:一次只能打开一个回话。
  使用Mysql作为外置存储引擎,多用户同时访问。
                          Hive的数据类型
  
没有date/datetime
,其他相关的自己百度就可以
5. 内部表 CREATE TABLE t1(id int); LOAD DATA LOCAL INPATH '/root/id' INTO TABLE t1; 里面的LOCAL,意思是从本地磁盘文件,即linux中向hive中加载,如果去掉LOCAL,就是从hdfs中加载。 我们也可以不用,这个命令,使用hdfs -put命令同样也可以加载到HIVE中,把put的目的路径写成hive在hdfs中的路径就行了 CREATE TABLE t2(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; 查看用select命令 select * 是全表扫描,不走m/r, 如果select 其他,只要不是* ,就需要走m/r 6. 分区表 CREATE TABLE t3(id int) PARTITIONED BY (day int); LOAD DATA LOCAL INPATH '/root/id' INTO TABLE t1 PARTITION (day=22); 7. 桶表 create table t4(id int) clustered by(id) into 4 buckets; set hive.enforce.bucketing = true; insert into table t4 select id from t3; 8. 外部表 create external table t5(id int) location '/external';                    Hive的命令
hive命令支持正则表达式匹配
  例如:
show tables 'ad.*' //以ad开头的表

练习题:把原来的手机流量统计使用hive处理

 

推荐阅读