hive 学习笔记(三)-----优化策略,函数定义,web接口

来源:互联网 发布:歌帝梵巧克力 知乎 编辑:程序博客网 时间:2024/06/05 16:17

(一)优化策略

根据实际使用情况,hive有很多优化策略,如:

1,列裁剪 :无需显示的列裁剪掉。实现列裁剪需设置:hive.option.cp=true.
2,分区裁剪: 通过加入where partition条件来进行分区裁剪,实现分区裁剪需设置hive.optimize.pruner=true.
3.jion in:尽量将jion表中列较少的表放在jion前面。因为join操作reduce阶段,位于join操作符左边的表内容会加载到内存。将列少表放在前面有助于防止OOM(out of mermery)的出现。
4.map join: hive.join.emit.interval=1000,hive.mapjoin.cache.numrows=25000,hive.mapjoin.size.key=10000.其中,hive.join.emit.interval=1000定义了输出join结果前
判断右侧进行join的操作数最多可以加载多少行到内存缓存中。
5,group by: map端的部分聚会实现需要设置:hive.map.aggr=true;map.groupby.mapaggr.checkinterval=100000;有数据倾斜时,进行负载均衡。需设置:hive.groupby.skewindata=true;
6.合并小文件:hive.merge.mapfiles=true;设置是否合并map输出文件;hive.merge.mapredfiles=false,设置是否合并reduce输出文件;hive.merge.size.per.task=256*1000*1000,设置每个task合并文件的大小;


(二)hive UDF+UDAF+UDTF

HIVE 用户定义函数:
在cli,使用如下命令能够显示最新的函数记录(参考信息)。命令如下:
SHOW FUNCTIONS;
DESCRIBE FUNCTION <function_name>;
DESCRIBE FUNCTION EXTENDED <function_name>;

一.hive 创建UDF函数:
1.编写udf函数,该函数继承org.apache.hadoop.hive.ql.exec.UDF类,在该函数中写一个或多个evaluate()方法。
2.将编写的udf 函数java类编译成jar包,假设存放位置为/home/GuoYunling-Andy,jar名为udftest.jar。
3.通过cli进入hive,将jar添加到hive classpath ,命令如下:add jar /home/GuoYunling-Andy/udftest.jar.
4.可通过list jar命令查看是否添加到hive classpath。为添加的udf创建临时的函数名即注册函数,假设临时函数名为udftest命令如下: create temporary function udftest as ’$packageName+$classname‘;
5.使用udf函数。select udftest(col ...) from tablename;

二. hive 内置操作 ---详见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
a.hive内置操作有:关系操作,运算操作,逻辑操作,复杂类型构造,复杂类型操作。
b.hive的内置函数有:运算函数,Collection函数,类型转换函数,时间日期函数,条件函数,字符串函数,Misc. Functions,xpath函数,获取json对象等。
c.hive内置聚合函数(UDAF):hive支持的聚会函数有sum,count,min/max,stddev_pop,percentile,等
d.hive内置Table-Generating 函数:目前hive 在hive0.10支持 inline函数。hive table-generating 函数将单行输入转换为多行输出。
e.expode()函数:将数组输入转换为以单行输出,每行输出数组中的一个元素。比如可用于将数据类型为数组的列拆分为一个新列,新列中元素为数组中的各元素。
注:使用语法“SELECT udtf(col) AS colAlias...”有若干限制:
* 在select语句中不允许有其他的表达式:如hive不支持SELECT pageid, explode(adid_list) AS myCol...
* UDTF‘S不支持嵌套。如hive不支持SELECT explode(explode(adid_list)) AS myCol...
* GROUP BY / CLUSTER BY / DISTRIBUTE BY / SORT BY也都不支持。
hive内置table-generating函数还有stack(int n,v_1,v_2,...v_k):即将v_1 到v_k 分成n行,每行有k/n列,n必须为常量。
f. json 数组(json_tuple)
g. parse_url_tuple
h. GROUPing and SORTing on f(column)
i. UDF internals


创建自定义UDFs:
1 .首先需要创建一个新类继承UDF,命名为evaluate的一个或多个方法。
package com.example.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}

(注意那已经是一个built-in 的函数了。上述的仅是一个简单例子)
2 . 编译类成jar包后,将jar包添加到hive classpath中,添加方法如下:
hive> add jar my_jar.jar;
Added my_jar.jar to class path
默认添加到当前路径,也可以自定义一个全路径:
hive> add jar /tmp/my_jar.jar;
Added /tmp/my_jar.jar to class path
完成后,在session 会话初始化jobs时,在classpath中新添加的jar将被用到。查看哪些jars已经添加到classpath下,可以使用一下命令:
hive> list jars;
my_jar.jar
3 .hive使用classpath中的jars(包括添加的jar)创建启动后,最后一步需注册自定义的函数,命令行如下:
create temporary function my_lower as 'com.example.hive.udf.Lower';
4. 开始运行:
hive> select my_lower(title), sum(freq) from titles group by my_lower(title);

...

Ended Job = job_200906231019_0006
OK
cmo 13.0
vp 7.0

5.更多例子,详见:
https://cwiki.apache.org/confluence/display/Hive/GenericUDAFCaseStudy

(三)hive web接口----hive web interface

HIVE-WEB-INTERFACE:
1.使用hive web interface(hwi)接口访问操作数据
a 查看hive-default.xml中的hive.hwi.listen.host,hive.hwi.listen.port,hive.hwi.war.file 中设置的属性信息,即hwi接受的访问的主机名,端口等信息。
b 在hive安装目录下 启动bin/hive --service hwi 服务
c 通过浏览器访问 http://masterIP:PORT/hwi (要求机间能ping通,且防火墙对该端口的input已设置)
2.HIVE-WEB-INTERFACE:替代cli实现相关功能。对于刚刚接触者来说非常适用。
3.特征:
a. Schema Browsing
能够替代cli运行“show tables”“show extended tables”生成相应结果。即查询表信息。hive元数据显示体系结构能够在数据库层次上获取相关表信息,如serde,列名,和列数据类型等
b. Detached query execution
当用户需要同时进行多个hive查询时,需要打开多个cli窗口,hive网络接口在web服务器上管理用户会话,允许用户开启多个查询,并返回到网络接口检测查询状态。
c. no local installation
任何用户都可以通过web接口对hive操作。一个用户想与hadoop或hive交互时,要求访问多个端口。此时,远程/vpn用户只需要访问hive 网络接口即可。默认运行在0.0.0.0 tcp/9999.
d. configuration
hwi 在0.2版本已内置,所有无需额外设置。也并不需要在hwi编辑默认的配置。hwi使用配置如下:

<property>
<name>hive.hwi.listen.host</name>
<value>0.0.0.0</value>
<description>This is the host address the Hive Web Interface will listen on</description>
</property>

<property>
<name>hive.hwi.listen.port</name>
<value>9999</value>
<description>This is the port the Hive Web Interface will listen on</description>
</property>

<property>
<name>hive.hwi.war.file</name>
<value>${HIVE_HOME}/lib/hive_hwi.war</value>
<description>This is the WAR file with the jsp content for Hive Web Interface</description>
</property>

如果需多用户访问,需要设置HiveDerbyServerMode。

4.启动
JETTY要求apache 的ant来启动hwi,你应该定义ANT—LIB 作为环境变量并添加hive invocation。
export ANT_LIB=/opt/ant/lib
bin/hive --service hwi
创建封装的脚本文件:
nohup bin/hive --service hwi > /dev/null 2> /dev/null &
帮助详情:
bin/hive --service hwi --help
5.访问hwi
可以通过<Hive Server Address>:9999/hwi 访问hwi


原创粉丝点击