BG.Hive - part1
1. Hive架构
What is hive? Facebook,https://en.wikipedia.org/wiki/Apache_Hive
a> 一种工具,可以通过SQL轻松的访问数据,可以完成数据仓库任务,如ETL,报表及数据分析
b> 一种机制,增强多样化数据格式的结构
c> 数据访问,HDFS或者其他的数据存储系统(HBase)
d> 查询方式,类SQL的HiveQL
默认引擎为MapReduce,简单的Select * From..不会转换为MR任务
e> 快速查询引擎,MapReduce,Spark,Tez
f> 支持存储过程,通过HPL/SQL实现
HPL为apache的另外一个开源项目
g> LLAP(Live Long And Process),使Hive实现内存计算
将数据缓存到了多台服务器的内存中
2. Hive特性和支持的格式
Hive提供了标准的SQL函数,HiveQL可以扩展用户自定义函数
Hive提供内置的格式
a> 逗号和Tab字段分割的文本文件
b> Apache Parquet文件,https://parquet.apache.org/
c> Apache ORC文件,ORC:OptimizedRC File,RC:RecordColumnar File
d> 其他格式
3. 单用户模式(derby,in memory database),多用户模式(mysql,其他RDMS),远程模式(服务器端启动MetaStore Server,客户端通过Thrift协议访问)
4. 为什么会出现Hive
MR程序繁琐,使用HQL可以非常简单的实现任务
5. 环境搭建
要先具有:CentOS, Hadoop, MySQL
下载Hive,并放入虚拟机/opt下,https://mirrors.tuna.tsinghua.edu.cn/apache/hive/
tar zxf apache-hive-2.1.1-bin.tar.gz #解压
mv apache-hive-2.1.1-bin hive-2.1.1 #重命名
cd /opt/hive-2.1.1/conf/ #进入conf目录
cp hive-env.sh.template hive-env.sh #拷贝配置文件
cp hive-default.xml.template hive-site.xml #拷贝配置文件
vim /etc/profile #配置环境变量
source /etc/profile #应用环境变量
vim hive-env.sh #配置hive-env.sh
HADOOP_HOME=/opt/hadoop-2.7.3 #设置HADOOP_HOME
/opt/hive-2.1.1/bin/schematool -dbType derby -initSchema #使用derby作为metastore,并初始化(message:Version information not found in metastore.错误解决方案)
vim hive-site.xml
${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D.错误解决方案
<property>
<name>hive.exec.local.scratchdir</name>
<value>/opt/hive-2.1.1/hivetmp/scratchdir/</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/opt/hive-2.1.1/hivetmp/resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
单用户模式(derby)检查:hive
同一时间,只允许一个用户打开Hive Session
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive的元数据:表信息、字段属性、分区、列、表Owner等信息,存储于metastore_db
Hive的实际数据,存储于HDFS上
vim /opt/hive-2.1.1/conf/hive-site.xml
javax.jdo.option.ConnectionURL, javax.jdo.option.ConnectionDriverName, javax.jdo.option.ConnectionDriverName, javax.jdo.option.ConnectionPassword
<name>javax.jdo.option.ConnectionURL</name>
<!--<value>jdbc:derby:;databaseName=/opt/hive-2.1.1/conf/metastore_db;create=true</value>-->
<value>jdbc:mysql://bigdata.mysql:3306/hive?createDatabaseIfNotExist=true</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description> <property>
<name>javax.jdo.option.ConnectionDriverName</name>
<!--<value>org.apache.derby.jdbc.EmbeddedDriver</value>-->
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property> <property>
<name>javax.jdo.option.ConnectionUserName</name>
<!--<value>APP</value>-->
<value>bigdata</value>
<description>Username to use against metastore database</description>
</property> <property>
<name>javax.jdo.option.ConnectionPassword</name>
<!--<value>mine</value>-->
<value>pas$w0rd</value>
<description>password to use against metastore database</description>
</property>
cp mysql-connector-java-5.1.41-bin.jar /opt/hive-2.1.1/lib/ #copy jdbc到lib下,解决("com.mysql.jdbc.Driver") was not found.错误
/opt/hive-2.1.1/bin/schematool -dbType mysql -initSchema #初始化metaStore db,解决Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
多用户模式(mysql)测试:hive
6. Hive CLI
Hive Command Line Interface Hive命令行接口
usage: hive
-d,--define <key=value> Variable substitution to apply to Hive
commands. e.g. -d A=B or --define A=B
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
-h <hostname> Connecting to Hive Server on remote host
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable substitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-p <port> Connecting to Hive Server on port number
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
设置配置属性的3中方式:1. hive CLI set property = value > 2. --hiveconf property = value > 3. hive-site.xml
hive> create database HelloHive; #创建数据库,数据库文件存放于Hadoop
hive> show databases; #显示所有数据库
hive> use HelloHive; #切换到HelloHive数据库
hive> create table T1(id int, name varchar(30)); #创建表
hive> show tables; #显示所有表
hive> insert into t1(id,name) values(1,'Niko'),(2,'Jim'); #向T1表中插入数据
hive> select * from t1; #查询T1表
hive -d col=id --database HelloHive #启动Hive时,定义变量col等于id,并连接上HelloHive数据库
hive> select ${col},name from T1; #使用col代替id进行查询,输出结果为id列的内容
hive> select '${col}',name from T1; #${col}的值为id,所以输出结果为字符串“id”
hive> set mapred.reduce.tasks; #设置MR的任务数,不加参数输出当前任务数
[output] mapred.reduce.tasks=-1 #Hive默认的MR任务数-1代表Hive会根据实际情况设置任务数
hive --hiveconf mapred.reduce.tasks=3 #在启动Hive时指定MR任务数为3
hive> set mapred.reduce.tasks=5; #在Hive CLI中重新设定MR任务数为5
hive -e "select * from T1;" --database HelloHive; #使用-e将查询语句传入Hive并取回结果
vim t1.hql #创建t1.hql文件
use HelloHive; #文件中的SQL语句,每行必须要用;结尾
Select * From T1 Where id < 4;
hive -f t1.hql #使用hive只是文件中的SQL语句
hive -S -e "select count(1) from T1;" --database HelloHive; #-S会去掉不必要的信息,如MR的信息等不会被显示出来
7. Hive Shell
hive> quit; hive> exit; #退出interactive Hive Shell
hive> reset; #重置所有hive配置项,重置为hive-site.xml中的配置信息
hive> set XXX; hive> set XXX=Y; #设置或者显示配置项信息
hive> set -v; #显示所有Hadoop和Hive的配置项信息
hive> !ls; #在hive中执行Shell命令
hive> dfs -ls; #在hive中执行dfs命令
hive> add file t1.hql #添加t1.hql文件到分布式缓存
hive> list file; #显示所有当前的分布式缓存文件
hive> delete file t1.hql #删除指定的分布式缓存文件
8. Beeline
HiveServer2的CLI,一个JDBC客户端;
嵌入式模式,返回一个嵌入式的Hive,类似Hive CLI;(beeline)
远程模式,通过Thrift协议与某个单独的Hive Server2进程进行连接通信(使用代码连接HiveServer2)
HiveServer2的配置 hive-site.xml
Hive.Server2.thrift.min.worker.threads #最小工作线程数,默认5,最大500
Hive.Server2.thrift.Port #TCP监听端口,默认是10000
Hive.Server2.thrift.bind.host #TCP绑定主机,默认是localhost
Hive.Server2.thrift.transport.mode #默认TCP,可选择HTTP
Hive.Server2.thrift.http.port #HTTP的监听端口,默认值为10001
启动HiveServer2
hive -service hiveserver2
hiveserver2
启动Beeline
hive -service beeline
beeline
查看服务是否启动:ps -ef | grep hive
cp /opt/hive-2.1.1/jdbc/hive-jdbc-2.1.1-standalone.jar /opt/hive-2.1.1/lib/ #解决hive-jdbc-*-standalone.jar:No such file or directory文件
beeline #启动beeline
beeline> !connect jdbc:hive2://localhost:10000/HelloHive #使用beeline连接Hive数据库
Enter username for jdbc:hive2://localhost:10000/HelloHive: root
Enter password for jdbc:hive2://localhost:10000/HelloHive: ********
Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000/HelloHive: Failed to open new session: java.lang.RuntimeException org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate root (state=08S01,code=0)
解决方案:
kill -9 15544 #关闭hiveserver2进程
/opt/hadoop-2.7.3/sbin/stop-all.sh #停止Hadoop集群
vim /opt/hadoop-2.7.3/etc/hadoop/core-site.xml #配置hadoop的core-site,增加下面2个配置项。表示root用户可以代理所有主机上的所有用户
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property> <property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
scp /opt/hadoop-2.7.3/etc/hadoop/core-site.xml root@bigdata.hadoop.slave1:/opt/hadoop-2.7.3/etc/hadoop/ #将core-site.xml文件分发到Hadoop集群的所有slave上
scp /opt/hadoop-2.7.3/etc/hadoop/core-site.xml root@bigdata.hadoop.slave2:/opt/hadoop-2.7.3/etc/hadoop/
scp /opt/hadoop-2.7.3/etc/hadoop/core-site.xml root@bigdata.hadoop.slave3:/opt/hadoop-2.7.3/etc/hadoop/
/opt/hadoop-2.7.3/sbin/start-all.sh #启动Hadoop集群
hiveserver2 #启动Hive Server2
beeline #启动beeline
beeline> !connect jdbc:hive2://localhost:10000/HelloHive #连接Hive数据库 => 输入用户名,密码
17/03/07 14:01:55 [main]: WARN jdbc.HiveConnection: Request to set autoCommit to false; Hive does not support autoCommit=false.
Transaction isolation: TRANSACTION_REPEATABLE_READ #警告
0: jdbc:hive2://localhost:10000/HelloHive> set autoCommit=false; #beeline启动成功;设置autoCommit为false
[output]No rows affected (0.286 seconds) #设置成功
0: jdbc:hive2://localhost:10000/HelloHive> show tables; #显示表
0: jdbc:hive2://localhost:10000/HelloHive> select * from t1; #查询表
0: jdbc:hive2://localhost:10000/HelloHive> !quit #退出beeline
9. Hive数据类型
数值型:
TINYINT,1字节,-128 ~ 127,如:1 Postfix:Y 100Y
SMALLINT,2字节,-32768 ~ 32767,如:1 Postfix:S 100S
INT/INTEGER,4字节,-2,147,483,648 ~ 2,147,483,647,如:1
BIGINT,8字节,如:1 Postfix:L 100L
FLOAT,4字节单精度,如:1.0 默认为double,在数值后面加上F代表Float。
DOUBLE,8字节双精度,(Hive 2.2.0开始引入DOUBLE PRECISION),如:1.0 FOLAT和DOUBLE都不支持科学计数法
DECIMAL,38位小数精度,(HIVE 0.11.0开始引入),支持科学/非科学计数法;默认为小数点后1位,或者指定小数点后位数decimal(10,2)
日期时间型:
TIMESTAMP,0.8.0开始引入,如:2017-03-07 14:00:00;支持传统Unix时间戳,精确到纳秒级。
DATE,0.12.0开始引入,0001-01-01 ~ 9999-12-31,如:2017-03-07
字符:
STRING,用单引号或者双引号引起来的字符串
VARCHAR,0.12.0引入,字符数量1 ~ 65535
CHAR,0.13.0引入,固定长度,长度最大支持到255
Misc
BOOLEAN,布尔型,TRUE和FALSE
BINARY,0.8.0引入,二进制类型
数组
ARRAY<TYPE>,如ARRAY<INT>,元素访问下标由0开始
映射
MAP<PRIMITIVE_TYPE,DATA_TYPE>,如MAP<STRING,INT>
结构体
STRUCT<COL_NAME:DATA_TYPE,...>,如STRUCT<a:STRING,b:INT,c:DOUBLE>
联合体
UNIONTYPE<DATA_TYPE,DATA_TYPE,...>,如UNIONTYPE<STRING,INT,DOUBLE...>
CREATE TABLE complex(
col1 ARRAY<INT>,
col2 MAP<STRING,INT>,
col3 STRUCT<a:STRING,b:INT,c:DOUBLE>,
col4 UNIONTYPR<STRING,INT,STRUCT,MAP,ARRAY,...>
) col1 = Array('Hadoop','spark','hive','hbase','sqoop')
col1[] = 'spark' col2 = MAP(1:hadoop,2:sqoop,3:hive)
col2[] = hadoop col3 = STRUCT(a:5,b:'five')
col3.b = 'five'
void |
boolean |
tinyint |
smallint |
int |
bigint |
float |
double |
decimal |
string |
varchar |
timestamp |
date |
binary |
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
void to |
true |
true |
true |
true |
true |
true |
true |
true |
true |
true |
true |
true |
true |
true |
boolean to |
false |
true |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
tinyint to |
false |
false |
true |
true |
true |
true |
true |
true |
true |
true |
true |
false |
false |
false |
smallint to |
false |
false |
false |
true |
true |
true |
true |
true |
true |
true |
true |
false |
false |
false |
int to |
false |
false |
false |
false |
true |
true |
true |
true |
true |
true |
true |
false |
false |
false |
bigint to |
false |
false |
false |
false |
false |
true |
true |
true |
true |
true |
true |
false |
false |
false |
float to |
false |
false |
false |
false |
false |
false |
true |
true |
true |
true |
true |
false |
false |
false |
double to |
false |
false |
false |
false |
false |
false |
false |
true |
true |
true |
true |
false |
false |
false |
decimal to |
false |
false |
false |
false |
false |
false |
false |
false |
true |
true |
true |
false |
false |
false |
string to |
false |
false |
false |
false |
false |
false |
false |
true |
true |
true |
true |
false |
false |
false |
varchar to |
false |
false |
false |
false |
false |
false |
false |
true |
true |
true |
true |
false |
false |
false |
timestamp to |
false |
false |
false |
false |
false |
false |
false |
false |
false |
true |
true |
true |
false |
false |
date to |
false |
false |
false |
false |
false |
false |
false |
false |
false |
true |
true |
false |
true |
false |
binary to |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
false |
true |
10. Hive表基本操作及概念
内表(Managed Table),其数据文件、元数据及统计信息全部由Hive进程自身管理。内表的数据存储是有hive.metastroe.warehouse.dir指定的路径下。
外表(External Table),通过元信息或者Schema描述外部文件的结构,外表可以被Hive之外的进程访问和管理,如HDFS。
hive> desc formatted t1; #查看表的信息;Table Type显示Managed Table或者External Table
hive> create external table t2(id int,name string); #创建外表
hive> desc t1; #查看表的字段及字段类型信息
11. Hive数据文件存储格式
STORED AS TEXTFILE,默认的文件格式(除非特别用hive.default.fileformat指定,在hive-site.xml中设定)
STORED AS SEQUENCEFILE,已压缩的序列化文件
STORED AS ORC,存储ORC格式的文件,支持ACID事务操作及CBO(Cost_based Optimizer)
STORED AS PARQURT,存储Parquet文件
STORED AS AVRO,存储AVRO格式文件
STORED AS RCFILE,存储RC(Record Columnar)格式的文件
STORED BY,由非内置的表格式存储,例如HBase/Druid/Accumulo存储数据
创建表
hive> create external table users(
> id int comment 'id of user',
> name string comment 'name of user',
> city varchar(30) comment 'city of user',
> industry varchar(20) comment 'industry of user')
> comment 'external table, users'
> row format delimited #使用分隔符形式,下面描述了3种序列化的形式
> fields terminated by ','
> stored as textfile
> location '/user/hive/warehouse/hellohive.db/users/';
row format内置类型:Regex(正则表达式),JSON,CSV/TSV
row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored as textfile
row format serde 'org.apache.hive.serde2.RegexSerDe' with serdeproperties ("input.regex"="<regex>") stored as textfile
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerDe' stored as textfile
或者使用hive -f的方式创建表
vim t_users_ext.hql create external table users(
id int,
name string,
city varchar(30),
industry varchar(20))
row format delimited
fields terminated by ','
stored as textfile
location '/user/hive/warehouse/hellohive.db/users'; insert into users(id,name,city,industry)
values(1,'Niko','Shanghai','Bigdata'),
(2,'Eric','Beijing','NAV'),
(3,'Jim','Guangzhou','IT'); hive -f t_users_ext.hql --database hellohive
12. Hive表
分区表 Partition Table
在Hive Select查询中,一般会扫描这个表的内容(HDFS某个目录下的所有文件),会消耗很多时间
分区表创建时,指定partition的分区空间,分区粒度 > 桶粒度
语法: partition by (par_col par_type)
静态分区:如按照年-月进行分区 #set hive.exec.dynamic.partition;
动态分区:如按照产品类别进行分区,产品类别会有新增 #默认为动态分区,如果设置动态分区为false,则不能创建动态分区
动态分区模式:set hive.exec.dynamic.partition.mode = strict/nonstrict #默认模式为严格(strict),在strict模式下,动态分区表必须有一个字段为静态分区字段
采用分区后,每个分区值都会形成一个具体的分区目录
桶表 Bucketed Sorted Table
倾斜表 Skewed Table
通过将倾斜特别严重的列分开存储为不同的文件,每个倾斜值指定为一个目录或者文件,在查询的时候,可以根据过滤条件来避免全表扫描的费时操作
Skewed by (field) on (value)
临时表 Temporary Table
只在当前会话中可见的表为临时表,临时表所在的hdfs目录为tmp目录
DROP TABLE [IF EXISTS] TABLE_NAME [PURGE]; #对于内表,使用PURGE,元数据和表数据一起删除,不进入垃圾箱。对于外表,只删除元数据
BG.Hive - part1的更多相关文章
- BG.Hive - part3
1. Hive数据导入 - Load Load,加载,不会进行任何数据转换和处理的操作,只会进行数据Move操作,将元数据移动到HDFS指定目录 a> hdfs dfs -put 'hdfs的h ...
- BG.Hive - part2
1. 将mysql的订单数据导入hive的分区表(桶.倾斜)[partition,bucket,skew] a> 在Hive中新建分区表 CREATE TABLE IF NOT EXISTS H ...
- 【Hadoop】HIVE 小结概览
一.HIVE概览小结 二.HIVE安装 Hive只在一个节点上安装即可 .上传tar包 .解压 tar -zxvf hive-.tar.gz -C /cloud/ .配置mysql metastore ...
- Hive内表和外表的区别
本文以例子的形式介绍一下Hive内表和外表的区别.例子共有4个:不带分区的内表.带分区的内表.不带分区的外表.带分区的外表. 1 不带分区的内表 #创建表 create table innerTabl ...
- 2 hive的使用 + hive的常用语法
本博文的主要内容有: .hive的常用语法 .内部表 .外部表 .内部表,被drop掉,会发生什么? .外部表,被drop掉,会发生什么? .内部表和外部表的,保存的路径在哪? .用于创建一些临时表存 ...
- 在ubantu上安装hive
上次我们在ubantu上安装了hadoop,那我们现在再进一步,开始我们的学习之旅--hive板块吧! 第一步:准备! 软件: I.一个搭建好的hadoop环境 II.hive的bin文件(前往apa ...
- hive Spark SQL分析窗口函数
Spark1.4发布,支持了窗口分析函数(window functions).在离线平台中,90%以上的离线分析任务都是使用Hive实现,其中必然会使用很多窗口分析函数,如果SparkSQL支持窗口分 ...
- 集群搭建之Hive配置要点
注意点: 在启动Hive 的时候要先启动Hadoop和MySQL服务. Mysql 和 Hive 搭建在 yan00机器上. part1:MySQL配置相关 安装和配置相关命令: Yum instal ...
- hive(七)hive-运行方式、GUI接口、权限管理
1.Hive运行方式: 命令行方式cli:控制台模式 脚本运行方式(实际生产环境中用最多) JDBC方式:hiveserver2 web GUI接口 (hwi.hue等) 1.1Hive在CLI模 ...
随机推荐
- C#实现FTP文件的上传、下载功能、新建目录以及文件的删除
本来这篇博文应该在上周就完成的,可无奈,最近工作比较忙,没有时间写,所以推迟到了今天.可悲的是,今天也没有太多的时间,所以决定给大家贴出源码,不做详细的分析说明,如果有不懂的,可以给我留言,我们共同讨 ...
- C#中的split的基本用法
split的使用: 1.使用char()字符分隔:根据单个的char()类型的进行分隔 代码如下: string str="e2kdk2fjod2fiksf21"; ');//因为 ...
- 【CronExpression表达式详解和案例】(转载)
原文地址:https://www.cnblogs.com/pipi-changing/p/5697481.html 找了下Cron的资料,这篇作者写的比较清晰,转载记录一下,方便后面使用的时候在g ...
- FFmpeg编写的代码
//初始化解封装 av_register_all(); avformat_network_init(); avcodec_register_all(); //封装文件的上下文 ...
- ng的点滴记录
1,directive http://damoqiongqiu.iteye.com/blog/1917971/ 2,constructor https://segmentfault.com/q/10 ...
- java实现fp-growth算法
本文参考韩家炜<数据挖掘-概念与技术>一书第六章,前提条件要理解 apriori算法. 另外一篇写得较好的文章在此推荐: http://hi.baidu.com/nefzpohtpndho ...
- (转)ReentrantLock可重入锁的使用场景
原文: http://my.oschina.net/noahxiao/blog/101558
- css实现带箭头的流程条
直接上效果图: <ul class="navs"> <li>1</li> <li>2</li> <li>3& ...
- 【xsy1018】 小A的字母游戏 扩展CRT
题目大意:有$n$个无限长的循环字符串,所谓循环字符串,就是由某一个子串重复叠加而成.现在想知道最早在哪一位,这n个字符串的那一位的字母相同. 数据范围:$n≤30000$,答案$<2^{63} ...
- Swift 中@available 和 #available
Swift 2.0 中,引入了可用性的概念.对于函数,类,协议等,可以使用@available声明这些类型的生命周期依赖于特定的平台和操作系统版本.而#available用在判断语句中(if, gua ...