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 Hivecommands. 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 hivecommands. 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 theconsole)
设置配置属性的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 TABLEcomplex(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[1] = 'spark'col2= MAP(1:hadoop,2:sqoop,3:hive) col2[1] =hadoopcol3= 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.hqlcreate external tableusers( idint, name string, cityvarchar(30), industryvarchar(20)) row format delimited fields terminatedby ','storedastextfile location'/user/hive/warehouse/hellohive.db/users';insert intousers(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,元数据和表数据一起删除,不进入垃圾箱。对于外表,只删除元数据
转载于:https://www.cnblogs.com/Niko12230/p/6511399.html
BG.Hive - part1相关推荐
- 史上最详细大数据基础知识
# **1___Hive** ## 0.0.hive基本命令 ```sql [1.分区表] --创建分区 alter table table_name add partition(分区字段='分区值' ...
- 学习笔记Hive(四) —— Hive应用(2)—— Hive导入及导出数据
四.Hive导入及导出数据 通过HDFS直接导入导出 通过Hive命令导入导出 4.1.Hive导入数据的语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRI ...
- HIve学习:Hive分区修改
文章目录 什么是Hive的分区 分区意义 分区技术 分区方法和本质 创建一级分区表 创建二级分区表 如何修改Hive的分区 查看分区 添加分区 分区名称修改 修改分区路径 删除分区 分区类别 hive ...
- Hive分区入门到精通
什么是分区? Hive 将表组织到分区中.它是一种根据分区列(如日期.城市和部门)的值将表划分为相关部分的方法.使用分区,可以轻松查询部分数据. 为什么要分区? 分区表查询时可以指定分区进行查询,这样 ...
- 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1
日萌社 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1 人工智能AI:TensorFlow Keras PyTorch ...
- 超全面试汇总——Hive 超详细!!!带答案!!!持续更新中~
Hive面试总结 什么是 Hive ? Hive结构描述 Hive的优势 内部表.外部表.分区表.分桶表 hive中 排序的种类和适用场景 动态分区和静态分区的区别 + 使用场景 hive 语句执行顺 ...
- Hive入门详解操作
Hive 第一章 Hive简介 1.1. Hive的简介 1.1.1 hive出现的原因 FaceBook网站每天产生海量的结构化日志数据,为了对这些数据进行管理,并且因为机器学习的需求,产生了hiv ...
- hive on tez 执行任务报错
hive on tez,在执行任务的时候报错,这种情况原因是container资源被抢占或者是资源不足.而task最大的失败次数默认是4,am自己失败的最大重试次数默认是2次. 报错日志: Verte ...
- TDW(Tencent Data Warehouse)之hive简介
1. 基本概念 Hive是由Facebook在2007年8月开始开发,并于2008年8月开源(https://issues.apache.org/jira/browse/HADOOP-3601 ...
最新文章
- Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
- Java Eclipse进行断点调试
- 单链表之无头和有头--逆序
- [ZJOI2005]午餐(贪心+dp)
- java提高篇之抽象类与接口
- 铺设道路(洛谷P5019题题解,Java语言描述)
- mysql导出逗号_Mysql导出逗号分隔的csv文件
- mysql workbench 建表时PK, NN, UQ, BIN, UN, ZF, AI
- 数据库 索引超出了数组界限
- 【015】基于51单片机的LCD1602流动字符串proteus仿真设计
- apue.3e环境配置
- C++ malloc头文件
- MOOC大奖赛现场统分(10分)
- if __name__ == '__mian__'的作用?
- 【opencv学习笔记】021之霍夫直线变换原理详解
- 像图形一样思考以做出决策:彼得斯堡
- 新出炉彩色游戏——炸弹战争1.0版
- php7生命周期,PHP 的生命周期与模块的sapi 原理
- 外包两年跳进外企和大厂,简历污点不是外包经历,是技术太差
- 全球区块链第9周看点 | 以太坊君士坦丁堡/圣彼得堡硬分叉正式完成;纳斯达克正式上线BTC和ETH指数...
热门文章
- iOS Hacker dumpdecrypted脱壳
- javaweb实现单点登录,防止重复登录,获取sessionid,对session及时销毁回收,只允许一个用户登录,结合struts2实现
- c++primer练习13.42
- which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mod
- 简单说明c语言中常用的基本数据类型有哪些,C语言基本数据类型的.ppt
- php 汉字转拼音类,PHP汉字转换拼音的类_php
- 第4章:分布式数据库 HBase
- Linux基础-1.0共享文件夹创建
- 简述一下你对mysql事物的理解_面试题:说说你对数据库事务的理解
- 5G NR上行控制信道PUCCH