Hive基础

作者: 零度沸腾_yjz | 来源:发表于2017-06-14 11:40 被阅读0次

    Hive是什么

    • 我们知道传统数据存储都是存储在关系型数据库中,它们使用一种SQL(结构化查询语言)方言来查询数据库中的数据。由于大数据的爆发,Hadoop的广泛使用,当这些数据迁移到Hadoop之后,用户或者管理员如何对存储在Hadoop上的数据进行查询?Hive出现的主要原因就是为了提供一种SQL查询的方言,来查询存储在Hadoop集群种的数据,这个被称为Hive查询语言(简称HiveQL或HQL)。
    • Hive本身并不是一个完整的数据库,这是由于Hadoop和HDFS本身设计所限制的,比如Hive不支持行级别的更新、插入、删除操作。同时由于Hive会将查询转换为MapReduce作业,而MapReduce本身启动需要消耗较长的时间(Hadoop是一个面向批处理的系统),所以Hive查询延时比较严重,并且Hive不支持事务。
    • Hive更适合数据仓库应用程序,来维护海量数据。使用Hive进行静态数据分析,不需要快速响应结果,并且数据本身不会频繁变化,而且可以对数据进行挖掘。
    • 由于Hive不支持OLTP(联机事务处理)所需的关键功能,所以如果想要对大规模数据使用OLTP功能的话,可以使用NoSQL数据库,比如HBase或Cassandra。

    注意:Hive和大多数SQL方言一样,并不符合ANSI SQL标准,不过HiveQL和Mysql的SQL方言比较接近。

    如何使用Hive

    在Hive的发行版中有多个模块可供访问Hive:CLI、HWI(Hive网页界面)、JDBC、ODBC、Thrift Server。

    hive结构

    所有的命令和查询都会进入到Driver模块,通过该模块对输入进行编译、对需求计算进行优化,然后按照指定步骤执行(通常启动多个MapReduce来执行)。
    需要注意的是,启动MR任务的时候,Hive不会生成Java的MapReduce程序,而是通过一个表示“job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块。

    Hive安装

    下载Hive安装包http://www.apache.org/dyn/closer.cgi/hive/ hive现在有1.x版本和2.x版本,其中1.x可支持Hadoop1和Hadoop2,而2.x版本指支持Hadoop2。因为hive基于Hadoop,所以需要确保Hadoop安装成功。hive只需要在一个节点安装即可。

    1. 解压包
      tar -zxvf apache-hive-2.1.1-bin.tar.gz

    2. 添加hive安装路径
      vim /etc/profile或者~/.bash_profile
      export HIVE_HOME=/opt/hadoop/apache-hive-2.1.1-bin
      export PATH=HIVE_HOME/bin:PATH

    3. 在HDFS创建指定目录,并给用户组写权限
      hadoop fs -mkdir /tmp
      hadoop fs -mkdir /user/hive
      hadoop fs -chmod g+w /tmp
      hadoop fs -chmod g+w /user/hive

    4. mysql创建hive metastore库
      在上面hive结构中,我们有一个MetaStore是用来存储hive的元数据信息,一般metastore信息存储到关系型数据库中的。如果不配置,hive会默认使用内嵌的Derby数据库,Derby数据库本身容量小,并且不支持多客户端使用,所以一般使用mysql来存储metastore信息。

    5. 文件配置
      配置hive-env.sh:
      添加HADOOP_HOME和HIVE_CONF_DIR配置。
      配置hive-site.xml,这个文件如果不存在,则自己创建。
      <pre>
      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>

      <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://xxx.xxx.xxx.xxx:3306/hive?createDatabaseIfNotExist=true</value>
      <description>JDBC connect string for a JDBC metastore</description>
      </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>123</value>
      <description>password to use against metastore database</description>
      </property>

      <property>
      <name>hive.metastore.warehouse.dir</name>
      <value>/user/hive/warehouse</value>
      <description>location of default database for the warehouse</description>
      </property>
      </configuration>
      </pre>

    6. 添加mysql连结器mysql-connector-java-5.1.42-bin.jar
      下载:https://dev.mysql.com/downloads/connector/j/
      解压缩后copy到$HIVE_HOME/lib/里面。

    7. hive信息初始化到mysql 中
      schematool -dbType mysql -initSchema
      <pre>
      which: no hbase in (/opt/hadoop/apache-hive-2.1.1-bin/bin:/opt/hadoop/hadoop-2.7.3/bin:/opt/hadoop/hadoop-2.7.3/sbin:/usr/java/jdk1.8.0_131/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
      SLF4J: Class path contains multiple SLF4J bindings.
      SLF4J: Found binding in [jar:file:/opt/hadoop/apache-hive-2.1.1-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
      SLF4J: Found binding in [jar:file:/opt/hadoop/hadoop-2.7.3/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]
      Metastore connection URL: jdbc:mysql://10.5.234.238:3306/hive?createDatabaseIfNotExist=true
      Metastore Connection Driver : com.mysql.jdbc.Driver
      Metastore connection User: root
      Starting metastore schema initialization to 2.1.0
      Initialization script hive-schema-2.1.0.mysql.sql
      Initialization script completed
      schemaTool completed
      </pre>
      这时候mysql中会自动创建一个hive库。

    8. 进入hive
      直接输入hive命令,测试一下
      <pre>
      hive> show tables;
      OK
      Time taken: 1.012 seconds
      </pre>

    hive命令行

    输入hive - -help
    <pre>
    Usage ./hive <parameters> --service serviceName <service parameters>
    Service List: beeline cleardanglingscratchdir cli hbaseimport hbaseschematool help hiveburninclient hiveserver2 hplsql hwi jar lineage llapdump llap llapstatus metastore metatool orcfiledump rcfilecat schemaTool version
    Parameters parsed:
    --auxpath : Auxillary jars
    --config : Hive configuration directory
    --service : Starts specific service/component. cli is default
    Parameters used:
    HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
    HIVE_OPT : Hive options
    For help on a particular service:
    ./hive --service serviceName --help
    Debug help: ./hive --debug —help
    </pre>

    通过hive --service serviceName来启动服务,Service List包含了所有的服务。
    --auxpath:来指定用冒号分隔的jar包,包含用户自定义的扩展等。
    --config:覆盖$HIVE_HOME/conf目录下的配置的
    --service:启动指定服务或组件,默认是cli
    如果要查看每个服务如何使用,可以通过./hive --service serviceName --help来查看。

    CLI命令行界面

    hive --service cli --help
    <pre>
    usage: hive
    -d,--define <key=value> Variable subsitution to apply to hive commands. e.g. -d A=B or --define A=B. 用来定义变量比如:hive -d a=12
    --database <databasename> Specify the database to use. 指定所使用的数据库,默认是default
    -e <quoted-query-string> SQL from command line. 不用进入hive,直接在命令行中输入sql,如 :hive -e "show databases"
    -f <filename> SQL from files. 指定一个sql文件执行,如果在CLI中,通过source然后指定文件路径,也可以执行指定文件的sql。
    -H,--help Print help information
    --hiveconf <property=value> Use value for given property. 配置hive相关的属性
    --hivevar <key=value> Variable subsitution to apply to hive commands. e.g. --hivevar A=B.用户定义变量,和-d一样
    -i <filename> Initialization SQL file. 允许用户指定一个文件,当CLI启动前会执行这个文件。这个文件以hiverc结尾,一般这个文件用来设置每次用户启动CLI的一些配置,比如刚才的:hiveconf hive.cli.print.current.db=true;
    -S,--silent Silent mode in interactive shell. 静默模式,不打印”ok”和“Time take”等信息。
    -v,--verbose Verbose mode (echo executed SQL to the
    console)
    </pre>

    在CLI中可以使用set命令显示和修改变量值,在CLI中也可以看到system和env的属性变量,但是env的变量是只读不能更改的。
    <pre>
    set env:HOME;
    env:HOME=/home/hadoop
    set;//打印env所有变量
    set a;//显示a的值
    set a=13;//修改变量的值
    </pre>

    在HiveQL中可以直接使用变量,比如:
    <pre>
    hive -d a = age;
    hive>create table user(${hivevar:a} int);
    </pre>

    hivevar:a中hivevar是可以省略的,hivevar和define使用是一样的。
    --hiveconf用来定义hive的配置,比如:
    hive --hiveconf hive.cli.print.current.db=true
    开启这个属性,在CLI提示符前会打印当前使用的数据库:
    hive (default)>

    历史命令

    hive会将最近100条执行命令放到$HOME/.hivehistory中

    在CLI中执行shell

    在CLI中可以不退出就能执行shell命令,只需要在命令前加!,并且以分号(;)结尾即可。比如
    hive> ! ls;
    在CLI中执行shell不支持需要用户输入的交互式命令、不支持管道功能、不支持文件名自动补齐功能(不支持通配符)。

    在CLI中使用Hadoop的dfs命令

    在CLI中可以操作HDFS,只需要直接输入dfs即可,比如:
    hive>dfs -help;
    hive脚本
    hive脚本是以.hql结尾的,在脚本中使用--进行注释
    查询显示字段名称
    可以通过设置hive.cli.print.header=true;来打印每次查询显示表头信息。

    相关文章

      网友评论

        本文标题:Hive基础

        本文链接:https://www.haomeiwen.com/subject/ezssqxtx.html