官网:
Hive 是一个构建在 Hadoop 之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。
特点:
可以用 command-line shell 和 thrift/jdbc 两种方式来操作数据:
在 Hive 中,表名、表结构、字段名、字段类型、表的分隔符等统一被称为元数据。所有的元数据默认存储在 Hive 内置的 derby 数据库中,但由于 derby 只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL 代替 derby。
Hive 进行的是统一的元数据管理,就是说你在 Hive 上创建了一张表,然后在 presto/impala/sparksql 中都是可以直接使用的,它们会从 Metastore 中获取统一的元数据信息,同样的你在 presto/impala/sparksql 中创建一张表,在 Hive 中也可以直接使用。
Hive 在执行一条 HQL 的时候,会经过以下步骤:
下载:
网盘下载:
链接:https://pan.baidu.com/s/1Bq09-QgxWubrH9DzfftaAA
提取码:yyds
tar -zxvf apache-hive-3.1.2-bin.tar.gz
sudo vi /etc/profile.d/my_env.sh
- export HIVE_HOME=/home/bigdata/module/hive-3.1.2
- export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile.d/my_env.sh
删除log4j冲突问题,因为hadoop已经有这个依赖了所以删除hive的依赖
- cd lib
- mv log4j-slf4j-impl-2.10.0.jar log4j-slf4j-impl-2.10.0.jar.bak
由于 derby 只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL 代替 derby。
ll | grep mysql-connector-java-5.1.49.jar
如果没有安装mysql,想快一点安装的话可以使用docker
- sudo yum install docker
- sudo systemctl start docker
- sudo systemctl enable docker
注意: 要保证时间和客户端的同步不然又证书问题,如果客户端的时间和mysql的时间不对会报错
- sudo yum install -y ntpdate
- sudo ntpdate 120.24.81.91
冲突时使用这个
sudo sudo systemctl stop ntp
镜像加速
- sudo mkdir -p /etc/docker
- sudo tee /etc/docker/daemon.json <<-'EOF'
- {
- "registry-mirrors": ["https://obnqc505.mirror.aliyuncs.com"]
- }
- EOF
- sudo systemctl daemon-reload
- sudo systemctl restart docker
启动一个mysql容器并且开机自启
sudo docker run -itd --name hive-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --restart=always mysql:5.7
vi hive-site.xml
下面的配置文件更具自己的环境进行修改 下面的hivemetastore数据库最好提前创建,hadoop102改成自己hive安装的主机地址
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
- <configuration>
- <property>
- <name>javax.jdo.option.ConnectionURL</name>
- <value>jdbc:mysql://hadoop102:3306/hivemetastore?useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
- </property>
-
- <property>
- <name>javax.jdo.option.ConnectionDriverName</name>
- <value>com.mysql.jdbc.Driver</value>
- </property>
-
- <property>
- <name>javax.jdo.option.ConnectionUserName</name>
- <value>root</value>
- </property>
-
- <property>
- <name>javax.jdo.option.ConnectionPassword</name>
- <value>root</value>
- </property>
-
- <property>
- <name>hive.metastore.warehouse.dir</name>
- <value>/user/hive/warehouse</value>
- </property>
-
- <property>
- <name>hive.metastore.schema.verification</name>
- <value>false</value>
- </property>
-
- <property>
- <name>hive.server2.thrift.port</name>
- <value>10000</value>
- </property>
-
- <property>
- <name>hive.server2.thrift.bind.host</name>
- <value>hadoop102</value>
- </property>
-
- <property>
- <name>hive.metastore.event.db.notification.api.auth</name>
- <value>false</value>
- </property>
-
- </configuration>
schematool -initSchema -dbType mysql -verbose
然后执行hive命令
hive
测试
- show databases;
- create table test(id int,name string);
如果测试上面的没有问题,那么说明安装成功
由于hive本身不能够提供jdbc的连接,所以我们要启动hiveserver2,但是启动hiveserver2的前提是要启动metastore,因为hiveserver2连接metastore,jdbc连接hiveserver2
启动元数据服务 metastore hive操作元数据的服务
hive --service metastore
启动hiveserver2 我们使用的可以通过jdbc的方式连接hiveserver2
hive --service hiveserver2
访问hive
-n指定操作的用户
beeline -u jdbc:hive2://hadoop102:10000 -n bigdata
如果出现权限问题就是没有配置代理用户的原因
Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: bigdata is not allowed to impersonate bigdata
只要在hadoop的core-site.xml添加配置
- <!-- 配置该bigdata(superUser)允许通过代理访问的主机节点 -->
- <property>
- <name>hadoop.proxyuser.bigdata.hosts</name>
- <value>*</value>
- </property>
- <!-- 配置该bigdata(superUser)允许通过代理用户所属组 -->
- <property>
- <name>hadoop.proxyuser.bigdata.groups</name>
- <value>*</value>
- </property>
- <!-- 配置该bigdata(superUser)允许通过代理的用户-->
- <property>
- <name>hadoop.proxyuser.bigdata.users</name>
- <value>*</value>
- </property>
- #!/bin/bash
- HIVE_LOG_DIR=$HIVE_HOME/logs
-
- mkdir -p $HIVE_LOG_DIR
-
- #检查进程是否运行正常,参数1为进程名,参数2为进程端口
- function check_process()
- {
- pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
- ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
- echo $pid
- [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
- }
-
- function hive_start()
- {
- metapid=$(check_process HiveMetastore 9083)
- cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
- cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
- [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
- server2pid=$(check_process HiveServer2 10000)
- nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &
- echo "HiveServer2服务已启动"
- }
-
- function hive_stop()
- {
- metapid=$(check_process HiveMetastore 9083)
- [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
- server2pid=$(check_process HiveServer2 10000)
- [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
- }
-
- case $1 in
- "start")
- hive_start
- ;;
- "stop")
- hive_stop
- ;;
- "restart")
- hive_stop
- sleep 2
- hive_start
- ;;
- "status")
- check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
- check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
- ;;
- *)
- echo Invalid Args!
- echo 'Usage: '$(basename $0)' start|stop|restart|status'
- ;;
- esac
./hiveserver2.sh start
hiveserver2 启动有点慢一般要等几分钟,多运行几次./hiveserver2.sh status就会出现正常了
使用客户端工具连接
第一阶段结束了好好休息下,希望能完成下面的所有阶段一定会有提升