Hive介绍与安装

参考http://www.hainiubl.com/topics/103

Hive介绍

Hive是一个机遇Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据。提供了类似于SQL语法的HQL语句作为数据访问接口。

Hive优缺点

优点

  • Hive使用类SQL查询语法,最大限度的实现了和SQL标准的兼容
  • 使用JDBC接口/ODBC接口,开发人员更易开发应用
  • MapReduce作为计算引擎、HDFS作为存储系统,为超大数据集提供计算和扩展能力。
  • 有统一的元数据管理(Derby、MySql等),可以与Pig和Spark共享

缺点

  • HQL表达能力有限,不支持UPDATE、非等值连接、DELETE、INSERT单条等
  • Hive自动生成MapReduce作业,HQL调优困难
  • 粒度较粗,可控性差

Hive与传统数据库的区别

  • 存储文件的系统不同:Hive使用的是HDFS,传统数据库使用的是服务器本地的文件系统
  • Hive使用mapreduce做运算,比传统数据库相比运算规模要大很多
  • 关系数据库是为了实时查询的业务进行设计的,Hive是为了海量数据做数据挖掘设计的,实时性很差。实时性的区别导师Hive的应用场景和关系数据库有非常大的不同
  • Hive很容易扩展自己的存储能力和计算能力,而关系型数据库在这方面比数据库差很多

Hive组成

Hive由服务端组件和客户端组件构成。
服务端组件包括:

  • Driver组件:包括Compiler、Optimizer和Executor。作用是将HQL语句进行解析,编译优化,生成执行计划。然后调用底层的mapreduce计算框架。
  • Metastore组件:元数据服务组件,这个组件存储Hive的元数据。Hive元数据存储在关系型数据库中,Hive支持Derby和MySql。Hive支持把Metastore服务独立出来,安装到远程的服务器集群中,从而解耦Hive服务和Metastore服务,保证Hive运行的健壮性。
  • Thrift服务:Thrift是Facebook开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive集成这项服务可以用不同的编程语言调用Hive接口

客户端组件:

  • CLI:Command Line Interface命令行接口
  • JDBC/ODBC:Hive架构的JDBC和ODBC接口是建立在Thrift客户端之上的。
  • WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI(Hive Web Interface),使用前要启动HWI服务。

HiveStruct

Hive安装

环境MacOS

安装MySql

这一步我的系统之前已经安装过了MySql。

解压配置环境变量

  • 将bin压缩包解压至/usr/local/路径
  • 配置环境变量/etc/profile
    export HIVE_HOME=/usr/local/hive
    export HIVE_CONF_DIR=/usr/local/hive/conf

本地环境安装hive

  • mysql建立新的用户(注意我使用的是mysql8.0,在grant all privileges语句中可能有版本差异)
    1
    2
    3
    4
    5
    6
    #命令行进入mysql
    mysql -u root -p
    #数据库用户配置
    create user 'hive'@'localhost' identified by '000000';
    grant all privileges on *.* to 'hive'@'localhost' with grant option;
    flush privileges;
  • 下载Mysql-connector-Java 8.0 并解压放到hive/lib目录
  • 配置hive-site.xml
    注意以下的配置需要自行搜索寻找,不在同一个地方
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <!-- 数据库地址 -->
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive</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>hive</value>
    <description>Username to use against metastore database</description>
    </property>
    <!-- 数据库密码 -->
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>000000</value>
    <description>password to use against metastore database</description>
    </property>
    <!-- 下面--四个---的配置都是临时存储目录,自己新建然后填上绝对路径-->
    <!-- 我设置的是/Users/shaoguoliang/hiveIOtmp-->
    <property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/Hadoop/hive/iotmp</value>
    <description>Local scratch space for Hive jobs</description>
    </property>
    <property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/Hadoop/hive/iotmp</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
    </property>
    <property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/usr/Hadoop/hive/iotmp</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
    </property>
    <property>
    <name>hive.querylog.location</name>
    <value>/usr/Hadoop/hive/iotmp</value>
    <description>Location of Hive run time structured log file</description>
    </property>
  • 配置hive-env.sh,从template复制文件到本地目录
    1
    2
    # 在末尾添加,其实不添加也可以
    export HIVE_CONF_DIR=/usr/local/hive/conf
  • 配置hive-log4j.properties,从template复制文件到本地目录
  • 在/hive/bin目录下,新建元数据schema
    ./schematool -initSchema -dbType mysql
    这里出现了问题是:
  1. 报错出现找不到mysql Driver,发现是解压之后要把jar包包含在/hive/lib路径下
  2. 报错出现找不到hive database,通过mysql创建create database hive
  • 启动hadoop,启动mysql
    注意这里一定要确认hadoop是否成功启动,是否成功启动namenode和datanode(单机模式)
    如果发现namenode挂了,去查看Hadoop HDFS 初始与操作
    在hdfs-site.xml中添加
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <property>
    <name>dfs.name.dir</name>
    <value>/usr/local/hadoop/hdfs/name</value>
    <description>namenode上存储hdfs名字空间元数据 </description>
    </property>

    <property>
    <name>dfs.data.dir</name>
    <value>/usr/local/hadoop/hdfs/data</value>
    <description>datanode上数据块的物理存储位置</description>
    </property>
  • 在hive/bin下运行hive
    启动hive