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 [email protected]:/opt/hadoop-2.7.3/etc/hadoop/  #将core-site.xml文件分发到Hadoop集群的所有slave上

    scp /opt/hadoop-2.7.3/etc/hadoop/core-site.xml [email protected]:/opt/hadoop-2.7.3/etc/hadoop/

    scp /opt/hadoop-2.7.3/etc/hadoop/core-site.xml [email protected]:/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[1] = ‘spark‘

col2 = MAP(1:hadoop,2:sqoop,3:hive)
col2[1] = 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,元数据和表数据一起删除,不进入垃圾箱。对于外表,只删除元数据

时间: 2024-11-10 01:29:34

BG.Hive - part1的相关文章

BG.Hive - part3

1. Hive数据导入 - Load Load,加载,不会进行任何数据转换和处理的操作,只会进行数据Move操作,将元数据移动到HDFS指定目录 a> hdfs dfs -put 'hdfs的hive目录' b> LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION(partcol1=val1,partcol2=val2...)] filepath: 要加载的数据文件路径,可以是相对路径,

【Hadoop】HIVE 小结概览

一.HIVE概览小结 二.HIVE安装 Hive只在一个节点上安装即可 1.上传tar包 2.解压 tar -zxvf hive-0.9.0.tar.gz -C /cloud/ 3.配置mysql metastore(切换到root用户) 配置HIVE_HOME环境变量 rpm -qa | grep mysql rpm -e mysql-libs-5.1.66-2.el6_3.i686 --nodeps rpm -ivh MySQL-server-5.1.73-1.glibc23.i386.rp

hive操作DML

-- 向数据表中加载文件,不会对数据进行任何转换,load操作只是复制(本地到hdfs).移动(hdfs上的文件)-- 如果表包含分区,则必须指定每个分区的分区名,filepath可以引用一个文件或一个目录-- 如果数据在hdfs上,且filepath不是绝对的,则hive会相对于/user/进行解释,会移动(记住)-- 如果指定了overwrite,会先删除目标表,再移动数据.如果没有且有文件名冲突,那么现有的文件会被新文件替换.load data [local] inpath 'filepa

hive的基本语法汇总(hql)

2019/2/20 星期三 hive的基本语法汇总(hql)----------------------------------------------Hive学习3:Hive三种建表语句详解 https://blog.csdn.net/qq_36743482/article/details/78383964Hive建表方式共有三种:1.直接建表法例如:create table table_name(col_name data_type);2.查询建表法例如:通过AS 查询语句完成建表:将子查询

学习Hive和Impala必看经典解析

Hive和Impala作为数据查询工具,它们是怎样来查询数据的呢?与Impala和Hive进行交互,我们有哪些工具可以使用呢? 我们首先明确Hive和Impala分别提供了对应查询的接口: (1)命令行shell: 1. Impala:impala shell 2. Hive:beeline(早期hive的命令行版本是hive shell,现在基本不使用) (2)Hue Web UI: 1.Hue里面提供了 Hive查询编辑器 2.Hue里面提供了Impala查询编辑器 3.Hue里面提供了元数

Hive报错 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D

报错信息如下 Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D 解决方法: 编辑 hive-site.xml 文件,添加下边的属性 <property> <name>system:java.io.tmpdir<

Spark 整合hive 实现数据的读取输出

实验环境: linux centOS 6.7 vmware虚拟机 spark-1.5.1-bin-hadoop-2.1.0 apache-hive-1.2.1 eclipse 或IntelJIDea 本次使用eclipse. 代码: import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.DataFrame; import o

Hive JDBC——深入浅出学Hive

第一部分:搭建Hive JDBC开发环境 搭建:Steps ?新建工程hiveTest ?导入Hive依赖的包 ?Hive  命令行启动Thrift服务 ?hive --service hiveserver & 第二部分:基本操作对象的介绍 Connection ?说明:与Hive连接的Connection对象 ?Hive 的连接 ?jdbc:hive://IP:10000/default" ?获取Connection的方法 ?DriverManager.getConnection(&q

Hadoop Hive基础sql语法

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持