hive学习资料

加粗样式#### Hive


1. 引言
  1. 什么是Hive

    1.  Hive是apache组织提供的一个基于Hadoop的数据仓库产品
        数据库   DataBase   OLTP  
        数据量级小  
        数据价值高
        数据仓库  DataWarehouse OLAP 
        数据量级大
        数据价值低
    2.  Hive基于Hadoop 
        底层数据存储 HDFS
        运算方式    MR
    
  2. 原有MapReduce处理相关操作时,存在的问题|

    mapreduce处理相关操作时,繁琐
    mapReduce的作用:没有统计,没有分组合并,只做数据清洗,是可以没有reduce
    在这里插入图片描述

  3. Hive核心设计思想

    1. metastore (rdb) 文件 — 数据库 相关概念的对应关系 (映射 Mapping)
    2. SQL —> 复杂的过程( 语法检查 语义检查 生成语法树 优化sql的执行顺序 )----> MapReduce
    3. 类SQL ( HQL Hive Query Language
      HQL Hibernate Query Language )

在这里插入图片描述

2. Hive的环境搭建和基本使用
  1. hive安装

    1. hadoop安装完成
    2. 解压缩hive.tar 到 /opt/install
    3. 修改hive_home/conf/hive-env.sh
       # Set HADOOP_HOME to point to a specific hadoop install directory
       HADOOP_HOME=/usr/hadoop-2.6.0
       # Hive Configuration Directory can be controlled by:
       export HIVE_CONF_DIR=/opt/install/apache-hive-0.13.1-bin/conf
    4. 在hdfs 创建  /tmp  
                   /user/hive/warehouse
    5. bin/hive
       jps --- runjar进程
    
  2. hive基本使用

    1. 查看hive中的所有数据库
       show databases
    2. 创建用户自己的库
       create database dingl;
       create database if not exists dingl;
    3. 使用用户自定义的数据库
       use db_name
       use dingl;
    #  所谓hive中的数据库,本质就是hdfs上的一级目录 默认: /user/hive/warehouse/${db_name}.db
    4. 建表语句
       create table if not exists t_user(
        id int,
        name string
       )row format delimited fields terminated by '\t';
    5. 查看当前数据库中所有的表 
       show tables
    # 所谓hive中的表,本质就是hdfs上的一级目录 默认: /user/hive/warehouse/${db_name}.db/${table_name}
                                                /user/hive/warehouse/dingl.db/t_user
    6. hive中导入数据命令
       load data local inpath '' into table table_name;
       load data local inpath '/root/data/data1' into table t_user;
    
    # 所谓hive导入数据,本质就是hdfs中目录的数据文件
    # 细节:
      1. hive中的数据导入,本质上就是hdfs文件上传,删除表中的数据,本质上就是hdfs中文件的删除
         hive  load data local inpath '/root/hive/data/data1' into table t_user;
         hdfs  bin/hdfs dfs -put /root/hive/data/data1 /user/hive/warehouse/dingl.db/t_user
      2. hive命令的数据导入,如果出现文件名相同的情况下,自动改名
      3. hive中表的数据,只的是这个目录下,所有文件数据之和
      4. hive 执行sql 
         select * 的操作 不启动mr
         select column  启动mr
    
    
3. 切换MetaStore从derby到mysql

hive的metastore默认使用的derby数据库,进行映射存储
问题:derby作为metastore使用,只能让客户开启一个client进行访问

  1. 安装MySQL

    1. wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    2. yum -y install mysql57-community-release-el7-10.noarch.rpm
    3. yum -y install mysql-community-server
    4. systemctl start  mysqld.service
    
    5. mysql管理员密码
       5.1 grep "password" /var/log/mysqld.log 查看临时密码
           A temporary password is generated for root@localhost: ium+hhgLH7Xv
       5.2 mysql -uroot -pium+hhgLH7Xv
       5.3 修改密码
           set global validate_password_policy=0;
           set global validate_password_length=1;
           ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
       5.4 systemctl restart mysqld.service
       5.5 mysql -uroot -p123456
    
    6. 打开mysql远端访问权限
       6.1  set global validate_password_policy=0;
       6.2  set global validate_password_length=1;
       6.3  GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123456";
       6.4  flush privileges;
       6.5  systemctl stop firewalld
    
  2. hive相关的设置

hive_home/conf/hive-site.xml
 <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://localhost:3306/hive_mysql?createDatabaseIfNotExist=true&amp;useSSL=false</value>
        <description>JDBC connect string fora JDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for aJDBC metastore</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>yourname</value>
        <description>username to use againstmetastore database</description>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>yourpass</value>
        <description>password to use againstmetastore database</description>
   </property>
  1. mysql驱动jar 上传 hive/lib
4. yum加速
1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2. 下载 centos7文件 并且上传 /etc/yum.repos.d/
3. yum clean all
4. yum makecache
5. Hive相关的配置参数

在这里插入图片描述

6. Hive的命令行启动参数
1. hive终端基本的形式
   bin/hive
2. 启动hive的同时,设置hive的相关参数
   bin/hive --hiveconf hive.cli.print.current.db true
3. 启动hive的同时,指定数据库
   bin/hive --database db_name
4. 启动hive的同时,运行sql语句
   bin/hive --database dingl -e 'select * from t_user'
   bin/hive --database dingl -e 'select * from t_user' > /root/hive_file 
   bin/hive --database dingl -e 'select * from t_user' >> /root/hive_file 
5. 启动hive的同时,运行sql文件中的sql语句
   bin/hive --database dingl -f /root/hive_sql
7. Hive相关SQL命令的详解
  1. 数据库相关

    1. 创建数据库
       create database if not exists db_name;  // /user/hive/warehouse/db_name.db
       create database if not exists db_name location '/dingl'  //
    2. 显示所有数据库
       show databases;
    3. 使用数据库
       use db_name
    4. 删除数据库
       drop database baizhi_dingl; //删除空数据库
       drop database baizhi_dingl cascade //删除非空库
       
       
    
  2. 表的相关操作

    1. 管理表建表

      0. 查看表的结构
         1. 查看基本结构
            desc table_name;
            desc t_user;
            describe t_user;
         2. 查看表的扩展信息
            desc extended table_name;
            desc extended t_user;
         3. 格式化查看表的扩展信息
            desc formatted table_name;
            desc formatted t_user;
            
      1. 基本建表语句
         create table if not exists table_name(
         id int,
         name string
         )row format delimited fields terminated by 't\';
       2. 指定表的存储位置
         create table if not exists table_name(
         id int,
         name string
         )row format delimited fields terminated by 't\' locaiton 'hdfs_path';
       3. as 关键字建表 (洗数据)
         create table if not exists table_name as select id,name from t_user;
       4. like 关键字建表 
         create table if not exists table_name like t_user;
      
    2. 外部表

      1. 语法
      1. 基本建表语句
         create external table if not exists table_name(
         id int,
         name string
         )row format delimited fields terminated by 't\';
       2. 指定表的存储位置
         create external table if not exists table_name(
         id int,
         name string
         )row format delimited fields terminated by 't\' locaiton 'hdfs_path';
       3. as 关键字建表 (洗数据)
         create external table if not exists table_name as select id,name from t_user;
       4. like 关键字建表 
         create external table if not exists table_name like t_user;
      
      1. 管理表与外部表的区别

        1. 管理表删除后,在hive中表将被删除,同时hdfs上目录也会被删除
        2. 外部表删除后,在hive中表将被删除,同时hdfs上目录不会被删除 (删除metastore中的信息)
        

在这里插入图片描述
3. 分区表

  > 分区表一般是用于对hive查询进行优化使用,为了提高查询效率
  >
  > 1. 分区 必须有一个统一的父级目录,日后便于做全表的统一处理
  > 2. 分区的子目录和数据本身之间没有必然联系,只是区分数据 (静态分区)

  ~~~markdown
  create table t_user_part(
  id int,
  name string)
  partitioned by (data string) row format delimited fields terminated by '\t';
  
  load data local inpath '/root/hive/data/data1' into table t_user_part partition (data='17');
  load data local inpath '/root/hive/data/data1' into table t_user_part partition (data='18');
  
  select * from t_user_part;
  
  select * from t_user_part where data='17' 
  ~~~
  1. 桶表(了解)

  2. 临时表(了解)

8. 数据的导入
1. 本地数据的导入(linux) 【重点】
   load data local inpath '' into table table_name
2. hdfs中导入数据
   load data inpath '' into table table_name
   本质:目录中的数据移动
3. hdfs相关shell完成文件导入
   bin/hdfs dfs -put 'local_path' '/user/hive/warehouse/db_name.db/table_name'  
4. as关键字 【重点】
   创建表的同时,通过查询导入数据
   create table t_xxx as select id,name from t_yyy;
5. insert关键字 【重点】
   表已经存在,通过查询导入数据
   insert into table xxxx select id,name from t_user;
   
9.数据的导出
1. insert导出 【重点】
   导出的数据 mr 自动生成
   insert overwrite local directory '/root/xiaohei' select name from t_user; 
2. hdfs的shell 【了解】
   bin/hdfs dfs -get 'user/hive/warehouse/db_name.db/table' '/root/xxx'
3. hive启动的命令行参数 【了解】
   bin/hive --database 'baizhi129' -f /root/hive.sql > /root/result
4. sqoop方式 【重点】
5. Hive导入 导出命令【了解】
   1. export 导出
	  export table tb_name to 'hdfs_path'
   2. import 导入
	  import table tb_name from 'hdfs_path'
10. Hive中HQL (类SQL)
1. 基本查询
   select * from t_user; 不启动mr
   select id from t_user; 启动mr
2. where 
   select * from t_user where id = xxx;
3. 常见谓词 in  between and  
4. 逻辑运算  and or not
5. 分组函数  count()  avg() sum() max() min()
6. 分组 group by 
7. 排序 order by 
8. 分页 limit
   不支持 limit 2,3
9. 多表联合查询 
   select e.id,e.name,d.dname
   from t_emp e
   inner join t_dept d
   on e.dept_id = d.id;
10. 内置函数(窗口函数)
    select length(name) from t_user_like;
    select length('dingl')
    to_date
    year
    select substring('dingl',1,2)
 11. hive不支持子查询    
11. Hive中与MapReduce相关的参数设置
1. mapreduce中map个数?
   textInputFormat --- > block ----> split ----> map
   dbInputFormat   ----> 1 row ----> 1 split ----> 1 map
2. mapreduce中reduce个数?
   默认 1 个
   mapred-default.xml
   <property>
      <name>mapreduce.job.reduces</name>
      <value>1</value>
   </property>
   job中应用过程中reduce 0---n
   job.setReduceNumTasks()
 3.Hive中MapReduce相关参数的设置 
   hive-site.xml
    <property>
          <name>hive.exec.reducers.bytes.per.reducer</name>
          <value>1000000000</value>
    </property>
    <property>
         <name>hive.exec.reducers.max</name>
         <value>999</value>
    </property>
12. Hive中特殊参数设置
hive-site.xml
<property>
  <name>hive.fetch.task.conversion</name>
  <value>minimal</value>
  <description>
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only  不启动MR,非上述3种情况,会启动MR
    2. more    : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns) 所有select,where,limit 都不起MR
  </description>
</property>
13.Hive没有集群

在这里插入图片描述

14.实战中如何使用Hive?
总结:hive是一种离线处理的大数据技术,不需要实时产生处理结果,所以在hive中所做的相关操作,最终通过Sqoop导入RDB,通过Java程序直接访问RDB获得相应的结果。
15.Sqoop (CDH)
Hadoop 各种发行版本  
1.   apache开源版 :      免费   难用 
2.   Cloudera (CDH)    Doug Cutting首席架构师  $4000   1个
3.   Hortonworks                               $12000  10个
  1. 搭建CDH版Hadoop及其Hive

    1. 解压缩hadoop
    2. 创建临时目录的位置
       hadoop_home/data/tmp
    3. 修改配置文件 hadoop_home/etc/hadoop
       hadoop-env.sh
       yarn-env.sh
       mapred-env.sh
       
       core-site.xml
       <property>
            <name>fs.defaultFS</name>
            <value>hdfs://hive1:8020</value>
        </property>
    
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/install/hadoop-2.5.0-cdh5.3.6/data/tmp</value>
        </property>
       hdfs-site.xml
       <property>
      	 <name>dfs.replication</name>
      	 <value>1</value>
       </property>
       <property>
       	  <name>dfs.permissions.enabled</name>
      	  <value>false</value>
       </property>
       mapred-site.xml
       <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
       </property>
       yarn-site.xml
       <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
       </property>
       slaves 
         hive1
    4. 替换cdh lib/native本地库
    5. 格式化namenode
    6. 启动服务进程
    7. 安装hive并解压缩
    8. 修改配置文件
       hive-env.sh
       hive-site.xml
    9. 上传mysql驱动 hive_home/lib
    10. hdfs /tmp
             /user/hive/warehouse
    
  2. 安装Sqoop

    1. 解压缩Sqoop
    2. 修改配置 sqoop_home/conf
       修改conf/sqoop-env.sh
       export HADOOP_COMMON_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
       export HADOOP_MAPRED_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
       export HIVE_HOME=/opt/install/hive-0.13.1-cdh5.3.6
    3. mysql-connect.jar copy sqoop_home/lib
    4. 测试sqoop是否正常使用
       bin/sqoop list-databases -connect jdbc:mysql://hive1:3306 -username root -password 123456
    
    1. sqoop命令的书写规范

      1. 一行写 
         bin/sqoop list-databases -connect jdbc:mysql://hive1:3306 -username root -password 123456   
      2. 每一个关键字一行
         bin/sqoop list-databases \
         --connect \
         jdbc:mysql://hive1:3306 \
         --username root \
         --password 123456 
      
    2. mysql的准备工作

      #mysql 创建数据库 创建表
      create database sqoop
      
      create table mysql_user(
      id int primary key,
      name varchar(12)
      );
      insert into mysql_user values (1,'dingl1');
      insert into mysql_user values (2,'dingl2');
      insert into mysql_user values (3,'dingl3');
      insert into mysql_user values (4,'dingl4');
      insert into mysql_user values (5,'dingl5');
      
      insert into mysql_user values (6,'dingl6');
      insert into mysql_user values (7,'dingl7');
      insert into mysql_user values (8,'dingl8');
      
      
      
      
    3. Sqoop的Import(导入)

      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user
      
      # Sqoop 进行的数据导入和导出,本质上也是运行的MapReduce 
      # 如果不指定hdfs的导入路径,那么sqoop生成默认值 /user/root/${table_name}
      # mapReduce的目标是数据库,所以Map的数量,由数据库的行数决定
      # 导出文件的列分割符,是,
      
      # 指定sqoop导入位置
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --target-dir /sqoop
      
      # 删除已存在的目标目录
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --target-dir /sqoop \
      --delete-target-dir
      
      # 设置map的个数
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --target-dir /sqoop \
      --delete-target-dir \
      --num-mappers 1
      
      # 设置列分隔符
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --target-dir /sqoop \
      --delete-target-dir \
      --num-mappers 1 \
      --fields-terminated-by '\t'
      
      
      # 快速导入
        使用mysql 导出工具  dump 
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --target-dir /sqoop \
      --delete-target-dir \
      --num-mappers 1 \
      --fields-terminated-by '\t' \
      --direct
      
      #细节: sqoop 需要和 mysql 安装在同一个节点
             如果没有安装在同一个节点,需要把mysql/bin下的内容 复制到sqoop机器
      
      # 增量导入
      --check-column <column>        Source column to check for incremental    id
      --last-value <value>           Last imported value in the incremental    5
      --incremental <import-type>    Define an incremental import of type     append
                                     'append' or 'lastmodified'
                                     
      --delete-target-dir \ 不需要加
      
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --target-dir /sqoop \
      --num-mappers 1 \
      --fields-terminated-by '\t' \
      --direct \
      --check-column id \
      --last-value 5 \
      --incremental append
        
      
      # hive表的导入
      #--hive-import \
      #--hive-database baizhi125 \
      #--hive-table t_user \
      
      bin/sqoop import \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table mysql_user \
      --delete-target-dir \
      --hive-import \
      --hive-database baizhi129 \
      --hive-table t_user \
      --num-mappers 1 \
      --fields-terminated-by '\t'
      
  3. Sqoop的Export (HDFS/Hive ----> MySQL )

    bin/sqoop export \
    --connect \
    jdbc:mysql://hive1:3306/sqoop \
    --username root \
    --password 123456 \
    --table to_mysql \
    --export-dir /sqoop \
    --num-mappers 1 \
    --input-fields-terminated-by '\t'
    
  4. Sqoop脚本化编程

    1. sqoop文件

      create table filetomysql(
       id int,
       name varchar(12)
      );
      1. 创建一个Sqoop文件 普通文件 sqoop.file
      export
      --connect
      jdbc:mysql://hive1:3306/sqoop
      --username
      root
      --password
      123456
      --table
      filetomysql
      --export-dir
      /sqoop
      --num-mappers
      1
      --input-fields-terminated-by
      '\t'
      
      2. 执行文件
      bin/sqoop --options-file /root/sqoop.file 
      
    2. job作业

      1. 创建作业
      bin/sqoop job \
      --create test_job1 \
      -- \
      export \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password 123456 \
      --table filetomysql \
      --export-dir /sqoop \
      --num-mappers 1 \
      --input-fields-terminated-by '\t'
      
      2. 执行job作业
      bin/sqoop job --exec test_job1(job_id)
      
      3. 解决job作业执行过程中的密码输入问题
      echo -n "123456"  >> /root/password
      
      bin/sqoop job \
      --create test_job2 \
      -- \
      export \
      --connect \
      jdbc:mysql://hive1:3306/sqoop \
      --username root \
      --password-file file:///root/password \
      --table filetomysql \
      --export-dir /sqoop \
      --num-mappers 1 \
      --input-fields-terminated-by '\t'
      
      bin/sqoop job -exec test_job2
      
  5. 思考Sqoop实战,主要的应用方式

    1. 安装crontab (centos7 默认安装)
       yum -y install vixie-cron
       yum -y install crontabs
    2. 启动服务
       systemctl start crond.service
       systemctl stop crond.service
       systemctl restart crond.service
    
       /sbin/service crond start
       /sbin/service crond stop
    3. 编辑定时计划
       crontab -e 
       minute   hour   day   month   week   command 
       */5 * * * * command
       ··
       */1 * * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
       0 0 * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
    
       【https://www.cnblogs.com/tiandi/p/7147031.html】
       
    

mappers 1
–input-fields-terminated-by ‘\t’

  bin/sqoop job -exec test_job2
  ~~~
  1. 思考Sqoop实战,主要的应用方式

    1. 安装crontab (centos7 默认安装)
       yum -y install vixie-cron
       yum -y install crontabs
    2. 启动服务
       systemctl start crond.service
       systemctl stop crond.service
       systemctl restart crond.service
    
       /sbin/service crond start
       /sbin/service crond stop
    3. 编辑定时计划
       crontab -e 
       minute   hour   day   month   week   command 
       */5 * * * * command
       ··
       */1 * * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
       0 0 * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
    
       【https://www.cnblogs.com/tiandi/p/7147031.html】
       
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值