[Hadoop]数据仓库基础与Apache Hive入门

目录

         大数据导论与Linux基础

Apache Hadoop、HDFS

大数据导论与Linux基础

数据仓库基本概念

数据仓库概念

数据仓库主要特征

数据仓库主流开发语言--SQL

Apache Hive入门

Apache Hive概述

场景设计:如何模拟实现Hive功能

Apache Hive架构、组件

Apache Hive安装部署

Apache Hive元数据

Hive3安装

Apache Hive客户端使用

Hive SQL 语言


数据仓库基本概念

数据仓库概念

  • 数据仓库(简称DW、数仓),是一个用于存储、分析、报告的数据系统

  • 数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统

  • 同时数据仓库自身也不需要“消费”任何的数据,其结果开放给各个外部应用使用

  • 这也是为什么叫“仓库”,而不叫“工厂”的原因

  • 数据仓库是为了分析数据而来,分析结果给企业决策提供支撑

数据仓库主要特征

  • 面向主题:主题是一个抽象概念,是较高层次上数据综合、归类并进行分析利用的抽象

  • 集成性:主题相关的数据通常分布在多个操作系统中,彼此分散、独立、异构,因此再数据进入数仓之前,必须要经过统一与综合,对数据进行抽取、清理、转换和汇总

  • 非易失性、非易变性:

    • 数仓是分析数据的平台,而不是创造数据的平台。我们通过数仓去分析数据中的规律,而不是去创造修改其中的规律。因此数据进入数仓之后,它便稳定且不会改变

    • 数仓的数据反应的是一段相当长的时间内历史数据的内容,数仓的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数仓之后,一般情况下被较长时间保留

    • 数仓一般有大量的查询操作,但修改和删除操作很少

  • 时变性:数据仓库的数据需要随着时间更新,以适应决策的需要

数据仓库主流开发语言--SQL

  • 结构化查询语言(简称SQL),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据

  • 虽然SQL语言是针对数据库软件设计的,但是在数仓领域,尤其是大数据数仓领域,很多数仓软件都会去支持SQL语法。原因在于:用于学习SQL成本低,SQL语言对数据分析十分友好

  • 结构化数据与非结构化数据

[Hadoop]数据仓库基础与Apache Hive入门_第1张图片

 

  • SQL语法分类:

    • 数据定义语言(DDL),使我们有能力创建或删除表,以及数据库、索引等各种对象,但是不涉及表中具体数据操作:

      CREATE DATABASE - 创建新数据库
      CREATE TABLE - 创建新表

    • 数据操纵语言(DML),针对表中的数据进行增删改查:

      SELECT - 从数据库表中获取数据
      UPDATE - 更新数据库表中的数据
      DELETE - 从数据库表中删除数据
      INSERT - 向数据库表中插入数据

Apache Hive入门

Apache Hive概述

什么是Hive

  • Hive是一款建立在Hadoop之上的开源的数仓系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问存储在Hadoop文件中的大型数据集

  • Hive核心是将HQL转化为MapReduce程序,然后将程序提交到Hadoop集群执行

[Hadoop]数据仓库基础与Apache Hive入门_第2张图片

为什么使用Hive

  • 使用MapReduce直接处理数据所面临的问题

    • 人员学习成本太高,需要掌握

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

  • 使用Hive处理数据的好处

    • 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)

    • 避免直接写MapReduce,减少开发人员的学习成本

    • 支持自定义函数,功能扩展很方便

    • 背靠Hadoop,擅长存储分析海量数据集

Hive和Hadoop关系

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

场景设计:如何模拟实现Hive功能

  • Hive能将数据文件映射成为一张表,这个映射是什么?

    • 映射信息专业的叫法称之为元数据信息,它包含:

      • 表对应着哪个文件(位置信息)

      • 表的列对应着文件哪一个字段(顺序信息)

      • 文件字段之间的分隔符是什么

[Hadoop]数据仓库基础与Apache Hive入门_第3张图片

  • Hive软件本身到底承担了什么功能职责?

    • SQL语法校验、解析、编译成为MapReduce

  • 最终效果

[Hadoop]数据仓库基础与Apache Hive入门_第4张图片

Apache Hive架构、组件

[Hadoop]数据仓库基础与Apache Hive入门_第5张图片

Apache Hive安装部署

Apache Hive元数据

  • 元数据是描述数据的数据,主要是描述数据属性的信息

  • Hive Metadata即Hive的元数据,包含用Hive创建的database、table、表的位置、类型、属性、字段顺序类型等元信息

  • 元数据存储在关系型数据库中。如hive内置的Derby或者第三方如MySQL等

  • Hive Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接matestore服务,由metastore再去连接MySQL数据库来存取元数据

[Hadoop]数据仓库基础与Apache Hive入门_第6张图片

  • metastore服务配置有3张模式:内嵌模式、本地模式、远程模式

[Hadoop]数据仓库基础与Apache Hive入门_第7张图片

  • 在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。

Hive3安装


安装前准备

  • 服务器基础环境:集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装

  • Hadoop集群健康可用:启动Hive之前必须先启动Hadoop集群。特别要注意,需等待HDFS安全模式关闭之后再启动运行Hive

Hadoop与Hive整合

  • 因为Hive需要把数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据;

  • 因此需要在Hadoop中添加相关配置属性,以满足Hive在Hadoop上运行。

  • 修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重启生效。



hadoop.proxyuser.root.hosts
*


hadoop.proxyuser.root.groups
*

Mysql安装

  • 卸载Centos7自带的mariadb

    [root@node3 ~]# rpm -qa|grep mariadb
    mariadb-libs-5.5.64-1.el7.x86_64
    ​
    [root@node3 ~]# rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps
    [root@node3 ~]# rpm -qa|grep mariadb                            
    [root@node3 ~]# 

  • 安装mysql

    mkdir /export/software/mysql
    ​
    #上传mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 到上述文件夹下  解压
    tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
    ​
    #执行安装
    yum -y install libaio
    ​
    [root@node3 mysql]# rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm 
    ​
    warning: mysql-community-common-5.7.29-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:mysql-community-common-5.7.29-1.e################################# [ 25%]
       2:mysql-community-libs-5.7.29-1.el7################################# [ 50%]
       3:mysql-community-client-5.7.29-1.e################################# [ 75%]
       4:mysql-community-server-5.7.29-1.e################                  ( 49%)

  • mysql初始化设置

    #初始化
    mysqld --initialize
    ​
    #更改所属组
    chown mysql:mysql /var/lib/mysql -R
    ​
    #启动mysql
    systemctl start mysqld.service
    ​
    #查看生成的临时root密码
    cat  /var/log/mysqld.log
    ​
    [Note] A temporary password is generated for root@localhost: o+TU+KDOm004

  • 修改root密码 授权远程访问 设置开机自启动

    [root@node2 ~]# mysql -u root -p
    Enter password:     #这里输入在日志中生成的临时密码
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.29
    ​
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    ​
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    ​
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    ​
    mysql> 
    ​
    ​
    #更新root密码  设置为hadoop
    mysql> alter user user() identified by "hadoop";
    Query OK, 0 rows affected (0.00 sec)
    ​
    ​
    #授权
    mysql> use mysql;
    ​
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION;
    ​
    mysql> FLUSH PRIVILEGES; 
    ​
    #mysql的启动和关闭 状态查看 (这几个命令必须记住)
    systemctl stop mysqld
    systemctl status mysqld
    systemctl start mysqld
    ​
    #建议设置为开机自启动服务
    [root@node2 ~]# systemctl enable  mysqld                             
    Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
    ​
    #查看是否已经设置自启动成功
    [root@node2 ~]# systemctl list-unit-files | grep mysqld
    mysqld.service                                enabled 
    ​
    #退出mysql登陆
    Ctrl+d

  • Centos7 干净卸载mysql 5.7

    #关闭mysql服务
    systemctl stop mysqld.service
    ​
    #查找安装mysql的rpm包
    [root@node3 ~]# rpm -qa | grep -i mysql      
    mysql-community-libs-5.7.29-1.el7.x86_64
    mysql-community-common-5.7.29-1.el7.x86_64
    mysql-community-client-5.7.29-1.el7.x86_64
    mysql-community-server-5.7.29-1.el7.x86_64
    ​
    #卸载
    [root@node3 ~]# yum remove mysql-community-libs-5.7.29-1.el7.x86_64 mysql-community-common-5.7.29-1.el7.x86_64 mysql-community-client-5.7.29-1.el7.x86_64 mysql-community-server-5.7.29-1.el7.x86_64
    ​
    #查看是否卸载干净
    rpm -qa | grep -i mysql
    ​
    #查找mysql相关目录 删除
    [root@node1 ~]# find / -name mysql
    /var/lib/mysql
    /var/lib/mysql/mysql
    /usr/share/mysql
    ​
    [root@node1 ~]# rm -rf /var/lib/mysql
    [root@node1 ~]# rm -rf /var/lib/mysql/mysql
    [root@node1 ~]# rm -rf /usr/share/mysql
    ​
    #删除默认配置 日志
    rm -rf /etc/my.cnf 
    rm -rf /var/log/mysqld.log


Hive的安装

  • 上传安装包到/export/server 解压

    tar zxvf apache-hive-3.1.2-bin.tar.gz

  • 解决Hive与Hadoop之间guava版本差异

    cd /export/server/apache-hive-3.1.2-bin/
    rm -rf lib/guava-19.0.jar
    cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/

  • 修改配置文件

    • hive-env.sh

      cd /export/server/apache-hive-3.1.2-bin/conf
      mv hive-env.sh.template hive-env.sh
      ​
      vim hive-env.sh
      export HADOOP_HOME=/export/server/hadoop-3.3.0
      export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf
      export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib

    • hive-site.xml

      vim hive-site.xml
      
      
      
          javax.jdo.option.ConnectionURL
          jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
      
          javax.jdo.option.ConnectionDriverName
          com.mysql.jdbc.Driver
      
          javax.jdo.option.ConnectionUserName
          root
      
          javax.jdo.option.ConnectionPassword
          hadoop
      
      
          hive.server2.thrift.bind.host
          node1
      
      
          hive.metastore.uris
          thrift://node1:9083
       
      
          hive.metastore.event.db.notification.api.auth
          false
      
      
  • 上传mysql jdbc驱动到hive安装包lib下

    mysql-connector-java-5.1.32.jar

  • 初始化元数据

    cd /export/server/apache-hive-3.1.2-bin/
    ​
    bin/schematool -initSchema -dbType mysql -verbos
    #初始化成功会在mysql中创建74张表

  • 在hdfs创建hive存储目录(如存在则不用操作)

    hadoop fs -mkdir /tmp
    hadoop fs -mkdir -p /user/hive/warehouse
    hadoop fs -chmod g+w /tmp
    hadoop fs -chmod g+w /user/hive/warehouse

  • ==启动hive==

    • 1、启动metastore服务

      #前台启动  关闭ctrl+c
      /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
      ​
      #前台启动开启debug日志
      /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console  
      ​
      #后台启动 进程挂起  关闭使用jps+ kill -9
      nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &

Apache Hive客户端使用

  • HiveServer2通过Metastore服务读写元数据。所以在远程模式下,启动HiveServer2之前必须先启动metastore服务

  • 远程模式下,Beeline客户端只能通过HiveServer2服务访问Hive。而bin/hive是通过Metastore服务访问的

[Hadoop]数据仓库基础与Apache Hive入门_第8张图片

bin/beeline客户端使用

  • 在hive安装的服务器上(node1),首先启动metastore服务,然后启动hiveserver2服务

nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
  • 在node3上使用beeline客户端进行连接访问。需要注意hiveserver2服务启动之后需要稍等一会才可以对外提供服务

    • beeline客户端连接

      • 拷贝node1安装包到beeline客户端机器上(node3)

         
                
        scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/

      • 错误

        Error: Could not open client transport with JDBC Uri: jdbc:hive2://node1:10000: 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)
        • 修改

          在hadoop的配置文件core-site.xml中添加如下属性:
          
                  hadoop.proxyuser.root.hosts
                *
          
          
                  hadoop.proxyuser.root.groups
                  *
          

        • 连接访问

          /export/server/apache-hive-3.1.2-bin/bin/beeline
          ​
          beeline> ! connect jdbc:hive2://node1:10000
          beeline> root
          beeline> 直接回车

[Hadoop]数据仓库基础与Apache Hive入门_第9张图片

Hive SQL 语言

  • 在Hive中,默认的数据库叫做default,存储数据位位于HDFS的/user/hive/warehouse下

  • 用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下

  • Hive最常用的数据类型是string和int

  • 分隔符指定语法

    • row format delimited 语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据

    • [Hadoop]数据仓库基础与Apache Hive入门_第10张图片

    • Hive建表时如果没有 row format语法指定分隔符,则采用默认分隔符'\001',使用ASCII编码的值,键盘是打不出来的

    • 在vim中,连续按下Ctrl+v/Ctril+a即可输入'\001',显示^A

  • [Hadoop]数据仓库基础与Apache Hive入门_第11张图片

    • 在一些文本编辑器上以SOH的形式显示

练习

[Hadoop]数据仓库基础与Apache Hive入门_第12张图片

--创建数据库并切换使用
create database if not exists itheima;
use itheima;
--ddl create table
create table t_archer(
id int comment "ID",
name string comment "英雄名称",
hp_max int comment "最大生命",
mp_max int comment "最大法力",
attack_max int comment "最高物攻",
defense_max int comment "最大物防",
attack_range string comment "攻击范围",
role_main string comment "主要定位",
role_assist string comment "次要定位"
) comment "王者荣耀射手信息"
row format delimited
fields terminated by "\t";

建表成功之后,在Hive的默认存储路径下就生成了表对应的文件夹,将archer.txt文件上传到对应的文件夹下。

#在node机器上进行操作
cd ~
mkdir hivedata
cd hivedata/
#把文件从课程资料中首先上传到node1 linux系统上
#执行命令把文件上传到HDFS表所对应的目录下
hadoop fs -put archer.txt /user/hive/warehouse/itheima.db/t_archer

结果验证

[Hadoop]数据仓库基础与Apache Hive入门_第13张图片

你可能感兴趣的:(数据仓库,hive,hadoop)