Hive配置与操作实践

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/50580995 Hive配置与操作实践@(Hadoop)安装hivehive的安装十分简单,只需要在一台服务器上部署即可。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/50580995

Hive配置与操作实践

@(Hadoop)


安装hive

hive的安装十分简单,只需要在一台服务器上部署即可。

上传hive安装包,解压缩,将其配入环境变量。

mysql的设置

在要作为元数据库的mysql服务器上建立hive数据库:

#建立数据库
create database if not exists hive;

#设置远程登录的权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

#刷新配置
FLUSH PRIVILEGES;

或者创建专门访问hive的用户:

CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
create database hive;
grant all on hive.* to hive@'%'  identified by 'hive';
grant all on hive.* to hive@'localhost'  identified by 'hive';
flush privileges; 

并将mysql jdbc驱动放入hive/lib目录下。

配置文件修改

进入conf目录,修改配置文件:

cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-default.xml
cp hive-log4j.properties.template hive-log4j.properties
cp hive-exec-log4j.properties.template hive-exec-log4j.properties

在hive-env.sh文件中配置hadoop的home目录。

新建hive-site.xml文件

hive-site.xml:

<configuration>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/usr/local/hive/iotmp</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!--mysql元数据库配置-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<!--远程mysql元数据库-->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
</configuration>

根据续期就进行修改。
注意:低版本的hive**文件BUG:搜索auth,改为auth**

之后需要创建/usr/local/hive/iotmp文件夹

hive-log4j.properties:

#修改默认的日志存在路径
hive.log.dir=

hive-exec-log4j.properties:

#修改默认的日志存在路径
hive.log.dir=

错误与异常记录

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient

一般是没执行hive –service metastore,重新执行即可。

常用命令

建表(默认是内部表)

create table trade_detail(id bigint, account string, income double, expenses double, 
time string) row format delimited fields terminated by '\t';

建表时要指定字段之间的分隔符。

建分区表

create table td_part(id bigint, account string, income double, expenses double, time 
string) partitioned by (logdate string) row format delimited fields terminated by '\t';

除了执行字段分隔符 之外还要指定分区字段。

建外部表

create external table td_ext(id bigint, account string, income double, expenses 
double, time string) row format delimited fields terminated by '\t' location '/td_ext';

通过external关键字来建立外部表,location来指定要关联的hdfs文件系统的位置。

分区表加载数据

load data local inpath './book.txt' overwrite into table book partition 
(pubdate='2010-08-22');

使用sqoop将mysql的数据导入到hive表中
sqoop先将数据导入到hdfs中,在调用hive的命令load到hive表中,所以要配置hive的环境变量。

在hive当中创建两张表

create table trade_detail (id bigint, account string, income double, 
expenses double, time string) row format delimited fields terminated by '\t';

create table user_info (id bigint, account string, name  string, age int) row format delimited fields terminated by '\t';

将mysq当中的数据直接导入到hive当中

sqoop import --connect jdbc:mysql://192.168.61.130:3306/cloud --username 
root --password JChubby123 --table trade_detail --hive-import --hive-overwrite --hive-table trade_detail --fields-terminated-by '\t'

sqoop import --connect jdbc:mysql://192.168.61.130:3306/cloud --username 
root --password JChubby123 --table user_info --hive-import --hive-overwrite --hive-table user_info -- fields-terminated-by '\t'

创建一个result表保存前一个sql执行的结果

create table result row format delimited fields terminated by '\t' as select t2.account, t2.name, t1.income, t1.expenses, t1.surplus from user_info t2 join (select account, sum(income) as income, sum(expenses) as expenses, sum(income-expenses) as surplus from trade_detail group by account) t1 on (t1.account = t2.account);

使用自定义的UDF函数

像传统数据库中的存储过程一样,自定义的UDF函数有输入和输出。当hive的函数不能满足业务需求的时候就需要自定义UDF函数来进行任务执行。

  1. 引入hive和hadoop common的jar包
  2. 自定义类,并继承自UDF类
  3. 定义UDF函数,统一命名为evaluate,如:public Text evaluate(Text in)输入和输出要使用hadoop io的基本类型,因为其也要走mr任务和网络传输
  4. 将其打包成jar并上传到装有hive的机器中
  5. 在hive shell中执行命令将jar包中的函数添加进去

自定义函数调用过程:

  1. 添加jar包(在hive命令行里面执行)
    hive> add jar /root/NUDF.jar;
  2. 创建临时函数
    hive> create temporary function getNation as ‘NationUDF’;
    函数要写成包括包名的全名称
  3. 调用
    hive> select id, name, getNation(nation) from beauty;
  4. 将查询结果保存到HDFS中
    create table result row format delimited fields terminated by ‘\t’ as select id, getNation
    (nation) from beauties;

基本数据类型

基本的数据类型参考:
http://blog.csdn.net/chenxingzhen001/article/details/20901045

1.27更新

配置hive1.2.1版本的时候出现一个问题,如下:

Exception in thread "main"java.lang.RuntimeException: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
        atorg.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)
        atorg.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)
        atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        atjava.lang.reflect.Method.invoke(Method.java:606)
        atorg.apache.hadoop.util.RunJar.main(RunJar.java:160)
Caused by: java.lang.IllegalArgumentException:java.net.URISyntaxException: Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        atorg.apache.hadoop.fs.Path.initialize(Path.java:148)
        atorg.apache.hadoop.fs.Path.<init>(Path.java:126)
        atorg.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:487)
        atorg.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:430)
        ... 7more
Caused by: java.net.URISyntaxException:Relative path in absolute URI:${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        atjava.net.URI.checkPath(URI.java:1804)
        atjava.net.URI.<init>(URI.java:752)
        atorg.apache.hadoop.fs.Path.initialize(Path.java:145)
        ... 10more

解决方式:

在HIVE_HOME目录下新建一个iotmp文件夹,
在hive-site.xml文件中,搜索所有包含system:java.io.tmpdir的配置项,将其value属性改为iotmp的路径保存即可。

hive无法读取配置文件的问题

hive部署之后,hive-site.xml中配置的是连接到远程的mysql数据库。

HIVE_HOME已配置到.bash_profile文件中,但是直接执行hive命令的时候发现,同一个人在不同路径下执行竟然看到的表数据是不一样的!

于是开始排查异常,切换各个不同的目录执行hive命令,但是看到的数据都不一样,而且发现每个目录下都会生成derby元数据库的文件信息,于是猜想hive连接的是本地的derby数据库,但是配置文件里面明明设置的是连接远程mysql数据库。

进入conf目录再次执行hive命令,一切正常,将hive-site.xml文件复制到任意目录,再次执行hive,一切正常。

说明当不在conf目录下执行hive命令的时候,hive脚本找不到hive-site.xml文件。

再次仔细检查各种环境变量,一切正常,HADOOP_HOME、HIVE_HOME、HIVE_CONF_DIR等已经都在hive-env.sh中配置好了。

查看hive脚本的代码,发现里面会先跑一个hive-config.sh,于是又打开该文件查看,没发现什么异常,直接export HIVE_CONF_DIR写死在里面,保存退出,执行hive,仍然不行。

作者:@小黑

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
SQL 数据库 HIVE
记录hive数据库远程访问配置问题
记录hive数据库远程访问配置问题
164 0
|
7月前
|
SQL Java 数据库连接
java链接hive数据库实现增删改查操作
java链接hive数据库实现增删改查操作
437 0
|
7月前
|
SQL 大数据 HIVE
Hive 任务调优实践总结
Hive 任务调优实践总结
62 0
|
SQL Java 数据库连接
Hive教程(08)- JDBC操作Hive
Hive教程(08)- JDBC操作Hive
945 0
|
SQL 存储 分布式计算
Hive的简单操作
Hive的简单操作
67 0
|
SQL 缓存 分布式计算
54 Hive的Join操作
54 Hive的Join操作
157 0
|
7月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
302 0
|
2月前
|
SQL 存储 分布式计算
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
57 3
|
2月前
|
SQL 存储 数据管理
Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测
Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测
66 2
|
7月前
|
SQL 关系型数据库 MySQL
Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
【2月更文挑战第9天】Sqoop【付诸实践 01】Sqoop1最新版 MySQL与HDFS\Hive\HBase 核心导入导出案例分享+多个WRAN及Exception问题处理(一篇即可学会在日常工作中使用Sqoop)
304 7