• hive入门


                                                                                                                                                                                   作者:2551529836
    Hive
        ** Facebook开源
        ** 官网:hive.apache.org
        ** Hive是基于Hadoop的一个数据仓库工具    

    Hive与数据库:
    数据库: mysql、oracle、DB2、sqlserver
    数据仓库 !== 数据库  换言之, Hive不是数据库

    为什么要选择hive
        ** MapReduce编程成本高
        ** 针对传统的DBA,不会不熟悉java,要想数据分析,借助Hive

    Hive简介:
        ** 流程
            ** hql --> Hive(java) --> mapreduce -->yarn --> hdfs
            ** 本质: 将HQL转化成MapReduce程序
        ** 使用MapReduce计算模型,运行在yarn平台之上
        ** Hive适合离线批量处理,延时比较大
        ** 不适合在线业务实时分析结果,业务要求延时较低的场景不适合

    Hive体系结构
        ** 用户接口: Client    
            ** 终端命令行CLI --主要的一种使用方式
            ** JDBC方式        --几乎不用
        ** 元数据:metastore
            ** 默认apache使用的是derby数据库(只能有一个客户端使用),CDH使用postgreDB
            ** 企业通常我们会选择另外一种mysql来存储
            ** 元数据包括:表名、表所属的数据库(默认是default)、
            表的拥有者、列/分区字段、表的类型(是否是外部表)、
            表的数据所在目录等
            ** 这里并没有存储Hive表的真实数据
        ** Hadoop
            ** 使用HDFS进行存储
            ** 使用MapReduce进行计算
        ** 驱动器: Driver
            ** 解析器: 解析Hql语句
            ** 编译器: 把sql语句翻译成MapReduce程序
            ** 优化器: 优化sql语句
            ** 执行器: 在yarn平台运行MapReduce程序

    ====Hive安装======================================================
            
        ** 版本 0.13.1(和后面使用到的框架兼容性好)
        1、安装JDK
           $ java -version
           
        2、安装Hadoop
            ** 确保Hadoop可以正常使用(测试:上传文件、或者运行jar)
            $ hdfs dfs -mkdir /input2          #在HDFS上创建文件夹,没有类似-cd进入目录的参数
            $ hdfs dfs -mkdir -p /aaa/bbb/ccc #级联创建目录
            $ hdfs dfs -ls /                  #查看
            $ hdfs dfs -put b.txt /input      #把本地文件拷到HDFS
            $ hdfs dfs -cat /input2/b.txt     #查看文件
            $ hdfs dfs -rm /input2/b.txt      #删除文件
            $ hdfs dfs -rmr /input?           #递归删除文件夹和里面的文件,推荐使用'-rm -r'格式;单字符通配符'?'
            $ hdfs dfs -help

        3、安装mysql
        $ su -
        # yum -y install mysql         --安装mysql客户端、常用命令
        # yum -y install mysql-server  --mysql服务
        # yum -y install mysql-devel   --mysql develop扩展包
        ***以上可以合并为一句,-y表示所有提问回答都为yes
        # yum -y install mysql mysql-server mysql-devel
        
        # rpm -qa|grep mysql                          --查看安装的mysql
        # rpm -ql mysql-server-5.1.73-7.el6.x86_64    --查看安装位置
        # rpm -e --nodeps mysql-server-5.1.73-7.el6.x86_64    --卸载,nodeps:不检查依赖
        
        # service mysqld start    --启动mysql服务
        # chkconfig mysqld on     --设置开机启动
        # /usr/bin/mysqladmin -uroot password 'root'    --初始化密码,只能执行一次
        给用户授权:
        # mysql -uroot -proot
        *** grant 权限 on 数据库对象(数据库.表) to 用户
        mysql> grant all on *.* to root@'blue01.mydomain' identified by 'root';
        mysql> flush privileges;  #刷新授权表,可以不执行
        mysql> set password for root@localhost = password('root');  --修改密码
        mysql> show databases;
        
        ** mysql数据库默认只允许root用户通过localhost(127.0.0.1)来登录使用
        ** 想要使用Windows上的Navicat登录,需要授权
        ** mysql> grant all on *.* to root@'192.168.122.1' identified by 'root';
            
        附:yum命令和rpm命令安装的都是rpm包
            yum安装包的来源: 来自互联网(由仓库配置文件指定)
            rpm安装包的来源: 先提取现在需要安装的软件包
            
    ----------------------
            
        4、安装Hive
        # su - tom
        $ tar zxf /opt/softwares/apache-hive-0.13.1-bin.tar.gz
        
        ** 在conf/目录:
        $ cp -a hive-env.sh.template  hive-env.sh         --重命名,-a连同原来属性一起复制
        $ cp -a hive-default.xml.template  hive-site.xml

        5、修改hive-env.sh
        JAVA_HOME=/opt/modules/jdk1.7.0_67
        HADOOP_HOME=/opt/modules/hadoop-2.5.0
        export HIVE_CONF_DIR=/opt/modules/apache-hive-0.13.1-bin/conf

        6、配置hive-site.xml,注意:用户名和密码不可以有空格
            <property>
              <name>javax.jdo.option.ConnectionURL</name>
              <value>jdbc:mysql://blue01.mydomain:3306/metastore?createDatabaseIfNotExist=true</value>
            </property>
            <property>
              <name>javax.jdo.option.ConnectionDriverName</name>
              <value>com.mysql.jdbc.Driver</value>
            </property>
            <property>
              <name>javax.jdo.option.ConnectionUserName</name>
              <value>root</value>
            </property>
            <property>
              <name>javax.jdo.option.ConnectionPassword</name>
              <value>root</value>
            </property>

        7、拷贝mysql驱动到lib/
        ** 若是jar已解压,则不必执行这步:$ tar zxf mysql-connector-java-5.1.27.tar.gz
        $ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/apache-hive-0.13.1-bin/lib/

        8、进入Hadoop目录,修改目录权限
        ** /tmp存放临时文件
        $ bin/hadoop fs -chmod g+w /tmp   #给用户组加上写的权限
        
        ** /user/hive/warehouse为Hive存放数据的目录
        $ bin/hdfs dfs -mkdir -p /user/hive/warehouse
        $ bin/hadoop fs -chmod g+w /user/hive/warehouse
        
        9、启动客户端使用Hive
        $ bin/hive    --用法几乎跟mysql一样
        hive> show databases;

    ====基本操作==========================================

    基本操作语句:
    hive> show databases;
    hive> create database mydb;
    hive> use mydb;

    hive> show tables;
    --创建表
    create table customer(
      id int,
      username string
    )row format delimited fields terminated by ' ';
    hive> desc customer;
    hive> desc formatted customer;    --详细信息

    --向表插入数据
    [tom@blue01 ~]$ vi b.txt
    1001    aaa
    1002    bbb
    hive> load data local inpath '/home/tom/b.txt' into table customer;
    --查看数据
    hive> select * from customer;

    Hive与Hadoop的关系、mysql的关系:
        ** Hive数据存储在HDFS的/user/hive/warehouse目录
            ** 由hive-site.xml里hive.metastore.warehouse.dir属性指定
        ** 创建数据库(create database)
            ** 默认会到仓库目录下面去创建一个同名的目录,
            ** 这个目录用来保存该数据库所有的表数据
        ** 创建表
            ** 在数据库目录下面生成一个同名的目录,用来保存该表的所有数据
        ** 载入数据
            ** load data(0.14版本之前没有insert)
            ** 文件上传到:/user/hive/warehouse/mydb.db/customer/b.txt
        总结: Hive数据就是把文件存在HDFS上,然后做了表和文件之间的映射    
               Hive的数据并没有存入mysql,mysql只是存放元数据

    ----日志----------------------

    定义Hive的日志信息
        ** 重命名配置文件
        $ cp hive-log4j.properties.template hive-log4j.properties
        $ mkdir logs  --用来存放日志
        ** 修改hive-log4j.properties,指定日志文件生成的位置
        hive.log.dir=/opt/modules/apache-hive-0.13.1-bin/logs
        重启Hive
        
        # 动态监视日志文件,hive里执行任何操作,日志都会有显示
        # 此时可以打开一个hive窗口,随意执行些操作,观察效果
        $ tail -f hive.log
        
    -------------------------------

    ** 修改hive-site.xml(重启)
    # 显示列名
    <property>
      <name>hive.cli.print.header</name>
      <value>true</value>
    </property>

    # 显示数据库名
    <property>
      <name>hive.cli.print.current.db</name>
      <value>true</value>
    </property>    

    ====杂项操作============================================        
                
    Hive里面两个重要的参数:
        # -e  一次性执行hive语句
        $ bin/hive -e "select * from mydb.customer"
        $ bin/hive -e "select * from mydb.customer" > a.txt  --结果导入到文件
        
        # 在Hive里执行简单的Linux命令(并非所有的命令都可以在Hive里执行)
        > !pwd;
        > !ls;

        # -f  执行hql脚本文件
        $ vi a.hql  --创建hql脚本
        select * from mydb.customer;    
        $ hive -f a.hql       --linux命令行
        hive> source a.hql;   --hive命令行
        
        # dfs命令
        hive> dfs -ls /;
        hive> dfs -mkdir /aaa;
        hive> dfs -rmr /aaa;
            
    Hive中set命令:
        hive > set;                                 --显示hive属性
        hive > set -v;                              --更多的属性,包括hadoop、mapreduce、yarn属性
        hive > set hive.cli.print.current.db;       --显示单个属性
        hive > set hive.cli.print.current.db=true;  --设置,set命令设置的值是临时生效
        
        # 假如记不清某个属性,可以使用如下技巧来查找
        $ hive -e "set"|grep print;
        $ hive -e "set -v"|grep print;
        
    Hive中历史命令的存放位置    
        ~/.hivehistory    --'~'是指/home/tom目录
        $ cat .hivehistory
                
    Hive调试参数
        ** 将日志输出级别降低为DEBUG,通常在调试错误时,会加这个参数
        ** 日志级别为5级:DEBUG、INFO、WARN、ERROR、FATAL
        $ hive --hiveconf hive.root.logger=DEBUG,console        

    hive > select * from mydb.customer;            --不走MapReduce,速度快    
    hive > select username from mydb.customer;    --走MapReduce,慢            
                
    hive的其他语句:            
    hive > show functions;    --函数,如:count、sum...    
    hive > truncate 表名;                

    ====Hive表常用操作==========================================

    ***Hive官网:wiki--User Documentation(DDL)

    Hive创建数据库
        hive (mydb)> create database 数据库名称 ;            
        hive (mydb)> drop database 数据库名称 ;            

    Hive创建表        
    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
        [(col_name data_type  ...)]    
        [PARTITIONED BY (col_name data_type , ...)]        
        [ROW FORMAT row_format]         
        [LOCATION hdfs_path]        
        [AS select_statement];
        
    create table aaa(
    a int,
    b string
    )row format delimited fields terminated by ' ';

    Hive中常见数据类型:
        tinyint  smallint  int  bigint
        float double
        boolean
        string
        ......
        
    加载数据
    load data local inpath '文件路径' [overwrite] into table 数据库名.表名 ;
        ** local 表示加载本地文件,若inpath后面跟随一个目录,那么会将该目录下的所有文件copy过去
        ** 去掉local表示hdfs,注意:此时使用load data,进行的将是move操作
        ** 文件加载模式
            **  append    追加,默认的,可以省略,
            **  overwrite 覆盖
        ** load data加载只是把文件从本地简单地复制到hdfs上,我们可以通过hdfs增加、删除对应表格目录里面的文件,
           这样做,会影响到表格里的数,可见hive和hdfs是松散关系
        ** 加载数据时,hive不会去判断字段分隔符是否正确,只有在查询数据时,才会发现是否有错
    hive> load data local inpath '/home/tom/b.txt' into table aaa;
    ***若是再次执行load data,新的文件中的数据将会追加到hive表的末尾
        
    --创建表
    create table dept(
    deptno int,    --部门编号
    dname string,  --部门名称
    loc string     --地点
    )row format delimited fields terminated by ' ';

    create table emp(
    empno int,       --雇员号
    ename string,
    job string,      --职位
    mgr int,         --上司
    hiredate string,
    sal double,      --薪水
    comm double,     --奖金(注意:有人没有奖金)
    deptno int
    )row format delimited fields terminated by ' ';

    --导入数据
    hive > load data local inpath 'dept.txt' into table dept;
    hive > load data local inpath 'emp.txt' into table emp;    

    Hive创建表注意事项
        ** 一般都是先有数据文件,再去用Hive把它映射成一张对应的表
        ** 创建表时,字段要根据原文件内容而定
        ** 指定表的列分隔符时,必须要和原文件字段分隔符一致,否则Hive识别不到数据

    终止job任务:
    ***执行 select deptno,dname from dept; 语句时,将会运行mapreduce任务,可以在8088端口查看
    ***若是任务运行过程中卡住了,可以执行"hadoop job -kill 任务名"来终止任务,如:
    ***hadoop job -kill job_1479691925666_0003
    ***执行语句时,日志中有提示:Kill Command = /opt/modules/hadoop-2.5.0/bin/hadoop job  -kill job_1479691925666_0003

    ====管理表、外部表=================================

    Hive中表类型:
        ** 管理表(内部表)
            ** MANAGED_TABLE   --可以通过desc formatted emp查看
            ** 删除表,会连同HDFS上面的数据文件一起删除
        ** 外部表
            ** EXTERNAL_TABLE
            ** 删除表,不会连同HDFS上面的数据文件一起删除
            ** 通常有多个业务接入同一个文件(同一个数据源)时,会创建外部表
                业务1     业务2        业务3
                table1      table2    table3
                    同一个文件(HDFS)
            ** 外部表在创建的时候,数据源一般就已经存在了

    --创建管理表
    create table emp_inner(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
    )row format delimited fields terminated by ' ';

    --创建外部表
    create external table emp_ext(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
    )row format delimited fields terminated by ' ';

    load data local inpath 'emp.txt' into table emp_inner;    
    load data local inpath 'emp.txt' into table emp_ext;    

    ***基于相同数据,创建其他外部表
    create external table emp_ext1(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
    )
    row format delimited fields terminated by ' '
    --关联对应目录
    location "/user/hive/warehouse/mydb.db/emp_ext";

    hive > select * from emp_ext1;

    **同理可创建emp_ext2
    create external table emp_ext2(
    empno int,
    ename string,
    job string,
    mgr int,
    hiredate string,
    sal double,
    comm double,
    deptno int
    )
    row format delimited fields terminated by ' '
    location "/apps/app1" ;

    hive > select * from emp_ext2 ;  

    测试:
    **删除表emp_ext2,观察数据文件是否被删除,emp_ext1表的数据是否可以查询
    hive > drop table emp_ext2;
    hive > select * from emp_ext1;

    ** 外部表
       a) 共享数据
       b) 删除表时不删除对应数据
                
    附:
    ** Hive0.14版本前,没有insert、update、delete,没有事务    




  • 相关阅读:
    索引的设计与使用
    字符集
    选择合适的数据类型
    java 23种设计模式 深入理解(转)
    进程间的通信方式
    SPRING的事务传播
    面向对象的五大基本原则
    J2EE中常用的名词解释
    JVM内存配置参数:
    域对象
  • 原文地址:https://www.cnblogs.com/yhl-yh/p/6719751.html
Copyright © 2020-2023  润新知