Fork me on GitHub

Hive Day01


hive

数据仓库

产生的背景

处理结构化数据;数据量小的时候,使用sql是最好的解决方案;但是一旦数据量变大,那么此时就需要使用Mapreduce了,而Mapreduce开发的成本高;用人成本;时间成本;
此时如果有一个组件,提供sql编程和分布式运行计算程序;name就是hive了;

hive就是对外提供hql编程,将hql转换为Mapreduce任务的;
hive底层数据存放在hdfs上;计算使用的是Mapreduce;hive就相当于对hadoop做了一层上层封装;hive可以看做是hadoop的另外一种模式的客户端;
hive可以极大的降低结构化数据分析的成本;

对于半结构化或非结构化的数据;hive是不可以分析的

hive的介绍

  1. Hive由 Facebook实现并开源;也是apache基金会的一个顶级项目;
  2. 是基于hadoop的一个数据仓库工具;
  3. 可以将结构化的数据映射为一张数据库表;在hive中指定一份结构化的数据,就可以用hive中的表进行关联;数据文件的一行数据对应---hive表中的一行;数据文件中的一个字段---hive表中的一列;
  4. 提供HQL查询功能; hive对外提供hql查询;
  5. 底层数据是存储在HDFS上; hive的原始数据存储在HDFS的;在HDFS上有一个hive的默认目录;称为hive的家目录;hive中存储所有的表数据就会默认存储在hive的家目录下;
  6. Hive的本质是将SQL语句转换为MapReduce任务运行;在hive底层会保存很多map和reduce模板;hive最后将hql语句翻译成Mapreduce任务;
  7. 使不熟系Mapreduce的用户很方便的利用HQL处理和计算HDFS上的数据;处理和计算HDFS上的结构化的数据;
  8. 适用于离线的批量的数据计算。依赖于hadoop

数据库与数据仓库的比较

  1. 概念
    1. 数据仓库:更倾向于数据管理;管理的数据可以不是存储在自己本地的数据;通常用于大批量的数据管理;
    2. 数据库:存储的数据一般在自己的本地;通常用于存储小批量的数据;一般用于存储结果数据
  2. 使用:
    数据仓库: hql, 方言版sql
    数据库:mysql 标准sql;nosql 数据库 自己的一套shell
  3. 应用场景上:
    OLAP:on line analysis processing 联机分析处理 (查询) 数据仓库
    OLTP:on line transaction Processing 联机事务处理 (增删改) 数据库
  4. 模式上
    数据仓库:hive, 写模式
    数据库:关系型数据库一般都是写模式;分布式的数据库的模式不确定;

hive中不支持事务的;在hive中甚至不支持update,delete操作;支持insert,但是性能比较低。

hive的优缺点

优点:延展性;hive支持自定义函数

缺点:

  1. 不支持事务
  2. 不支持行级别的update和delete操作;但是支持insert操作,性能低
  3. 查询的延时性很高;不适合实时;

hive的架构

  1. 用户接口层:
    1. CLI shell访问
    2. ODBC/JDBC 代码访问
    3. WEB UI 网页访问,一般不用;因为配置复杂;界面不友好;
  2. Thrift Server:跨语言服务层;将各个语言最终翻译成hive识别的操作符;
  3. 元数据库层
    1. 元数据库存储的是用于描述hive中的库或表或表字段的信息的数据;
    2. hive的元数据是结构化数据存储的;hive的元数据存储在关系型数据库的;默认存储在Derby的数据库的;一般情况下我们会改为mysql;
    3. 元数据存储的是 表名,表的字段,字段的顺序,字段的类型
    4. 原始数据存储的是 表中的数据;
  4. 驱动层
    1. 解释器:是将HiveSQL语句转换为抽象语法树
    2. 编译器:将语法树编译为逻辑执行计划 初步构思
    3. 优化器:对逻辑执行计划进行优化 将相同的任务进行合并;
    4. 执行器:调用底层的运行框架执行逻辑执行计划;

hive的安装

安装准备: jdk,hadoop,mysql
安装节点:一个节点

安装的版本:hive-2.3.2版本; 1.2.1版本;
下载安装包的镜像站:
http://mirror.bit.edu.cn/apache/hive/

http://mirrors.hust.edu.cn/apache/hive/

http://mirrors.shu.edu.cn/apache/hive/

http://mirrors.tuna.tsinghua.edu.cn/apache/hive/

元数据使用自带的derby数据库;

  1. 上传安装包

  2. 解压

  3. 配置环境变量

    [hadoop@hdp02 apps]$ cat /etc/profile.d/hive.sh 
    export HIVE_HOME=/home/hadoop/apps/hive
    export PATH=$HIVE_HOME/bin:$PATH
    [hadoop@hdp02 ~]$ . /etc/profile.d/hive.sh 
    [hadoop@hdp02 ~]$ echo $HIVE_HOME
    /home/hadoop/apps/hive
    
  4. 为了方便集群的版本升级。可以先创建软链接
    [hadoop@hdp02 ~]$ ln -s apache-hive-2.3.2-bin hive

  5. 元数据库初始化

    schematool -dbType derby -initSchema
    SchemaTool completed 证明初始化成功
    注意:元数据初始化不成功的时候不要启动hive;
    初始化完成后会发现在初始化的目录下,会多几个文件
    derby.log derby的日志文件
    metastore_db 元数据库文件

  6. 启动

    [hadoop@hdp02 apps]$ hive
    which: no hbase in (/home/hadoop/apps/hive/bin:/usr/lib64/qt-3.3/bin:/usr/java/jdk1.8.0_191-amd64/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/apps/hadoop-2.7.6/bin:/home/hadoop/apps/hadoop-2.7.6/sbin:/home/hadoop/bin)
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    
    Logging initialized using configuration in jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/hive-common-2.3.2.jar!/hive-log4j2.properties Async: true
    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>   # hive的客户端操作界面,可以执行hive的shell;对于hive来说sql的绝大多数是可以使用的
    
  7. 异常;直接启动会报错,元数据报错;

    启动之前需要初始化元数据库;
    这个方式在哪一个目录初始化,在哪一个目录启动,没有问题;
    一旦切换目录;就报错;
    原因是derby这种方式在启动的时候只会读取启动目录下的元数据库;切换目录后启动目录下没有元数据库信息了,就会报错;

缺陷:元数据信息无法共享;本目录只能访问本目录下元数据信息;只适合单用户使用;不适合多用户使用;

元数据库为mysql的安装方式

  1. 安装mysql;并配置好mysql的用户名和密码;
    yum安装mysql
    配置yum源: 在/mnt创建目录cdrom
    挂载:sudo mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom
    配置本地yum源
    cd /etc/yum.repo.d/

    sudo rename .repo .repo.bak *
    sudo cp CentOS-Media.repo.bak CentOS-Media.repo
    vim CentOS-Media.repo
    file:///mnt/cdrom  # 本地文件路径
    
    sudo yum clean all
    sudo yum repolise
    

    安装mysql
    sudo yum install -y mysql-server
    启动mysql
    sudo service mysqld start

    修改mysql的用户名和密码;密码为空
    mysql -uroot -p

    delete from user where user="";
    update user set host="%" where host="localhost";
    update user set password=PASSWORD("123456") where user="root";
    flush privileges;
    exit;
    

    重启mysql服务

  2. 上传hive的安装包

  3. 解压hive的安装包

  4. 修改环境变量

  5. 修改hive配置文件

    /home/hadoop/apps/hive/conf
    touch hive-site.xml
    [hadoop@hdp02 conf]$ cat hive-site.xml 
    <configuration>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/myhive?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore,myhive表示存储hive元数据在mysql中的数据库名</description>
    <!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost -->
    </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>root</value>
    <description>password to use against metastore database</description>
    </property>
    </configuration>
    
    
    
  6. 将mysql的驱动包放在hive的依赖库中;lib目录下

  7. 初始化hive
    [hadoop@hdp02 lib]$ schematool -dbType mysql -initSchema

  8. 启动hive

    [hadoop@hdp02 lib]$ hive
    which: no hbase in (/home/hadoop/apps/hive/bin:/usr/lib64/qt-3.3/bin:/usr/java/jdk1.8.0_191-amd64/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hadoop/apps/hadoop-2.7.6/bin:/home/hadoop/apps/hadoop-2.7.6/sbin:/home/hadoop/bin)
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/home/hadoop/apps/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    
    Logging initialized using configuration in jar:file:/home/hadoop/apps/apache-hive-2.3.2-bin/lib/hive-common-2.3.2.jar!/hive-log4j2.properties Async: true
    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> 
    

hive的命令

create database test;
use test;
create table stu(course string ,name string score int) row format delimited fields terminated by ',';

row format 行格式化
delimited 分界
fields terminated 列分界符
lines terminated by '\n' 行分隔符;

本地数据加载到表中
load data local inpath "/home/hadoop/tmpdata/score" into table stu;
posted @ 2019-05-15 17:01  耳_东  阅读(107)  评论(0)    收藏  举报