HAR技术之三Hive上怎么用 - huangyuefeng/study GitHub Wiki
HAR技术之三Hive上怎么用
虽说hive和hadoop上的har是同样的技术,用起来还是有些不同哦。 相对来说,Hive上使用复杂一点。
首先启动beeline或hive,设置
set hive.archive.enabled= true;
set hive.archive.har.parentdir.settable= true;
set har.partfile.size=1099511627776;
hive.archive.enabled用来控制归档是否可用,
hive.archive.har.parentdir.settable通知Hive在创建归档时是否可以设置父目录,这个配置主要是因为在比较老的hadoop版本(2011之前),-p选项是不可用的,因此这个选项需要设置为false。
har.partfile.size 控制需要归档文件的大小,使用了这个参数后这个归档将会包含 size_of_partition/har.partfile.size(四舍五入)个文件,这个值越大则文件数越少,也因为文件数少,所以归档时的reduce数目越小,需要更多的归档时间。
命令模版
ALTER TABLE table_name ARCHIVE PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
例子
ALTER TABLE srcpart ARCHIVE PARTITION(ds='2008-04-08', hr='12')
也可以对已归档的分区恢复为原文件。
ALTER TABLE srcpart UNARCHIVE PARTITION(ds='2008-04-08', hr='12')
在一些hadoop版本中,HAR有少量的bug存在,这可能导致数据丢失或者其他错误,具体可参考文献2, hive中使用归档时需要注意,归档的分区不能够INSERT OVERWRITE,必须先unarchive,若是同时有两个操作尝试归档同样的分区,可能会发生异常(需要实现并发支持)。
记录笔者遇到的糟心问题,
上述的方法,只适用于内部表,那么,外部表怎么办?
两条路,一条是alter时候,指定har://开头的url。 这时候har文件就自己去生成,容易遇到权限问题。
特别是hive开了sentry的情况。
另一条,直接把该表改为内部表,完成存档后,再改为外部表。
alter table table_name set TBLPROPERTIES('EXTERNAL'='TRUE');//内部表转外部表
alter table table_name set TBLPROPERTIES('EXTERNAL'='FALSE');//外部表转内部表