Hive初识

Hive介绍

简介

基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

主要用于OLAP数据处理

特点

● 运行在Hadoop之上
● 支持创建索引,优化数据查询。
● 不同的存储类型,例如,纯文本文件、HBase 中的文件。
● 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。(元数据包括表的名字,表的列和分区及其属性)
● 可以直接使用存储在Hadoop 文件系统中的数据。
● 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
● 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。

结构图

20190516152203

20190516152201

20190516152202

安装

安装包

1
2
3
4
jdk-8u131-linux-x64.gz
hadoop-3.1.2.tar.gz
apache-hive-3.1.1-bin.tar.gz
mysql-connector-java-5.1.41.jar

安装JDK

1
2
3
4
5
6
7
8
9
# /opt下解压
tar zxvf jdk-8u131-linux-x64.gz

# 配置JDK环境变量
vim + /etc/profile

export JAVA_HOME=/opt/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin

安装Hadoop(单节点伪分布式)

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# 1. /opt下解压
tar zxvf tar zxvf hadoop-3.1.2.tar.gz

# 2. 配置JDK环境变量
vim + /etc/profile


export HADOOP_HOME=/opt/hadoop-3.1.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME

export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=$HADOOP_HOME
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop

export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_NAMENODE_USER=root


# 3. 环境变量生效
source /etc/profile

# 4. 配置HDFS地址和临时目录
mkdir -p /opt/hadoop/tmp

vim $HADOOP_HOME/etc/hadoop/core-site.xml

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>


# 5. 配置HDFS副本数及数据存放路径
mkdir -p /opt/hadoop/hdfs/name
mkdir -p /opt/hadoop/hdfs/data

vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>/opt/hadoop/hdfs/data</value>
</property>
</configuration>


# 6. 修改mapred-site.xml
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/opt/hadoop-3.1.2/etc/hadoop,
/opt/hadoop-3.1.2/share/hadoop/common/*,
/opt/hadoop-3.1.2/share/hadoop/common/lib/*,
/opt/hadoop-3.1.2/share/hadoop/hdfs/*,
/opt/hadoop-3.1.2/share/hadoop/hdfs/lib/*,
/opt/hadoop-3.1.2/share/hadoop/mapreduce/*,
/opt/hadoop-3.1.2/share/hadoop/mapreduce/lib/*,
/opt/hadoop-3.1.2/share/hadoop/yarn/*,
/opt/hadoop-3.1.2/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>

#7. 编辑 yarn-site.xml
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>


# 7. 修改hadoop-env.sh
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

头部追加export JAVA_HOME=/opt/jdk1.8.0_131

# 8. 配置localhost免密登录
ssh-keygen
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh root@localhost


# 9. 格式化HDFS并启动Hadoop
hdfs namenode -format
start-auto.sh

浏览器访问:
HDFS-NameNode
http://127.0.0.1:9870

Hadoop资源管理器yarn
http://192.168.64.86:8088

错误解决:

  1. but there is no YARN_RESOURCEMANAGER_USER defined. Aborting operation.

    vim $HADOOP_HOME/sbin/start-dfs.shvim $HADOOP_HOME/sbin/stop-dfs.sh

    顶部追加

    1
    2
    3
    4
    5
    HDFS_NAMENODE_USER=root
    HDFS_DATANODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    YARN_RESOURCEMANAGER_USER=root
    YARN_NODEMANAGER_USER=root

    vim $HADOOP_HOME/sbin/start-yarn.shvim $HADOOP_HOME/sbin/stop-yarn.sh

    顶部追加

    1
    2
    3
    YARN_RESOURCEMANAGER_USER=root
    HADOOP_SECURE_DN_USER=yarn
    YARN_NODEMANAGER_USER=root

安装Hive

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
47
# 1. /opt 下解压
tar zxvf apache-hive-3.1.1-bin.tar.gz

# 2. 配置JDK环境变量
vim + /etc/profile

export HIVE_HOME=/opt/apache-hive-3.1.1-bin
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

source /etc/profile

# 3. hive增加MySQL驱动
cd $HIVE_HOME/lib/
上传mysql-connector-java-5.1.41.jar

并在已经MySQL数据库中创建数据库hive

# 4. 修改配置文件
cd $HIVE_HOME/conf/
cp hive-default.xml.template hive-site.xml

vim + hive-site.xml
尾部追加,增加MySQL配置信息
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>xxxxxxxxxxxxxx</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://xxx.xxx.xxx.xxxx:3306/hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

# 5. 初始化数据库
`schematool -dbType mysql -initSchema`

# 6. 进入hive的命令
hive

报错解决

  1. Illegal character entity: expansion character ( code 0x8
    字符编码导致
    vim hive-site.xml +3210
    删除字符Exclusive locks for&#8所在行
  2. Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
    创建目录mkdir -p /opt/hive/tmp/root
    vim hive-site.xml
    执行全局替换:%s/${system:java.io.tmpdir}\/${system:user.name}/\/opt\/hive\/tmp\/root/g
    :%s/${system:java.io.tmpdir}/\/opt\/hive\/tmp/g

  3. FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

Hive使用

操作

进入hive操作

1
2
3
4
5
6
7
8
9
10
11
# 创建数据库
create database testdb;

# 显示所有库
show databases;

# 选中操作库
use testdb;

# 创建表
create table table_01 (id int,name string);

Hadoop中查看

1
2
HDFS使用情况
hadoop fs -lsr /

MySQL数据库hive中查看表tbls,tab_col_stats等

Web端查看http://127.0.0.1:9870中的Browser Directory

Hive启动方式

  1. 命令行:hive
  2. JDBC远程服务方式启动:hive --service hiveserver2或者hive --service hiveserver2 1000(默认端口:10000)
  3. Web界面:hive --service hwi

内部服务帮助命令:hive --service help

Hive开启远程JDBC

  1. 修改Hadoop的core-site.xml配置文件,允许所有用户所有主机远程连接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

    增加

    <property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
    </property>
    <property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
    </property>
  2. 设置hive2的host和port

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

    直接在配置文件修改

    <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
    <description>Port number of HiveServer2 Thrift interface.
    Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT</description>
    </property>

    <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>0.0.0.0</value>
    <description>Bind host on which to run the HiveServer2 Thrift interface.
    Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST</description>
    </property>
  3. 远程连接的账户和密码
    Hive的JDBC账户和密码是和hive连接的MySQL相同的,位于配置文件$HIVE_HOME/conf/hive-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>xxxxxxxxxxxxxx</value>
    </property>
  4. 启动远程服务:

  5. 使用Hive自带的工具beeline测试

    1
    2
    beeline
    beeline> !connect jdbc:hive2://127.0.0.1:10000/testdb
  6. Hive的JDBC所需要的驱动

    1. Jar直接引入(在Hive下的lib目录,需要多个,此次懒得找,直接将lib下的所有jar加载使用)

    2. Maven

      https://gitee.com/mtain/hive-db-jdbc

JDBC远程连接工具

  1. JetBrains DataGrip
  2. Squirrel

Hive常见数据导入方式

  1. 从本地文件系统中导入数据到Hive表
  2. 从HDFS上导入数据到Hive表
  3. 从别的表中查询出相应的数据并导入到Hive表中
  4. 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中

猜测:例如用Java做开发语言+JDBC连接操作Hive,也应该是“用JDBC实现Hdfs导入到Hive”,而不是使用批量的Insert语句

参考文章:http://www.aboutyun.com/thread-7440-1-1.html

Hive UDF

介绍

UDF全称为User Defined Function,即用户自定义函数

在Hive使用Java语言开发,编写数据处理逻辑,编译成Jar,再将Jar加载到Hive中,创建函数进行使用

代码示例

https://github.com/nexr/hive-udf