Hive入门
初识hive
- 由FackBook开源用于解决海量结构化日志的数据统计;
- Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张表,并提供类SQL查询功能
- 构建在Hadoop之上的数据仓库:
使用HQL作为查询接口;
使用HDFS存储;
使用MapRedece计算; - Hive的本质是将 SQL 语句转换为 MapReduce 程序;
- 灵活性和扩展性比较好:支持UDF,自定义存储格式等;
- 适合离线数据处理;
仓库对比
三种安装模式
内嵌模式
元数据保存在内嵌的derby中,允许一个会话连接,尝试多个会话链接时会报错;
hive服务、metastore以及derby服务运行在同一个进程中;
该模式无需特殊配置(在不修改任何配置的情况下,在本机通过默认的元数据数据库管理);
hive中有一个自带的数据库derby;
首次启动需要进行初始化操作(因为有一些默认的表结构和默认的数据库);
初始化成功之后,会在当前执行的目录下,生成:metastore_db;
在初始化时所在目录下,运行hive,将进入hive shell窗口;
derby是将所有的数据,存储在当前metestore_db这个目录中的;
如果在不同的目录下,多次初始化的话,将无法做到数据共享;
所以内嵌模式,只适用于学习使用;
注意事项:
执行hive之前,启动hdfs;
在哪一个目录下运行hive,都必须进行初始化;
如果在同一个目录下,多次初始化时,需要将我们生成的metastore_db删除,再进行初始化;
对只能单用户操作的理解:
初始化操作成功后,运行hive,可以进入hive shell窗口;
新打开一个终端,进入相同目录,运行hive,会报错,报错信息如下:
Another instance of Derby may have already booted the database /home/yk/apache-hive-2db.
如果在不同目录下执行初始化操作,运行hive,也能够进入hive shell窗口,但与另一个运行实例数据不共享(因为他们连接的是不同的数据库)
配置环境变量
[/etc/profile]
export HIVE_HOME=/home/yk/hive
export PATH=$PATH:$HIVE_HOME/bin
初始化操作
[root@master106 bin]# schematool -initSchema -dbType derby
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/ibutils/bin:%JAVA_HOME/bin:/soft/maven/bin:/home/yk/hadoop-2.7.3/bin:/home/yk/hadoop-2.7.3/sbin:/home/yk/crail/assembly/target/crail-1.0-bin:/home/yk/spark/bin:/home/yk/spark/sbin:/home/yk/zookeeper/bin:/bin:/home/yk/hive/bin:/home/yk/kafka-eagle-bin-1.2.8/kafka-eagle-web-1.2.8/bin:/root/bin:/home/yk/hadoop-2.7.3/bin:/home/yk/hadoop-2.7.3/sbin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/yk/apache-hive-2.1.0-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/yk/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:derby:;databaseName=metastore_db;create=true
Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver
Metastore connection User: APP
Starting metastore schema initialization to 2.1.0
Initialization script hive-schema-2.1.0.derby.sql
Initialization script completed
schemaTool completed
// 此时会生成一个metastore_db文件
运行hive
// 注:要启动hdfs,否者报错
[root@master106 bin]# hive
which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/ibutils/bin:%JAVA_HOME/bin:/soft/maven/bin:/home/yk/hadoop-2.7.3/bin:/home/yk/hadoop-2.7.3/sbin:/home/yk/crail/assembly/target/crail-1.0-bin:/home/yk/spark/bin:/home/yk/spark/sbin:/home/yk/zookeeper/bin:/bin:/home/yk/hive/bin:/home/yk/kafka-eagle-bin-1.2.8/kafka-eagle-web-1.2.8/bin:/root/bin:/home/yk/hadoop-2.7.3/bin:/home/yk/hadoop-2.7.3/sbin)
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/yk/apache-hive-2.1.0-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/yk/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]
Logging initialized using configuration in jar:file:/home/yk/apache-hive-2.1.0-bin/lib/hive-common-2.1.0.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
基本操作
https://www.yiibai.com/hive/hive_create_table.html
- 缺点: 只能单用户操作(另一终端下执行hive报错)
Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /home/yk/apache-hive-2db.
本地模式
hive服务与metastore服务运行在同一个进程中,mysql是单独的进程,可以在同一台机器上,也可以在远程机器上。该模式只需将hive-site.xml中的ConnectionURL指向mysql,并配置好驱动名、数据库连接账号即可。
本地模式:改变元数据的存放位置(实现数据共享与多用户操作)
安装mysql: linux环境下,通常与hive安装在同一台主机上。
将元数据写入mysql中,同时可以在任意目录下,执行hive,进入到hive shell窗口。
让hive与mysql互连,让hive连接mysql。
1、修改hive中的配置文件
[root@master106 conf]# mv hive-default.xml.template hive-site.xml
[root@master106 conf]# vim hive-site.xml
<?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://172.16.2.106:3306/hive?createDatabaseIfNotExist=true</value>
</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>1234</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/home/yk/hive</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/home/yk/hive/querylog</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/home/yk/hive/server2_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled
</description>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
<description>
Setting this property to true will have HiveServer2 execute
Hive operations as the user making the calls to it.
</description>
</property>
<configuration>
2、将mysql的驱动包mysql-connector-java-5.1.17.jar 放在$HIVE_HOME/lib/目录下
3、初始化操作
schematool -initSchema -dbType mysql
4、 可以在任意目录下执行hive,也可以同时启动多个hive shell窗口
远程模式
hive服务和metastore在不同的进程中,可能是不同的机器。