一、基本概念

  1.什么是hive

  The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.

    简洁的中文解释就是:

  Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

    数据仓库的概念可以先查看百度百科的介绍

  数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

    数据库与数据仓库的区别对比,参考知乎相关问题https://www.zhihu.com/question/20623931

    更加详细的数仓的介绍与深入,将另开随笔介绍!

  2.为什么用hive  

  • 直接使用hadoop所面临的问题

    人员学习成本太高

    项目周期要求太短

    MapReduce实现复杂查询逻辑开发难度太大

  • 为什么要使用Hive

    操作接口采用类SQL语法,提供快速开发的能力。

    避免了去写MapReduce,减少开发人员的学习成本。

    扩展功能很方便。

  3.hive架构

    

    基本组件:  

  • 用户接口:包括 CLI、JDBC/ODBC、WebGUI。
  • 元数据存储:通常是存储在关系数据库如 mysql , derby中。
  • 解释器、编译器、优化器、执行器。

    组件功能:

  • 用户接口主要由三个:CLI、JDBC/ODBC和WebGUI。其中,CLI为shell命令行;JDBC/ODBC是Hive的JAVA实现,与传统数据库JDBC类似;WebGUI是通过浏览器访问Hive。
  • 元数据存储:Hive 将元数据存储在数据库中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。

    更多详细的hive体系架构深入介绍,参考http://blog.csdn.net/zhoudaxia/article/details/8855937

  4.hive与Hadoop的关系   

    Hive利用HDFS存储数据,利用MapReduce查询数据

    

    与传统数据库对比:

    

  补充计算框架tezhttps://www.cnblogs.com/yjt1993/p/11044578.html

  性能优于MR的DAG计算框架!

   5.hive数据存储

    1、Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)

    2、只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

    3、Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。

      ² db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹

      ² table:在hdfs中表现所属db目录下一个文件夹

      ² external table:外部表, 与table类似,不过其数据存放位置可以在任意指定路径

        普通表: 删除表后, hdfs上的文件都删了

        External外部表删除后, hdfs上的文件没有删除, 只是把文件删除了

    内外部表的区别:

未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)

    使用场景:

外部表使用场景:导入hdfs中的源数据
内部表使用场景:存放Hive处理的中间表、结果表 如:
每天将日志数据传入HDFS,一天一个目录;Hive基于流入的数据建立外部表,将每天HDFS上的原始日志映射到外部表的天分区中;
在外部表基础上做统计分析,使用内部表存储中间表、结果表,数据通过SELECT+INSERT进入内部表

      内部表外部表的区别,我们可以参考:https://blog.csdn.net/qq_36743482/article/details/78393678

                      https://www.jianshu.com/p/cd30f7980e9f

      ² partition:在hdfs中表现为table目录下的子目录

      ² bucket:桶, 在hdfs中表现为同一个表目录下根据hash散列之后的多个文件, 会根据不同的文件把数据放到不同的文件中

二、hive安装与配置

  ###hive可视化工具推荐http://lxw1234.com/archives/2016/09/723.htm

 https://www.cnblogs.com/wujiadong2014/p/6058851.html

 1.准备安装包——推荐使用sftp上传,更快速!

    

  2.解压

    与之前保持一致,解压至apps,当然到usr/local等自定义的目录是完全没毛病的

[hadoop@mini1 ~]$ tar -zxvf apache-hive-1.2.-bin.tar.gz -C apps/

    顺便将解压出来的文件夹的过长的名字稍作更改:

[hadoop@mini1 apps]$ mv apache-hive-1.2.-bin/ hive-1.2.

  3.安装mysql

    由于hive是默认将元数据保存在本地内嵌的 Derby 数据库中,但是这种做法缺点也很明显,Derby不支持多会话连接,因此本文将选择mysql作为元数据存储。

    mysql的安装参考之前linux的随笔,注意开启用户远程登录!

  4.配置元数据库信息

    这里暂时不修改默认的了,在conf目录下使用一个新的配置文件hive-site.xml:

vi  hive-site.xml

    以下配置项也是简单易懂的:

<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property> <property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property> <property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property> <property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Zcc170821#</value>
<description>password to use against metastore database</description>
</property>
</configuration>

 hive进行元数据管理,参考介绍:https://www.cnblogs.com/qingyunzong/p/8710356.html#_label2

   5.添加mysql驱动包

    在lib目录下添加驱动包

    

  6.替换JLine的jar包

    解决Jline包版本不一致的问题

[hadoop@mini1 lib]$ rm ~/apps/hadoop-2.6./share/hadoop/yarn/lib/jline-0.9..jar
[hadoop@mini1 lib]$ cp jline-2.12.jar ~/apps/hadoop-2.6./share/hadoop/yarn/lib/

  7.配置环境变量

[hadoop@mini1 hive-1.2.]$ sudo vim /etc/profile
export HIVE_HOME=/home/hadoop/apps/hive-1.2.
export PATH=$PATH:$HIVE_HOME/bin
[hadoop@mini1 hive-1.2.]$ source /etc/profile

  8.初体验

 启动之前,需要启动MySQL

systemctl start mysql

启动ZK(已编写一键启停脚本在/root下)

/root/bin/startZK.sh

启动Hadoop(在hadoop/sbin下已有脚本,配置即可)

sbin/start-dfs.sh
sbin/start-yarn.sh

 启动hive:

[hadoop@mini1 hive-1.2.]$ bin/hive

 // 配置环境变量后可以直接启动

   建库:

hive> create database shizhan01;
OK
Time taken: 0.943 seconds
hive>

  

  建表:

hive> use shizhan01;
OK
Time taken: 0.049 seconds
hive> create table t_user(id int,name string);
OK
Time taken: 0.395 seconds
hive>

  // hive中使用完全的java数据类型即可!

  查看元数据:

  

   删除t_user;重新建表指定数据格式:

hive> create table t_user01(id int,name string)
> row format delimited
> fields terminated by ','
> ;
OK
Time taken: 0.074 seconds
hive>

   上传测试数据:

[hadoop@mini1 ~]$ vim user.dat
[hadoop@mini1 ~]$ ls
apache-hive-1.2.-bin.tar.gz apps hadoop-2.6..tar.gz hdpdata user.dat
[hadoop@mini1 ~]$ hadoop fs -put user.dat /user/hive/warehouse/shizhan01.db/t_user

   正常查询:

hive> select * from t_user01;
OK
1 Join
2 Mary
3 Bob

   通过mr任务:

hive> select count(*) from t_user01;
Query ID = hadoop_20180224172255_b984036d-5bdd-44fc-bfb5-380b9a433034
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1519458521203_0001, Tracking URL = http://mini1:8088/proxy/application_1519458521203_0001/
Kill Command = /home/hadoop/apps/hadoop-2.6.4/bin/hadoop job -kill job_1519458521203_0001
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2018-02-24 17:23:09,002 Stage-1 map = 0%, reduce = 0%
2018-02-24 17:23:15,635 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.29 sec
2018-02-24 17:23:25,213 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 2.63 sec
MapReduce Total cumulative CPU time: 2 seconds 630 msec
Ended Job = job_1519458521203_0001
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 2.63 sec HDFS Read: 6416 HDFS Write: 2 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 630 msec
OK
4
Time taken: 31.956 seconds, Fetched: 1 row(s)
hive>

三、启动为thrift服务

  1.启动

启动为前台:bin/hiveserver2
启动为后台:nohup bin/hiveserver2 >/var/log/hiveserver.log >/var/log/hiveserver.err &

  2.连接

    使用支持thrift服务的进行连接,这里采用hive默认提供的beeline(另外复制一个SSH隧道)

[hadoop@mini1 ~]$ beeline
Beeline version 1.2. by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: hadoop
Enter password for jdbc:hive2://localhost:10000:
Connected to: Apache Hive (version 1.2.)
Driver: Hive JDBC (version 1.2.)
Transaction isolation: TRANSACTION_REPEATABLE_READ
: jdbc:hive2://localhost:10000>

  // 默认是使用hadoop用户无密码登录即可,或者进行配置(当然配置的意义不大)

    或者使用启动即连接:

bin/beeline -u jdbc:hive2://localhost:10000 -n hadoop

    当然,更加推荐的方式是自己在有环境变量的bin下写个启动脚本,以后就可以使用startbeeline.sh等自定义脚本一键启动了!

 补充:

  也可以通过hive -e 'sql'的形式

[hadoop@mini1 ~]$ hive -e 'sql'

  这样的好处是执行完了回到命令行,也就是可以通过shell脚本来执行一连串的sql了,而不用一个一个在命令行敲了!

  或者执行某个sql文件

[hadoop@mini1 ~]$ hive -f '1.sql'

四、使用HUE进行界面化管理

  安装hue以及配置Mysql作为外部元数据库等参考HUE随笔!

  参考随笔:https://www.cnblogs.com/zlslch/p/6804757.html

大数据入门第十一天——hive详解(一)入门与安装的更多相关文章

  1. 大数据入门第十一天——hive详解(二)基本操作与分区分桶

    一.基本操作 1.DDL 官网的DDL语法教程:点击查看 建表语句 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data ...

  2. 大数据入门第十一天——hive详解(三)hive函数

    一.hive函数 1.内置运算符与内置函数 函数分类: 查看函数信息: DESC FUNCTION concat; 常用的分析函数之rank() row_number(),参考:https://www ...

  3. 大数据入门第七天——MapReduce详解(一)入门与简单示例

    一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...

  4. 大数据入门第七天——MapReduce详解(二)切片源码浅析与自定义patition

    一.mapTask并行度的决定机制 1.概述 一个job的map阶段并行度由客户端在提交job时决定 而客户端对map阶段并行度的规划的基本逻辑为: 将待处理数据执行逻辑切片(即按照一个特定切片大小, ...

  5. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  6. 大数据入门第八天——MapReduce详解(三)MR的shuffer、combiner与Yarn集群分析

    /mr的combiner /mr的排序 /mr的shuffle /mr与yarn /mr运行模式 /mr实现join /mr全局图 /mr的压缩 今日提纲 一.流量汇总排序的实现 1.需求 对日志数据 ...

  7. 大数据入门第十七天——storm上游数据源 之kafka详解(三)其他问题

    一.kafka文件存储机制 1.topic存储 在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序 ...

  8. 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装

    一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...

  9. 大数据入门第十六天——流式计算之storm详解(二)常用命令与wc实例

    一.常用命令 1.提交命令 提交任务命令格式:storm jar [jar路径] [拓扑包名.拓扑类名] [拓扑名称] torm jar examples/storm-starter/storm-st ...

随机推荐

  1. npm、webpack、Gulp 中文教程

    按顺序阅读 1.npm 模块管理器 2.package.json 文件 3.npm 模块安装机制简介 4.npm scripts 使用指南 5.CommonJS 规范 随着 es6 模块化特性的出现, ...

  2. 数据契约(DataContract)里的DataMember特性

      数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可 ...

  3. JAVA两种代理模式

    简单设计动态代理,基本模拟spring的动态代理方式. before afterReturning around afterException after这些通知方法都可以这块模拟出来 spring的 ...

  4. 配置nginx官网yum源

    由于yum源中没有我们想要的nginx,那么我们就需要创建一个“/etc/yum.repos.d/nginx.repo”的文件,其实就是新增一个yum源 二.添加nginx.repo 文件: [roo ...

  5. 铁乐学python_day04-作业

    1,写代码,有如下列表,按照要求实现每一个功能 li = ['alex', 'wusir', 'eric', 'rain', 'alex'] 计算列表的长度并输出 print(len(li)) 答:结 ...

  6. codeforces 1007B Pave the Parallelepiped

    codeforces 1007B Pave the Parallelepiped 题意 题解 代码 #include<bits/stdc++.h> using namespace std; ...

  7. Web 通信 之 长连接、长轮询(转)

    Web 通信 之 长连接.长轮询(long polling) 基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强 ...

  8. JavaScript验证字符串只能包含数字或者英文字符的代码实例

    验证字符串只能包含数字或者英文字符的代码实例:本章节分享一段代码实例,它实现了验证字符串内容是否只包含英文字符或者数字.代码实例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  9. 通过golang 查询impala

    cloudera官方没有提供impala基于golang的驱动,github有github.com/bippio/go-impala package main import ( "conte ...

  10. laravel框架之blade模板引擎

    ## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> ...