标签归档:hive

Yarn集群中hive bug导致数据丢失问题排查

5月1日凌晨线上发生了一个诡异的问题:有个hive的job运行状态显示成功,但是数据少了很多,本来应该输出200个文件3亿多数据,但是结果只有一个part文件180多万数据产出!还好后续的流程检查出了这个巨大的数据差异,不然后果很严重。

ps: 当前集群采用的hadoop版本为hadoop-2.2.0-cdh5.0.0-beta-1,Hive版本为0.11,集群规模250台左右。

看hive job的log,一切正常:

看jobhistory页面,这个job也显示状态是成功的,计数器显示输出了371473512条数据。

但是为什么最终的输出目录只有一个文件呢?

查看hdfs-audit.log文件,发现除了00078_1000这个文件外,其他199个文件都有delete操作存在:

2014-05-01 01:52:16,292 INFO FSNamesystem.audit: allowed=true ugi=admin (auth:SIMPLE) ip=/10.246.14.72 cmd=delete src=/tmp/hive-admin/hive_2014-05-01_01-46-44_962_6776205249541775191/_tmp.-ext-10000.intermediate/000198_1000 dst=null perm=null
2014-05-01 01:52:16,292 INFO FSNamesystem.audit: allowed=true ugi=admin (auth:SIMPLE) ip=/10.246.14.72 cmd=delete src=/tmp/hive-admin/hive_2014-05-01_01-46-44_962_6776205249541775191/_tmp.-ext-10000.intermediate/000199_1000 dst=null perm=null
2014-05-01 01:52:16,295 INFO FSNamesystem.audit: allowed=true ugi=admin (auth:SIMPLE) ip=/10.246.14.72 cmd=delete src=/tmp/hive-admin/hive_2014-05-01_01-46-44_962_6776205249541775191/_task_tmp.-ext-10000 dst=null perm=null
2014-05-01 01:52:16,445 INFO FSNamesystem.audit: allowed=true ugi=admin … --> 阅读全文

记录Hive升级0.10遇到的多表full out join等问题和解决

记录下最近Hive升级0.10遇到的一些问题:

由于Hadoop集群升级了Yarn即hadoop-2.0.0-cdh4.3.0,之前的hive 0.8.1版本已经不能使用了。于是将Hive升级到hive-0.10.0-cdh4.3.0版,期间遇到了一些问题,记录在此。

1. 多表(32张表)的full out join任务被拆分成了很多个子任务

这样每个子任务串行,导致整个任务的执行时间很长。主要的原因是在处理outer join时,hive里面用的short变量来保存的别名”aliases”,观察到的现象是5张以上的表做full out join会拆成多个任务完成。hive邮件组上有过三次讨论:123

The problem is mixture of issues (HIVE-3411, HIVE-4209, HIVE-4212,
HIVE-3464) and still not completely fixed even in trunk.

最终采取的方案是,参考邮件组中提到的patch,将用到short的地方改为long。估计官方也会修复这个问题的。

2. 发现 mapreduce.map.tasks 设置的map个数无效
升级后发现mapreduce.map.tasks这个参数无效,无法用来控制map个数。原因是 hive.input.format 的值默认设为org.apache.hadoop.hive.ql.io.CombineHiveInputFormat,这时候,可以只能通过设置mapreduce.input.fileinputformat.split.maxsize=文件大小/期望map个数 来控制map个数。

另一种方法是使用 org.apache.hadoop.hive.ql.io.HiveInputFormat,这样设置mapreduce.map.tasks就能生效。… --> 阅读全文

hadoop mapreduce和hive中使用SequeceFile+lzo格式数据

一.  hadoop中常见的压缩和解压数据格式

随着处理的数据量越来越大,在HDFS中存储压缩数据,不仅能节省集群的存储空间,而且可以减少磁盘io。对于跨集群数据传输来说,更能节约网络带宽。常见的用于hadoop的压缩文件格式有:

压缩格式 工具 算法 文件扩展名 多文件 可分割性
DEFLATE* DEFLATE .deflate
Gzip gzip DEFLATE .gz
ZIP zip DEFLATE .zip 是,在文件范围内
bzip2 bzip2 bzip2 .bz2
LZO lzop LZO .lzo

gzip和ZIP是比较通用的压缩方式,在空间和时间的处理上比较平衡。

bzip2的压缩比gzip或ZIP更有效,但是速度较慢,会使job的瓶颈转移到CPU上。

lzo的压缩和解压速度比gzip或ZIP更快,但是压缩效率偏低。

总的来说,压缩比:bzip2 gzip lzo,速度:lzo gzip bzip2

除了采用这几种压缩格式,SequeceFile也是一种比较好的选择。SequeceFile是Hadoop API提供的一种二进制文件支持。这种二进制文件直接将对序列化到文件中。一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中。这种文件格式有以下好处:… --> 阅读全文

Hive的安装和配置详解

一直使用别人装好的Hive,想自己安装个Hive,在网上找了很多配置文档,都写的太简单了,于是自己摸索了下,记录在这里。

1. 安装Hive之前必须先安装好Hadoop,单机的或者集群都可以。

因为Hive是基于hadoop的,它是将用户编写的类SQL语句转化为可以在hadoop上执行的mapreduce程序,要先保证hadoop可以正常使用。

2. 到apache的网站下载Hive的压缩包,http://hive.apache.org/releases.html

我下载的是 hive-0.7.0-bin.tar.gz , 解压:

3. 在.bashrc文件中配置Hive和Hadoop的路径

4. 在$HIVE_HOME/conf目录下,新建一个hive-site.xml,配置Hive元数据的存储方式,默认是采用一个轻量级的内存数据库derby。

采用derby数据库的hive-site.xml文件如下:

如果在Hive执行的时候,遇到“ERROR exec.DDLTask: FAILED: Error in metadata: java.lang.IllegalArgumentException: URI:  does not have a scheme”这种错误就可能是$HIVE_HOME,$HIVE_CONF_DIR,$HIVE_LIB配置不对,导致hive找不到元数据的配置文件或者找不到元数据的数据库导致的。

现在我们执行$HIVE_HOME/bin/hive后showtables命令,会提示“java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error connecting to server localhost on port 1527 with message Connection refused”。这是因为我们的derby数据库没有安装,服务没有启动,1527是derby的默认端口。

5. 安装derby数据库

Hive默认是采用derby数据库来存放元数据信息,可以发现在$HIVE_HOME/lib下有derby.jar和derbyclient.jar。

从 http://db.apache.org/derby/releases/release-10.7.1.1.html 下载 … --> 阅读全文