赞
踩
目录
facebook团队要管理和分析大量的结构化的日志文件,因为写mapreduce非常麻烦,所以该团队就开发出来一个框架,叫hive.
hive是一款运行在hadoop上的数据仓库管理工具,可以将具有结构化的数据文件映射成一张数据表,使用类似sql的方式来对这种文件进行读、写、管理(包括元数据)等。这种类sql的语言,称之为Hive SQL,简称HQL。 实际上hive底层是mapreduce或者是spark或者是tez. 如果是mapreduce,则是将hql翻译成对应的mapreduce程序。
一、优点 1. 学习成本低 2. 扩展性好 3. 适合做离线分析(OLAP) 4. 容错性好(某一个节点宕机,hive依然可以完成) 5. 延展性好(用户可以自定义hive函数) 6. hive的元数据统一管理。 二、缺点: 1. hive的表达能力有限(特别复杂的算法难以实现) 3. hive的效率低(调优不方便,速度慢)
1. 用户接口层: 就是供用户链接hive的接口,有三类。 - shell命令行接口 - jdbc/odbc接口 - webui接口 2. Thrift server:hive的可选组件(第三方组件),供编程语言链接hive时使用。 3. metaStore:元数据库 用来存储hive的元数据的,元数据包括库名,表名,表字段,字段类型,表数据所在的目录等。 注意:hive在工作时,会访问元数据库,可能是读取元数据,也可能是更改元数据。 4. Driver: hive的驱动 - 解析器: 解析hql语法 - 编译器: 将没有问题的hql翻译成mr程序 - 优化器: 对翻译好的mr程序进行部分优化(比如去掉不必要的列等) - 执行器: 提交mr程序job。
1. 用户提交hql语句给Driver. 2. Driver的解析器校验hql,然后传给编译器,由编译器翻译成mr执行计划。 3. 编译器读取元数据库里的元数据 4. 编译器获取元数据后,再次完善mr执行计划,比如设置输入路径等。 5. 将完善后的mr执行计划交由driver。此时,整个解析和翻译过程结束。 6. driver将执行计划交给执行引擎 7. 执行引擎提交作业到yarn上,运行mr程序 8. 运算结果交由执行引擎。 9.执行引擎获取数据后,交给driver 10.driver将结果传递给用户。
hive就像是在hadoop上的一个壳子。 hive要处理的数据存储在hdfs/hbase上。hive的计算基于mapreduce/spark/tez
- mysql用自己的存储存储引擎,hive使用的hdfs来存储。 - mysql使用自己的执行引擎,而hive使用的是mapreduce来执行。 - mysql使用环境几乎没有限制,hive是基于hadoop的。 - mysql的低延迟,hive是高延迟。 - mysql的handle的数据量较小,而hive的能handle数据量较大。 - mysql的可扩展性较低,而hive的扩展性较高。 - mysql的数据存储格式要求严格,而hive对数据格式不做严格要求。 - mysql可以允许局部数据插入、更新、删除等,而hive不支持局部数据的操作。
3.2.1
元数据库是关系型数据库mysql,hive的相关进程都在同一台机器上,与mysql在哪一台机器上无关。注意:hive在启动客户端时,会内置的自动启动一个元数据服务项。
3.2.2安装步骤
步骤1:上传,解压,更名,配置环境变量
步骤2: 修改hive-env.sh
如果不存在,就用hive.env.sh.template复制一个
export HIVE_CONF_DIR=/usr/local/hive/conf export JAVA_HOME=/usr/local/jdk export HADOOP_HOME=/usr/local/hadoop export HIVE_AUX_JARS_PATH=/usr/local/hive/lib
步骤3: 修改hive-site.xml
hive2.1.1中默认是没有hive-site.xml
,可以把conf/hive-default.xml.template
拷贝过来使用
<!--配置mysql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--配置登录mysql的密码,注意,注意,注意,要用自己的远程密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>@Mmforu45</value>
</property><!-- 该参数主要指定Hive的数据存储目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property><!-- 该参数主要指定Hive的临时文件存储目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property><!-- 一些临时文件夹的配置 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/iotmp/root</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>
<!-- 是否显示当前数据库名-->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 该参数指定翻译出来的mr程序是使用yarn调度工具,还是本地OS调度工具,true表示local运行mr-->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
步骤4: 导入mysql的驱动包到hive的lib目录下
mysql-connector-XXX.jar
步骤5:初始化元数据库
schematool -initSchema -dbType mysql
hive
hive的服务项进程必须单独启动,服务项有两个,一个是hiveserver2,一个是metastore。 启动哪一个都可以,注意启动hiveserver2时,其本质还是在内部启动了metastore
<!--配置mysql的连接字符串-->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--配置登录mysql的密码,注意,注意,注意,要用自己的远程密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>@Mmforu45</value>
</property><!-- 该参数主要指定Hive的数据存储目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property><!-- 该参数主要指定Hive的临时文件存储目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property><!-- 一些临时文件夹的配置 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/iotmp/root</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>
<!-- 是否显示当前数据库名-->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 该参数指定翻译出来的mr程序是使用yarn调度工具,还是本地OS调度工具,true表示local运行mr-->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
注意:如果使用远程模式连接服务项。那么必须修改hadoop的core-site.xml文件,追加以下两个属性
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
要scp到其他节点上,还要重启HDFS,使配置生效。
启动hiveserver2:
方法1:
直接调用hiveserver2。会进入监听状态不退出。
方法2:
hive --service hiveserver2 & 进入后台启动
方法3:
hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。
启动metastore:
方法1:
- hive --service metastore &
方法2:
- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。
如果启动的是hiveserver2服务项,必须使用beeline工具连接。
方式1:
step1. beeline 回车
step2. !connect jdbc:hive2://ip:10000 回车
step3. 输入用户名 回车
step4. 输入密码 回车
方法2(直连):
1. beeline -u jdbc:hive2://qianfeng01:10000 -n root #我一直使用!解析:
hive2,是hive的协议名称
ip: hiveserver2服务所在的主机IP。
10000,是hiveserver2的端口号
想要连接metastore服务的客户端必须配置如下属性和属性值
<property> <name>hive.metastore.uris</name> <value>thrift://ip:9083</value> </property> 解析:thrift:是协议名称 ip为metastore服务所在的主机ip地址 9083是默认端口号
配置完,直接使用hive指令即可
命名规范
1. 名字可以由字母,数字等构成,数字不能开头 2. 不区分大小写 3. 不能使用关键字,不要使用特殊符号
1)库的创建语法
create database dbName; create database if not exists dbName; create database [if not exists] dbName comment '备注信息';
注意: hive的库的本质,是在hdfs上的一个目录,目录名为dbName.db
2) 库的查看语法
查看所有数据库:
show databases;
查看某一个数据库的信息
desc database dbName
desc database extended dbName;
显示创建语法
show create database dbName;
注意: hive的库的本质,是在hdfs上的一个目录,目录名为dbName.db
3) 库的切换语法
use dbName
4)库的删除语法
drop if database dbName; 只能删除没有表的空库 drop database dbName cascade; 可以强制删除有表的库
1)常用的字段类型
int float double string varchar char date timestamp
2)表的创建语法(重点)
create table tableName(
fieldName1 Type,
fieldName1 Type,
....
);create table dbName.tableName(
fieldName1 Type,
fieldName1 Type,
.....
);
create table [if not exists] tableName(
fieldName1 Type,
fiedlName2 Type comment '备注',
.......
)
comment 'this is my table' --表备注
row format delimited --规定输入规则,以及切分规则
fields terminated by '\t' --列分隔符,默认值是^A
lines terminated by '\n' --行分隔符,也是默认值
stored as textfile; --指定表对应的文件是什么存储格式,textfile,也是默认值
注意:hive的表的本质,是在库目录下的子目录,目录名为表名。
3)表的查看语法
查看库里的所有的表 show tables; 查看某一个表的结构 desc tableName; desc extended tableName; 查看建表语句 show create table tableName
4)表的结构修改语法
- 修改表名
alter table oldTableName rename to newTableName;
- 修改列名、修改列类型是同一个语法
alter table tableName change column oldColumnName newColumnName [Type|newType]
注意:在修改类型时,不能将大类型转成小类型,可以使用小类型转向大类型。
- 修改列的位置: 注意,2.x版本后,必须是相同类型进行移动位置。
alter table tableName change column colName colName colType after colName1;
alter table tableName change column colName colName colType first;- 增加字段:add columns
alter table tableName add columns (sex int,...);- 删除字段:replace columns #注意,2.x版本后,注意类型的问题,替换操作,其实涉及到位置的移动问题。
alter table tableName replace columns(
id int,
name int,
size int,
pic string
);
注意:实际上是保留小括号内的字段。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。