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. 《Android虚拟机》--内存分配策略

    No1: Java在内存分配时会涉及到以下区域: 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对 ...

  2. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  3. luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<a ...

  4. Tsinsen 最长双回文串

    求最长双回文串,正反建回文树求最大. 题目链接:http://www.tsinsen.com/ViewGProblem.page?gpid=A1280 By:大奕哥 #include<bits/ ...

  5. [BZOJ4408&&BZOJ4299][FJOI2016 && Codechef]神秘数&&FRBSUM(主席树)

    4299: Codechef FRBSUM Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 550  Solved: 351[Submit][Statu ...

  6. UOJ #35. 后缀排序 后缀数组 模板

    http://uoj.ac/problem/35 模板题,重新理了一遍关系.看注释吧.充分理解了倍增的意义,翻倍之后对上一次排序的利用是通过一种类似于队列的方式完成的. #include<ios ...

  7. ssm整合总结(一)--第一步之使用maven搭建一个web项目

    本文内容来自:山硅谷,本文内容整合了任务2,任务3,任务4内容.http://www.gulixueyuan.com/my/course/50 1说明 1.1该项目使用的知识点有 1.1.1校验方式是 ...

  8. hdu 3081

    二分答案,网络流是否满流判断合法性. #include <cstdio> #include <cstring> #include <queue> #include ...

  9. hdu 1533 KM或费用流

    以前用KM写过,现在再用费用流写. #include <iostream> #include <cstdio> #include <cstring> #includ ...

  10. nodejs中间件拦截,express不登录无法进入后台页面

    22.设置拦截 只有登录才能进入到后台页面,不登录无法进入 如果登陆成功, 写入session, 参数 uid uid=123dsfjksldfjsl 检测登陆, 请求中 session 是否包含 u ...