# hive-db-jdbc
**Repository Path**: mtain/hive-db-jdbc
## Basic Information
- **Project Name**: hive-db-jdbc
- **Description**: Hive-JDBC示例
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2019-05-17
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## Hive-JDBC示例
## Hive介绍
### 简介
基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
主要用于**OLAP**数据处理
### 特点
● 运行在Hadoop之上
● 支持创建索引,优化数据查询。
● 不同的存储类型,例如,纯文本文件、HBase 中的文件。
● 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。(元数据包括表的名字,表的列和分区及其属性)
● 可以直接使用存储在Hadoop 文件系统中的数据。
● 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
● 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
### 结构图



## 安装
### 安装包
```java
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
```
# /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. /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
fs.default.name
hdfs://127.0.0.1:9000
hadoop.tmp.dir
/opt/hadoop/tmp
# 5. 配置HDFS副本数及数据存放路径
mkdir -p /opt/hadoop/hdfs/name
mkdir -p /opt/hadoop/hdfs/data
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
dfs.replication
2
dfs.namenode.name.dir
/opt/hadoop/hdfs/name
dfs.namenode.data.dir
/opt/hadoop/hdfs/data
# 6. 修改mapred-site.xml
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
mapreduce.framework.name
yarn
mapreduce.application.classpath
/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/*
#7. 编辑 yarn-site.xml
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
# 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.sh`和`vim $HADOOP_HOME/sbin/stop-dfs.sh`
顶部追加
```
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.sh`和`vim $HADOOP_HOME/sbin/stop-yarn.sh`
顶部追加
```
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
```
### 安装Hive
```
# 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配置信息
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
xxxxxxxxxxxxxx
javax.jdo.option.ConnectionURL
jdbc:mysql://xxx.xxx.xxx.xxxx:3306/hive
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
# 5. 初始化数据库
`schematool -dbType mysql -initSchema`
# 6. 进入hive的命令
hive
```
### 报错解决
1. Illegal character entity: expansion character ( code 0x8
字符编码导致
vim hive-site.xml +3210
删除字符`Exclusive locks for`所在行
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操作**
```
# 创建数据库
create database testdb;
# 显示所有库
show databases;
# 选中操作库
use testdb;
# 创建表
create table table_01 (id int,name string);
```
**Hadoop中查看**
```
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配置文件,允许所有用户所有主机远程连接
```
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
增加
hadoop.proxyuser.root.hosts
*
hadoop.proxyuser.root.groups
*
```
2. 设置hive2的host和port
```
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
直接在配置文件修改
hive.server2.thrift.port
10000
Port number of HiveServer2 Thrift interface.
Can be overridden by setting $HIVE_SERVER2_THRIFT_PORT
hive.server2.thrift.bind.host
0.0.0.0
Bind host on which to run the HiveServer2 Thrift interface.
Can be overridden by setting $HIVE_SERVER2_THRIFT_BIND_HOST
```
3. 远程连接的账户和密码
Hive的JDBC账户和密码是和hive连接的MySQL相同的,位于配置文件` $HIVE_HOME/conf/hive-site.xml`中
```
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
xxxxxxxxxxxxxx
```
4. 启动远程服务:``
5. 使用Hive自带的工具beeline测试
```
beeline
beeline> !connect jdbc:hive2://127.0.0.1:10000/testdb
```
6. Hive的JDBC所需要的驱动
1. Jar直接引入(在Hive下的lib目录,需要多个,此次懒得找,直接将lib下的所有jar加载使用)
2. Maven
### 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中,创建函数进行使用
**代码示例**