Hive入门

Hive入门

复习Hadoop:

1、Hadoop是什么
存储      HDFS
计算      MapReduce
资源调度    YARN
2、HDFS的访问方式
Shell CLI :Hadoop/hdfs fs ……
Java API :FileSystem
Web UI:HUE/Hadoop自带UI
3、Hadoop的常用操作
HDFS:mkdir put get rm mv
问题:copy vs mv

MR:mr的执行流程(一定要掌握的)
YARN:mr作业跑在yarn之上,杀死yarn上的作业,提交的时候指定的一些重要的参数。
问题:使用MapReduce实现join、mapjoin的功能?
    ===>非常繁琐
        wordcount
明白:MR是非常麻烦的
Hive的产生背景:
1、MR编程不便性
2、传统的RDBMS人员的需求
    HDFS上面的文件就是普通的文件,它并没有schema的概念
    schema:RDBMS中的表结构
        people.txt <== id name age address
    sql  ===>  搞定海量数据的统计分析
===>  产生Hive
Hive
分布式系统:HDFS/S3
    问题:HDFS存的是近期的数据
        1min:几百G
        冷数据:定期的移走S3 table的location指向S3
FaceBook开源
目的是解决海量结构化日志数据的统计文件
构建在Hadoop之上的数据仓库
    数据存储子HDFS之上
    计算时使用MR
    弹性:线性扩展
Hive底层的执行引擎:MapReduce、Tez、Spark
Hive定义一种类似SQL的查询语言:HQL
    问题:HQL和SQL的关系?
        什么关系都没有,只是语法类似
    很多的SQL on Hadoop的语法都是和RDBMS非常类似的
Hive常用于:离线批处理
SQL ===> MR:把SQL语句翻译成MapReduce作业,并提交到YARN上运行
    问题:是否智能、执行计划(sql是如何翻译成mr作业)
高级:UDF
版本
Stinger Plan:
    Phase 1 0.11  ORC HiveServer2
    Phase 2 0.22  ORC improvement
    Phase 3 0.13  Vectorized query engine & Tex
Stinger.next Phase 1  0.14  CBO 
为什么要使用Hive
    1)、简单易用
    2)、弹性
    3)、统一的元数据管理
            元数据存放在哪里呢?
                metadata mysql
            统一:SQL on Hadoop都是能够共享的
                Hive/Pig/Impala/Spark SQL/Presto
问题:Hive的数据存放在哪里?
    HDFS + metadata
Hive体系架构
测试环境部署架构:
    客户端(client、web、idbc)发送HQL语句到Hive(可以存放数据在MySQL或者Derby)上,最后作业提交到Hadoop集群上。
问题:Hive需要集群吗?
        Hive不需要集群,可以理解Hive为一个客户端。
问题:存在什么缺陷?
        一个MySQL在生产中可能存在单点故障,所以需要准备两个MySQL,一个是active一个是standby,一台机器出现问题,另外一台机器运行。                
Hive部署架构
Hive VS RDBMS
Hive的缺点:
    慢、非实时、延时性比较高
Hive环境的搭建
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz

tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app
1)添加HIVE_HOME到系统环境变量:
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH
2)Hive配置修改
hive-env.sh
    HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
hive-site.xml   统一元数据管理
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

    <configuration>
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://localhost:3306/ruozedata_basic02(数据库名)?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>
    </configuration>
3)拷贝MySQL驱动包到$HIVE_HOME/lib
如果没有拷贝MySQL驱动包,启动hive会报错:
    The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH. 
    Please check your CLASSPATH specification, 
    and the name of the driver.
4)权限问题
创建表失败:
    FAILED: Execution Error, 
    return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. 
    MetaException(message:For direct MetaStore DB 
    connections, we don't support retries at the client 
    level.)
    思路:找日志
    日志在哪里:$HIVE_HOME/conf/hive-log4j.properties.template
                hive.log.dir=${java.io.tmpdir}/${user.name}
                hive.log.file=hive.log
                问题:能不能改,如何改?
    日志错误:
        ERROR [main]: Datastore.Schema (Log4JLogger.java:error(115)) - An exception was thrown while adding/validating class(es) : 
        Specified key was too long; max key length is 767 bytes
        com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes 
    解决:
        alter database ruozedata_basic02 character set latin1;

【来自@若泽大数据】

    原文作者:苏木logwood
    原文地址: https://www.jianshu.com/p/d9b17e12bc0f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞