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,仍然不行。

作者:@小黑

Hive配置与操作实践的更多相关文章

  1. HIVE的Shell操作

    1.Hive支持的一些命令 退出使用quit或exit离开交互式外壳. set key = value使用它来设置特定配置变量的值. 这里要注意的一件事是,如果您对变量名拼写错误,cli将不会显示错误 ...

  2. Squid 操作实践

    Squid简介 Squid可以做什么 性能要素 Squid安装 Squid快速体验 Squid配置 Squid简介 Squid is a caching proxy for the Web suppo ...

  3. 如何监听对 HIVE 元数据的操作

    目录 简介 HIVE 基本操作 获取 HIVE 源码 编译 HIVE 源码 启动 HIVE 停止 HIVE 监听对 HIVE 元数据的操作 参考文档 简介 公司有个元数据管理平台,会定期同步 HIVE ...

  4. 集群搭建之Hive配置要点

    注意点: 在启动Hive 的时候要先启动Hadoop和MySQL服务. Mysql 和 Hive 搭建在 yan00机器上. part1:MySQL配置相关 安装和配置相关命令: Yum instal ...

  5. Sqoop操作实践

    Sqoop操作实践 @(Hadoop) Sqoop常用参命令 序号 命令/command 类 说明 1 impor ImportTool 从关系型数据库中导入数据(来自表或者查询语句)到HDFS中 2 ...

  6. HIVE配置mysql metastore

    HIVE配置mysql metastore    hive中除了保存真正的数据以外还要额外保存用来描述库.表.数据的数据,称为hive的元数据.这些元数据又存放在何处呢?    如果不修改配置hive ...

  7. 入门大数据---Hive常用DML操作

    Hive 常用DML操作 一.加载文件数据到表 1.1 语法 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename ...

  8. 阿里巴巴微服务与配置中心技术实践之道 配置推送 ConfigurationManagement ConfigDrivenAnyting

    阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08 在面向分布式的微服务系统中,如何通过更高效的配置管理方式,帮助微服务系统架构持续"无痛"的演进 ...

  9. Spring Boot自动配置原理与实践(二)

    前言 在之前的博文(Spring Boot自动配置原理与实践(一))中,已经介绍了Spring boot的自动配置的相关原理与概念,本篇主要是对自动配置的实践,即自定义Starter,对原理与概念加深 ...

随机推荐

  1. Am335x U-boot LCD简易驱动

    参考此文档说明,自行添加相关代码: https://pan.baidu.com/s/1i5gLE89 相关代码: https://pan.baidu.com/s/1qXL8Bne 在文档说明第四步1中 ...

  2. mysql总是无故退出, InnoDB: mmap(68681728 bytes) failed; errno 12

    最近发现mysql总是无故退出,(vim /var/log/mysqld.log)查看日志报下面错误: InnoDB: mmap(68681728 bytes) failed; errno 12 开启 ...

  3. FastReport.Net使用:[16]图片控件使用

    FastReport中,图片(Picture)控件的用法? 支持的图片格式 1.BMP, PNG, JPG, GIF, TIFF, ICO, EMF, WMF 支持的数据源 支持图片,数据列,文件名, ...

  4. 【BZOJ 4503】4503: 两个串 (FFT)

    4503: 两个串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 497  Solved: 226 Description 兔子们在玩两个串的游戏.给 ...

  5. 「WC2010」重建计划(长链剖分/点分治)

    「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 ...

  6. [BZOJ2402]陶陶的难题II(树链剖分+线段树维护凸包+分数规划)

    陶陶的难题II 时间限制:40s      空间限制:128MB 题目描述 输入格式 第一行包含一个正整数N,表示树中结点的个数. 第二行包含N个正实数,第i个数表示xi (1<=xi<= ...

  7. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Description Input Output Sample Input 4 ...

  8. 树形DP--codevs 1380 没有上司的舞会

    codevs 1380 没有上司的舞会 变式题目:给定一棵树每个点有一个点权,求一个独立集使得点权和最大,树上的独立集指的是选取树上的点,使尽量多的点不直接相连  时间限制: 1 s  空间限制: 1 ...

  9. 在windows上安装和启动Elasticseach、Kibana

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...

  10. python开发_calendar

    如果你用过linux,你可能知道在linux下面的有一个强大的calendar功能,即日历 在python中,同样也有这样的一个强大的calendar 下面是我做的demo: #python中的cal ...