hive 用户手册和map参数调整

map/reduce简单的原理介绍

Hadoop Map/Reduce框架为每一个InputSplit产生一个map任务,而每个InputSplit是由该作业的InputFormat产生的。

然后,框架为这个任务的InputSplit中每个键值对调用一次 map(WritableComparable, Writable, OutputCollector, Reporter)操作。

通过调用 OutputCollector.collect(WritableComparable,Writable)可以收集输出的键值对。

Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,

则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.percent属性控制,表示用作此用途的堆空间的百分比),

如果数据量超过了该缓冲区大小的一定比例(由mapred.job.shuffle.merge.percent决定),则对数据合并后溢写到磁盘中。

Hive外部表,编写正则表达式解析Nginx日志

nginx日志的format配置:

‘$proxy_add_x_forwarded_for - $remote_user [$time_local] "$request"‘

‘$status $request_body "$http_referer"‘

‘"$http_user_agent" "$http_x_forwarded_for" $request_time  $upstream_response_time‘;

生成的日志大致格式:

218.202.xxx.xxx – - [2014-08-19 22:17:08.446671] “POST /xxx/xxx-web/xxx HTTP/1.1″ 200 stepid=15&tid=U753HifVPE0DAOn%2F&output=json&language=zh_CN&session=114099628&dip=10920&diu=DBDBF926-3210-4D64-972A7&xxx=056a849c70ae57560440ebe&diu2=2DFDB167-1505-4372-AAB5-99D28868DCB5&shell=e3209006950686f6e65352c3205004150504c450000000000000000000000000000&compress=false&channel=&sign=438BD4D701A960CD4B7C1DE36AA8A877&wua=0&appkey=0&adcode=150700&t=0
HTTP/1.1″ 200 302 “-” “xxx-iphone” 31.0ms

hive建表的语句:

CREATE EXTERNAL TABLE xxx_log(

host STRING,

log_date STRING,

method STRING,

uri STRING,

version STRING,

STATUS STRING,

flux STRING,

referer STRING,

user_agent STRING,

reponse_time STRING

)

PARTITIONED BY(YEAR STRING, MONTH STRING, DAY STRING)

ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe‘

WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*)\\s+-\\s+-\\s+\\[([^\]]*)\\]\\s+\"([^ ]*)\\s+(.*?)\\s+([^ ]*)\"\\s+(-|[0-9]*)\\s+(-|[0-9]*)\\s+\"(.+?|-)\"\\s+\"(.+?|-)\"\\s+(.*)",

"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %5$s %6$s %7$s %8$s %9$s %10$s" ) STORED AS TEXTFILE;

然后,将数据导入表中

方法1. 将指定路径下的文件导入,不移动文件

ALTER TABLE nugget_aos_log ADD partition (YEAR=‘2014‘, MONTH=‘08‘,DAY=‘19‘) location ‘/user/xxx/xx/year=2014/month=08/day=19‘;

或者

方法2. 导入指定文件,并将文件移动到用户的存储路径下

LOAD DATA inpath ‘/user/xxx/xx/2014/08/19‘ overwrite INTO TABLE xxx_log partition (YEAR=‘2014‘, MONTH=‘08‘,DAY=‘19‘);

接下来就可以查询表中的数据,做验证

hive>select * from xxx_log limit 100;

可能会碰到的情况,你的正则表达式在正则表达式工具(推荐:RegexBuddy)中,没有问题,但是在hive表显示时,每个字段值都是NULL,这说明正则表达式存在错误。这个时候可以用下面的办法解决,在hive中执行下面的命令:

hive>describe extended tablename;

– 查看表的详细信息,其中包括了hive表实际的input.regex正则表达式的值,看看建表的正则表达式转义字符是否缺少。

正则表达式的问题解决之后,再drop table xxx_log,再重新建表,导数据。最后能看到,nginx日志被拆分到了hive表的字段中,接下来就可以进行各种统计了。

hive 用户手册

Usage Examples

Creating tables

MovieLens User Ratings

CREATE TABLE u_data (

userid INT,

movieid INT,

rating INT,

unixtime STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ‘\t‘

STORED AS TEXTFILE;

Apache Access Log Tables

add jar ../build/contrib/hive_contrib.jar;

CREATE TABLE apachelog (

host STRING,

identity STRING,

user STRING,

time STRING,

request STRING,

status STRING,

size STRING,

referer STRING,

agent STRING)

ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe‘

WITH SERDEPROPERTIES (

"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?",

"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"

)

STORED AS TEXTFILE;

Control Separated Tables

CREATE TABLE mylog (

name STRING, language STRING, groups ARRAY<STRING>, entities MAP<INT, STRING>)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ‘\001‘

COLLECTION ITEMS TERMINATED BY ‘\002‘

MAP KEYS TERMINATED BY ‘\003‘

STORED AS TEXTFILE;

Loading tables

MovieLens User Ratings

Download and extract the data:

wget http://www.grouplens.org/system/files/ml-data.tar+0.gz

tar xvzf ml-data.tar+0.gz

Load it in:

LOAD DATA LOCAL INPATH ‘ml-data/u.data‘

OVERWRITE INTO TABLE u_data;

Running queries

MovieLens User Ratings

SELECT COUNT(1) FROM u_data;

Running custom map/reduce jobs

MovieLens User Ratings

Create weekday_mapper.py:

import sys

import datetime

for line in sys.stdin:

line = line.strip()

userid, movieid, rating, unixtime = line.split(‘\t‘)

weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()

print ‘\t‘.join([userid, movieid, rating, str(weekday)])

Use the mapper script:

CREATE TABLE u_data_new (

userid INT,

movieid INT,

rating INT,

weekday INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY ‘\t‘;

INSERT OVERWRITE TABLE u_data_new

SELECT

TRANSFORM (userid, movieid, rating, unixtime)

USING ‘python weekday_mapper.py‘

AS (userid, movieid, rating, weekday)

FROM u_data;

SELECT weekday, COUNT(1)

FROM u_data_new

GROUP BY weekday;

Note: due to a bug in the parser, you must run the "INSERT OVERWRITE" query on a single line

hadoop map数目的分析和调整

Hadoop中在计算一个JOB需要的map数之前首先要计算分片的大小。计算分片大小的公式是:

goalSize = totalSize / mapred.map.tasks

minSize = max {mapred.min.split.size, minSplitSize}

splitSize = max (minSize, min(goalSize, dfs.block.size))

totalSize是一个JOB的所有map总的输入大小,即Map input bytes。参数mapred.map.tasks的默认值是2,我们可以更改这个参数的值。计算好了goalSize之后还要确定上限和下限。

下限是max {mapred.min.split.size, minSplitSize} 。参数mapred.min.split.size的默认值为1个字节,minSplitSize随着File Format的不同而不同。

上限是dfs.block.size,它的默认值是64兆。

举几个例子,例如Map input bytes是100兆,mapred.map.tasks默认值为2,那么分片大小就是50兆;如果我们把mapred.map.tasks改成1,那分片大小就变成了64兆。

计算好了分片大小之后接下来计算map数。Map数的计算是以文件为单位的,针对每一个文件做一个循环:

1.   文件大小/splitsize>1.1,创建一个split,这个split的大小=splitsize,文件剩余大小=文件大小-splitsize

2.   文件剩余大小/splitsize<1.1,剩余的部分作为一个split

举几个例子:

1.   input只有一个文件,大小为100M,splitsize=blocksize,则map数为2,第一个map处理的分片为64M,第二个为36M

2.   input只有一个文件,大小为65M,splitsize=blocksize,则map数为1,处理的分片大小为65M (因为65/64<1.1)

3.   input只有一个文件,大小为129M,splitsize=blocksize,则map数为2,第一个map处理的分片为64M,第二个为65M

4.   input有两个文件,大小为100M和20M,splitsize=blocksize,则map数为3,第一个文件分为两个map,第一个map处理的分片为64M,第二个为36M,第二个文件分为一个map,处理的分片大小为20M

5.   input有10个文件,每个大小10M,splitsize=blocksize,则map数为10,每个map处理的分片大小为10M

再看2个更特殊的例子:

1.   输入文件有2个,分别为40M和20M,dfs.block.size = 64M, mapred.map.tasks采用默认值2。那么splitSize = 30M ,map数实际为3,第一个文件分为2个map,第一个map处理的分片大小为30M,第二个map为10M;第二个文件分为1个map,大小为20M

2.   输入文件有2个,分别为40M和20M,dfs.block.size = 64M, mapred.map.tasks手工设置为1。

那么splitSize = 60M ,map数实际为2,第一个文件分为1个map,处理的分片大小为40M;第二个文件分为1个map,大小为20M

通过这2个特殊的例子可以看到mapred.map.tasks并不是设置的越大,JOB执行的效率就越高。同时,Hadoop在处理小文件时效率也会变差。

根据分片与map数的计算方法可以得出结论,一个map处理的分片最大不超过dfs.block.size * 1.1 ,默认情况下是70.4兆。但是有2个特例:

1.   Hive中合并小文件的map only JOB,此JOB只会有一个或很少的几个map。

2.   输入文件格式为压缩的Text File,因为压缩的文本格式不知道如何拆分,所以也只能用一个map。

考虑采用合适的压缩器(压缩速度vs性能)对输出进行压缩,提高HDFS的写入性能。

每个reduce不要输出多个文件,避免生成附属文件。我们一般用附属文件来记录统计信息,如果这些信息不多的话,可以使用计数器。

为输出文件选择合适的格式。对于下游消费者程序来说,用zlib/gzip/lzo等算法来对大量文本数据进行压缩往往事与愿违。因为zlib/gzip/lzo文件是不能分割的,只能整个进行处理。这会引起恶劣的负载均衡和故障恢复问题。作为改善,可以使用SequenceFile和TFile格式,它们不但是压缩的,而且是可以分割的。

如果每个输出文件都很大(若干GB),请考虑使用更大的输出块(dfs.block.size)。

CREATE TABLE apachelog (

host STRING,

identity STRING,

user STRING,

time STRING,

request STRING,

status STRING,

size STRING,

referer STRING,

agent STRING)

ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.RegexSerDe‘

WITH SERDEPROPERTIES (

"input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"

)

STORED AS TEXTFILE;

map数目调整

public static void setMinInputSplitSize(Job job,long size) {

job.getConfiguration().setLong("mapred.min.split.size", size);

}

public static long getMinSplitSize(JobContext job) {

return job.getConfiguration().getLong("mapred.min.split.size", 1L);

}

public static void setMaxInputSplitSize(Job job,long size) {

job.getConfiguration().setLong("mapred.max.split.size", size);

}

public static long getMaxSplitSize(JobContext context) {

return context.getConfiguration().getLong("mapred.max.split.size",Long.MAX_VALUE);

}

如上我们可以看到,Hadoop在这里实现了对mapred.min.split.size和mapred.max.split.size的定义,且默认值分别为1和Long的最大。因此,我们在程序只需重新赋值给这两个值就可以控制InputSplit分片的大小了。

3.假如我们想要设置的分片大小为10MB

则我们可以在MapReduce程序的驱动部分添加如下代码:

TextInputFormat.setMinInputSplitSize(job,1024L);//设置最小分片大小

TextInputFormat.setMaxInputSplitSize(job,1024×1024×10L);//设置最大分片大小

UDF永久生效

hive根据不同的参数匹配evaluate();

udf比较简单一行生成一行,对一行进行计算,

udaf聚合函数比较麻烦,有merge函数等,在不同的map函数中和reduce中进行。

udtf有一行生成多行或者多列,initialize和progress以及close等,在建表的时候运用,可以用序列化和正则

来做到相同的效果     见http://www.uroot.com/archives/1059

UDF永久生效现在是只能修改源代码.不过可以变通一下处理也可以实现.

在HIVE_HOME的bin目录下新建一个.hiverc的文件,把写好的udf的注册语句写在这里就可以类似HIVE内置的用法一样用

原理是,在运行./hive命令时,同时会加载HIVE_HOME/bin/.hiverc and $HOME/.hiverc作为初始化所需要的文件

在.hiverc文件中加入以下内容:

add jar /run/jar/Avg_test.jar

create temporary function avg_test ‘hive.udaf.Avg‘;

时间: 2024-07-31 00:30:15

hive 用户手册和map参数调整的相关文章

7.1-Move_base 参数调整

Move_base Tuining 前言 应项目需求,我需要调整move_base参数,使得机器人可以精确旋转到指定角度,之前只能实现较为精确的到达(x,y)坐标,现在要求,又要精确又要不震荡地达到目标要求. 需要全面了解局部避障算法,才能正确地调整参数. 全面定制ros_navigation_stack基本能够完成机器人导航要求 Move_base Tuining前言参考任务要求学习记录基本调参指南确定激光或者声纳的完整性里程计的有效性定位的有效性代价地图局部规划器局部规划器原理各模块参数代价

技巧-Linux内核参数调整办法

技巧 -Linux内核参数调整办法 ulimit设置 ulimit -n 要调整为100000甚至更大. 命令行下执行 ulimit -n 100000即可修改.如果不能修改,需要设置 /etc/security/limits.conf,加入 * soft nofile 262140 * hard nofile 262140 root soft nofile 262140 root hard nofile 262140 * soft core unlimited * hard core unli

BIEE11g BI_server Jvm参数调整

1.找到user_projects\domains\bifoundation_domain\bin目录 2.复制startWeblogic.sh为新的文件startAdminWeblogic.sh,复制setDomainEnv.sh到setAdminDomainEnv.sh,复制setOBIDomainEnv.sh到setAdminOBIDomain.sh 3.修改startAdminWeblogic.sh 我的机器是windows调用的脚本都是cmd的,linux下面肯定都是.sh文件,把调用

Linux 内核参数 和 Oracle相关参数调整

Linux 内核参数 和 Oracle相关参数调整 分类: Oracle Basic Knowledge2009-10-14 12:23 9648人阅读 评论(0) 收藏 举报 oraclelinuxsemaphorearraysdatabaseoracle10g Linux 内核参数的大小和Oracle 有很大的关闭,比如ORA-27102的错误,就是因为内核参数的大小不当造成.具体参考Blog: Upon startup of Linux database get ORA-27102: ou

#调整随机森林的参数(调整max_features,结果未见明显差异)

#调整随机森林的参数(调整max_features,结果未见明显差异) from sklearn import datasets X, y = datasets.make_classification(n_samples=10000,n_features=20,n_informative=15,flip_y=.5, weights=[.2, .8]) import numpy as np training = np.random.choice([True, False], p=[.8, .2],

Galera集群server.cnf参数调整--Innodb存储引擎内存相关参数(一)

在innodb引擎中,内存的组成主要有三部分:缓冲池(buffer pool),重做日志缓存(redo log buffer),额外的内存池(additional memory pool). [参数1:innodb_buffer_pool_size] 主要用来缓存innodb表的索引.数据,是插入数据时的缓冲. /*Innodb存储引擎的缓存机制和Myisam最大的区别就在于他不紧可以缓存索引,还会缓存实际的数据.所以相同的物理环境,Innodb对磁盘IO的优化会优于Myisam.*/ 当系统上

Sysctl命令及linux内核参数调整

一.Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. 命令格式: sysctl [-n] [-e] -w variable=value sysctl [-n] [-e] -p (default /etc/sysctl.conf) sysctl [-n] [-e] –a 常用参数的意义: -w  临时改变某个指定参数的值,如 # sysctl -w net.ipv4.ip_forward=1 -a  

hive优化----控制hive中的map数

1. 通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改): 2. 举例:a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数b) 假设input目录下有3个文件a,b,c,大小分别为1

性能测试 -- 服务器参数调整

1)cpu负载均衡 安装: yum install irqbalance 使用: service irqbalance {start|stop|status|restart} 2)ulimit -u 3)查看操作系统版本 cat /proc/version cat /etc/issue cat /etc/redhat-release 4)查看网卡配置 cat /proc/net/bonding/bond0 mii-tool -v 5)优化Sysctl,提升服务器性能 参考http://blog.