03.01 「喵咪大数据」Hive2搭建和基本操作

「喵咪大数据」Hive2搭建和基本操作

说的Hadoop生态有一个不得不提的组件那就是 ,Hive是基于Hadoop结构化存储引擎,能够存储海量的数据,Hive提供了类SQL的方式对数据进行查询检索汇总,大大减少了早期需要使用MapReduce编程的烦扰,今天就和笔者一起来探索Hive的实际应用场景吧.

附上:HIVE官网地址:https://hive.apache.org/喵了个咪的博客:w-blog.cn

1.环境配置

hadoop集群环境需要提前配置好,可以在master上进行搭建也可以单独一台机器进行搭建这里使用一台独立的centos7.X 64位服务器进行Hive服务搭建并且连接到之前的Hadoop集群

通过oneinstack配置环境

<code>> mkdir -p /app/install && cd /app/install> wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz> tar -zxvf oneinstack-full.tar.gz # 安装选择mysql5.7 密码为 hive666> cd oneinstack && ./install.sh/<code>

关闭防火墙(端口通讯会被拦截)

<code>> systemctl stop firewalld.service    # 关闭firewall> systemctl disable firewalld.service # 禁止firewall开机启动/<code>

分别修改服务器的主机名

<code># 最后主机名会全小写状态显示> hostnamectl set-hostname hive/<code>

修改服务器的host 和hadoop节点建立关联

<code>> vim /etc/hosts192.168.1.101 hadoop-1192.168.1.102 hadoop-2192.168.1.103 hadoop-3/<code> 

使用 Hive 需要Java 和 hadoop 环境 我们从之前的 hadoop-1 把相对应的包复制过来

<code>> scp -r /usr/local/jdk1.8 [email protected]:/usr/local/jdk1.8> scp -r /usr/local/hadoop-2.7.3 [email protected]:/usr/local/hadoop-2.7.3/<code>

增加java和hadoop的环境变量

<code># javaexport JAVA_HOME=/usr/local/jdk1.8export JRE_HOME=/usr/local/jdk1.8/jreexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$PATH# hadoopexport HADOOP_HOME=/usr/local/hadoop-2.7.3export HADOOP_INSTALL=$HADOOP_HOMEexport HADOOP_MAPRED_HOME=$HADOOP_HOMEexport HADOOP_COMMON_HOME=$HADOOP_HOMEexport HADOOP_HDFS_HOME=$HADOOP_HOMEexport YARN_HOME=$HADOOP_HOMEexport HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/nativeexport PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH/<code>

准备hive软件包 之后需要Hive和Hbase进行结构上的管理和与Spark关联进行查询上的效率提高这里选用Hive2.3.0版本

<code>apache-hive-2.3.0-bin.tar.gz/<code>

创建hadoop用户

<code>> useradd -m hadoop -s /bin/bash> passwd hadoop/<code>


2.安装配置


安装HIVE

解压安装Hive

<code>> cd /app/install> tar -zxvf apache-hive-2.3.0-bin.tar.gz> mv apache-hive-2.3.0-bin /usr/local/hive-2.3.0/<code>

设置 Hive环境变量

<code>> vim /etc/profile# hiveexport HIVE_HOME=/usr/local/hive-2.3.0export PATH=$PATH:$HIVE_HOME/bin# 让配置生效> source /etc/profile/<code>


配置Hive2.X

配置文件重命名在运行 Hive 之前需要使用以下命令修改配置文件:

<code>> cd /usr/local/hive-2.3.0/conf> cp hive-env.sh.template hive-env.sh> cp hive-default.xml.template hive-site.xml> cp hive-log4j2.properties.template hive-log4j2.properties> cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties/<code>

修改hive-env.sh因为 Hive 使用了 Hadoop, 需要在 hive-env.sh 文件中指定 Hadoop 安装路径:

<code>> vim hive-env.shexport JAVA_HOME=/usr/local/jdk1.8   ##Java路径export HADOOP_HOME=/usr/local/hadoop-2.7.3   ##Hadoop安装路径export HIVE_HOME=/usr/local/hive-2.3.0    ##Hive安装路径export HIVE_CONF_DIR=/usr/local/hive-2.3.0/conf    ##Hive配置文件路径/<code>

在hive机器切换到hadoop用户创建hive数据存放目录

<code>> su hadoop# 创建HDFS目录> hdfs dfs -mkdir -p /hive> hdfs dfs -chmod 777  /hive> hdfs dfs -mkdir -p /hive/warehouse> hdfs dfs -mkdir -p /hive/tmp> hdfs dfs -mkdir -p /hive/log> hdfs dfs -chmod 777 /hive/warehouse> hdfs dfs -chmod 777 /hive/tmp> hdfs dfs -chmod 777 /hive/log/<code>


一些复杂的查询或操作会使用的MR程序,应为执行MR程序需要tmp目录中的yarn权限所有如果不是以hadoop用户权限执行不然会有如下异常

<code>org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=EXECUTE, inode="/tmp/hadoop-yarn/staging/hive/.staging":hadoop:supergroup:drwx------# 解决方式> hdfs dfs -chmod -R 777 /tmp/<code>


将 hive-site.xml 文件中以下几个配置项的值设置成上一步中创建的几个路径。

<code>> vim /usr/local/hive-2.3.0/conf/hive-site.xml<property>    <name>hive.exec.scratchdir/<name>    <value>/hive/tmp/<value>    <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}./<username>/<description>  /<property>  <property>    <name>hive.metastore.warehouse.dir/<name>    <value>/hive/warehouse/<value>    <description>location of default database for the warehouse/<description>  /<property><property>    <name>hive.querylog.location/<name>    <value>/hive/log/<value>    <description>Location of Hive run time structured log file/<description>  /<property>/<code>


Hive Metastore

默认情况下, Hive 的元数据保存在内嵌的 Derby 数据库里, 但一般情况下生产环境会使用 MySQL 来存放 Hive 元数据。创建数据库和用户假定你已经安装好 MySQL。下面创建一个 hive 数据库用来存储 Hive 元数据,且数据库访问的用户名和密码都为 hive。

<code>mysql -u root -pmysql> CREATE DATABASE hive;mysql> USE hive;mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';mysql> GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive';mysql> GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';mysql> FLUSH PRIVILEGES;mysql> quit;/<code>

修改hive-site.xml需要在 hive-site.xml 文件中配置 MySQL 数据库连接信息。

<code>> vim /usr/local/hive-2.3.0/conf/hive-site.xml<property>    <name>javax.jdo.option.ConnectionURL/<name>    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&characterEncoding=UTF-8&useSSL=false/<value>  /<property>  <property>    <name>javax.jdo.option.ConnectionDriverName/<name>    <value>com.mysql.jdbc.Driver/<value>  /<property>  <property>    <name>javax.jdo.option.ConnectionUserName/<name>    <value>hive/<value>  /<property>  <property>    <name>javax.jdo.option.ConnectionPassword/<name>    <value>hive/<value>  /<property>/<code>


初始化Hive

在命令行运行 hive 命令时必须保证以下两点:HDFS 已经启动。MySQL Java 连接器添加到 $HIVE_HOME/lib 目录下。我安装时使用的是 mysql-connector-java-5.1.42.jar。

<code>> cd /usr/local/hive-2.3.0/lib> wget http://download.softagency.net/mysql/Downloads/Connector-J/mysql-connector-java-5.1.42.zip> unzip mysql-connector-java-5.1.42.zip> cp mysql-connector-java-5.1.42/mysql-connector-java-5.1.42-bin.jar /usr/local/hive-2.3.0/lib/> rm -rf mysql-connector-java-5.1.42.zip/<code>

从 Hive 2.1 版本开始, 我们需要先运行 schematool 命令来执行初始化操作。

<code>schematool -dbType mysql -initSchema/<code>

最后会输出

<code>schemaTool completed/<code>

我们可以通过数据库查看终端查看hive库中已经存在部分内容要使用 Hive CLI(Hive command line interface), 可以在终端输入以下命令:

<code>hive> show tables;OKTime taken: 0.839 seconds/<code>

如果报出异常

<code>Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D/<code>

需要将 hive-site.xml 中的 ${system:java.io.tmpdir} 和 ${system:user.name} 分别替换成 /tmp 和 ${user.name}


3.基本操作


创建库

CREATE DATABASE语句

<code>// 创建库如果存在则不创建CREATE DATABASE IF NOT EXISTS userdb;m// 创建数据库如果存在则会报错CREATE SCHEMA userdb;/<code>

下面的查询用于验证数据库列表:

<code>hive> SHOW DATABASES;defaultuserdb/<code>


删除数据库


<code>// 删除库如果存在则不删除DROP DATABASE IF EXISTS userdb;// 删除数据库必须要删除完其中的表草能删除DROP DATABASE IF EXISTS userdb CASCADE;// 删除数据库DROP SCHEMA userdb;/<code>


选择数据库


<code>USE userdb;/<code>


Hive创建表

最简单的方式创建表

<code>CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String);/<code>

通过COMMENT可以增加一个备注可以给整表或字段

<code>CREATE TABLE IF NOT EXISTS employee ( eid int COMMENT 'eid details', name String, salary String, destination String)COMMENT 'Employee details';/<code>


<code>CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)COMMENT 'Employee details'ROW FORMAT DELIMITEDFIELDS TERMINATED BY ' 'STORED AS TEXTFILE;/<code>

通过TERMINATED可以指定了字段的分隔符为t分列是n,所以load数据的时候,load的文本也要为t分隔n分行,否则加载后为NULL。hive只支持单个字符的分隔符,hive默认的分隔符是001

存储类型Hive具有三类自带存储类型TEXTFILE和SEQUENCEFILE,RCFILE可以通过STORED指定

  • TEXTFIEL:默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
  • SEQUENCEFILE:SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
  • RCFILE:RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。RCFILE文件示例:
    相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势

下面的查询用于查看当前库表列表:

<code>hive> SHOW TABLES;OKemployee/<code>


查看表信息


<code>desc formatted employee;desc employee;/<code>


删除表


<code>DROP TABLE IF EXISTS employee;/<code>


Alter Table 语句

修改表名称

<code>ALTER TABLE employee RENAME TO emp;/<code>


Change 语句

修改字段名称和字段类型

<code># 修改name为ename 类型不变还是StringALTER TABLE employee CHANGE name ename String;# 修改salary名称不变 类型修改为DoubleALTER TABLE employee CHANGE salary salary Double;/<code>

增加了一个列名dept在employee表中

<code>ALTER TABLE employee ADD COLUMNS ( dept STRING COMMENT 'Department name');/<code>


插入数据

重新创建employee表,在本地文件系统准备文本sample.txt

<code>vim /home/hive/sample.txt1201 Gopal 45000 Technicalmanager1202 Manisha 45000 Proofreader1203 Masthanvali 40000 Technicalwriter1204 Kiran 40000 HrAdmin1205 Kranthi 30000 OpAdmin/<code>

加载给定文本插入表中(LOAD DATA只是把文件复制到指定的目录下,多次操作只会保留最后一次)

<code>LOAD DATA LOCAL INPATH '/home/hive/sample.txt'OVERWRITE INTO TABLE employee;/<code>

插入单条数据(消耗时间很长,可以结合Hbase来达到实时增加数据)

<code>INSERT INTO TABLE employee values(12,"1","1","1");/<code>

查询是否插入成功

<code>select * from employee;OK12      1       1       11201    Gopal   45000   Technicalmanager1202    Manisha 45000   Proofreader1203    Masthanvali     40000   Technicalwriter1204    Kiran   40000   HrAdmin1205    Kranthi 30000   OpAdminTime taken: 0.063 seconds, Fetched: 5 row(s)/<code>


Select

相关查询操作可以参考http://www.yiibai.com/hive/hive_built_in_operators.htmlhttp://www.yiibai.com/hive/hive_built_in_functions.htmlhttp://www.yiibai.com/hive/hive_views_and_indexes.htmlhttp://www.yiibai.com/hive/hiveql_select_where.htmlhttp://www.yiibai.com/hive/hiveql_select_order_by.htmlhttp://www.yiibai.com/hive/hiveql_group_by.htmlhttp://www.yiibai.com/hive/hiveql_joins.html

4 总结

Hive可以以结构化的方式来存储数据还可以使用SQL的方式来检索出你所需要的数据集给开发人员带来了不少方便,但是Hive也存在问题,单条记录增加繁琐,速度相对比较慢,但是在Hadoop生态中还有一个大家经常使用到的组件那就是Hbase,下节我们就一同来学习Hbase的使用.

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!


分享到:


相關文章: