如何在shell脚本中判断hive已经执行完毕

如何在shell脚本中判断hive已经执行完毕,第1张

hive sql && mapreduce job

你的采纳是我前进的动力,记得好评和采纳,答题不易,互相帮助,

手机提问的朋友在客户端右上角评价点满意即可

如果你认可我的回答,请及时点击采纳为满意回答按钮!

一张Hive计算完成后,开发者会希望知道计算结果是否符合预期,比如是否有脏数据,是否数据量符合预期。这里就有两个问题,一个是校验什么,另一个是怎么校验。

Hive表的校验自然是跑SQL最方便,每当Hive表更新完要执行SQL校验,需要考虑两个问题

基于上述考虑,就要选择既省资源,又快的计算引擎,MapReduce可直接排除,备选方案是Spark SQL和Presto。

回过头看校验要执行的SQL,大部分是简单SQL,例如count(), min/max等,Presto在这种简单查询展示出了非常优异的性能,无论消耗资源,还是执行时间都很好。实际测试中,一张2亿行的表查询最新的总行数,执行select count() from table_name,只消耗了24 CPU-Second,执行时长也是2秒左右,消耗的资源和运行时长都可忽略不计。Presto跑的快的原因有很多,不用去yarn上申请资源,对orc文件查询做了很多优化,简单查询会直接基于orc的meta做计算,具体原因就不在赘述。

相同的SQL,Spark SQL一般的执行时间都要多很多,消耗的资源也会更多。不过两着对资源的计算方法肯定是不一样的,所以不能完全保证Presto更省资源,此处没有严格考证。

还有一些复杂的SQL,比如大表的字段唯一性校验,Presto很容易出现内存不足的异常,这时候可以考虑切换到Spark SQL来执行,至少保证能运行成功。

我们记录了每个枚举值,在表中出现的次数,每天记录一个值,久而久之可以形成变化趋势,可以发现某些业务细节的波动,发现异常的用户行为。

还尝试了对关键业务指标做了统计值校验,比如N个商品销量的最大最小、中位数、90%位数、平均数、标准差等,同样是每天采集并形成变化趋势,可以发现异常业务情况,Presto自带了这些算法。

在数仓小组内部,给重要表加上规则,再也不用担心报表出现重大问题,而一无所知。

功能上线后有冷启动的问题,用户不了解,也不能感知产品价值,所以很少有用户主动配置。于是我们通过默认的表级行数波动校验,采集每次表更新完的最新行数,发现异常波动,帮助用户发现问题,逐渐吸引用户使用。偶尔还会有用户惊叹,这么隐蔽的问题也能被发现,这就体现了业务监控的价值。随后我们通过培训、开发者访谈等方式,逐步推广。

后续有不少开发者,纯粹为了执行校验规则,发现业务异常数据,而把业务数据导入Hive中。也有DBA来查看采集到的数据量波动,来观察DB的数据量增长情况。

数据质量是个很大话题,除了数据准确性,至少还包括数据产出及时性、表间的数据一致性,用户甚至会把任何的数据看不懂都认为是数据质量问题,有些可能只是理解上的偏差。给Hive表配置了数据质量校验规则,只是一定程度保证了准确性,要真正解决数据质量问题,还需要更多技术和规范的努力。

线上Hive任务偶尔出现hang住的现象

经排查确认是触发了Hive的bug, 该bug在Hive-10569( >

摘要: Hive , Shell

Hive复制表包括两种

对于非分区表如果要完全复制一张表到另一张表,直接使用CREATE TABLE AS语句即可,比如以下复制一个表的两个字段以及字段的值到另一个表

对于分区表如果使用CREATE TABLE AS语句则分区失效,但是可以执行不报错,且字段和数据都能完全复制

以上有一张分区表,以dt字段作为分区,使用CREATE TABLE AS进行全表复制

检查表结构和表数据量都没有问题

检查分区,报错此表不是分区表,is not a partitioned table,但是在表结构中确实存在本来的分区字段dt,此时dt字段的分区功能失效,但是数据保留住了

分区表的全称复制且带有分区的 *** 作方法需要使用 LIKE 语句复制到分区信息,具体步骤如下

第一步复制得到一张空表,具有原表的表结构和分区信息

下一步使用hdfs命令 *** 作将原表在hdfs的存储路径复制到新表的路径, 一张表的存储路径是一个目录,该目录下还存在子目录,每一个子目录代表一个分区,在分区目录下就是数据文件,数据文件是part开头格式,由Hive的分桶策略将同一分区下的数据进行划分

复制语句采用 通配符将原表目录下所有文件复制到新表路径下,查看新表的hdfs路径下数据文件

此时新表虽然对应数仓目录下有数据文件,但是在Hive客户端还是查不到数据为空表, 因为一个个数据分区不存在在新表的元数据中,数据是以分区目录为单位聚合的,新表目前查不到一个分区则自然查不到数据

下一步修复表的分区元数据,使用 MSCK REPAIR TABLE 命令

由输出的执行过程可见MSCK REPAIR TABLE命令先检查了表的分区信息是否存在在元数据,然后对不存在的分区信息进行修复,修复后该表即可正常使用

MSCK REPAIR TABLE 的作用是 只需要只用这一个命令就可以 快速 , 自动化 地添加(修复)全部分区 ,在Hive中如果先建分区表,并且以数据拷贝到对应HDFS目录这种方式作为初始化,需要手动添加分区才能使用,如果分区过多,使用 ALTER TABLE ADD PARTITION 极为不变,下面做一下测试看ALTER TABLE ADD PARTITION是否也能完成分区表的完全复制

下一步采用手动添加1个分区dt='20201209'

验证了手动分区能够完成, MSCK REPAIR TABLE只是自动化的扫描一遍数仓目录下的分区信息(dt='20201209' 到 dt='20210317') ,如果编写一个Shell脚本也能实现如下

运行这个Shell脚本后能达到同样的效果,但是这个脚本执行了15分钟,需要频繁启动和关闭Hive进程

配置hive时出现不能加载自己修改的hive-sitexml等配置文件的问题。发现它总是加载默认的配置文件。

解决:

hadoop的配置文件hadoop-envsh中加上export HADOOP_CLASSPATH=$HIVE_HOVE/conf:$HADOOP_CLASSPATH

还有一个问题:运行其他hadoop子项目时总会出现找不到类文件,必须把相关jar包拷贝到hadoop的lib目录下,导致其lib目录会越来越大。

至今不知道怎样将其他jar包加入到classpath中,网上说用export HADOOP_CLASSPATH=“”,但是好像不行

hive --config /root/etc/hive(注:/root/etc/hive是指hive-sitexml的存放目录)

HiveQL以分号结束。可以跨行。

在hive的shell上可以使用dfs命令执行HDFS文件 *** 作。

dfs -ls /user/hive/warehouse;

hive语句必须以分号“;”结束。

不支持更新,索引和事务。

表名,列名不区分大小写。

在hive的shell上可以使用dfs命令执行HDFS文件的 *** 作。>>dfs -ls /user/hive/warehouse/;

查看和设置临时变量:>>set fsdefaultname[=hdfs://zhaoxiang:9000] ;

导入jar包: >>add jar hivejarjar;

创建函数: >>create temporary function udfTest as 'comcstoreudfExample';

在pig中使用UDF,先用register语句注册jar文件,之后可以通过完全的java类名调用,或者用define语句为UDFding 指定一个名称:

register pigjarjar;

define UPPER orgpigjarstringUPPER();

B = foreach a generate UPPER($0);

可以在本地命令行运行hive的shell:

$ hive -e 'select from userinfo' (执行hiveQL语句)

$ hive --config /hive-090/conf (重新载入新的配置文件)

$ hive --service hiveserver 50000(启动服务)

create table cite(citing int, cited int) row format delimited fields terminated by ',' stored as textfile; //sequencefle

load data (local) inpath 'cite75_99txt' overwrite into table cite;//若不加local则默认为HDFS路径

select from cite limit 10;

show tables;

describe cite;

select count(1)/count( ) from cite; //count(1)相当于SQL中的count( )

create table cite_count (cited int, count int);

insert overwrite table cite_count select cited , count(citing) from cite group by cited;

select from cite_count where count > 10 limit 10;

drop table cite_count;

create table page_view(viewTime int, userid bigint,

page_url string, referrer_url string,

ip string comment 'ip address of user')

comment 'this id the page view table'

partitioned by (dt string, country string)//注意table中的列不能和partition中的列重合

clustered by (userid) into 32 buckets //桶

row format delimited

fields terminated by ','

collection items terminated by '\002'

map keys terminated by '\003'

lines terminated by '\n'

stored as textfile;

//取样

select avg(viewTime) from page_view tablesample(bucket 1 out of 3 [on id]);

//创建外部表,指定目录位置,删除外部表时会删除元数据,表中的数据需手动删除

create external table page_view(viewTime int, userid bigint,

page_url string, referrer_url string,

ip string comment 'ip address of user')

location 'path/to/existing/table/in/HDFS';

//修改表

alter table page_view rename to pv;

alter table pv add columns (newcol string);

alter table pv drop partition (dt='2009-09-01');

show tables 'page_';

load data local inpath 'page_viewtxt'

overwrite into table page_view

partition (dt='2009-09-01',country='US');

在hive的shell上执行unix命令:命令前加感叹号(!),命令尾加分号(;)

hive> ! ls ;

hive> ! head hive_result;

//执行查询:

insert overwrite table query-result; //eg: insert overwrite table query_result select from page_view where country='US';

insert overwrite (local) directory '/hdfs-dir(local-dir)/query_result' query;

select country , count(distinct userid) from page_view group by countey;

//子查询,只能在from子句中出现子查询

select teacher, max(class-num) from

(select teacher, count(classname) as class-num from classinfo group by teacher)subquery

group by teacher;

//连接

select pv , choice , ffriends from page_view pv

join user u on (pvuserid=uid)

join friends-list f on (uid=fuid);

//多表插入

create table mutil1 as select id, name from userinfo;

create table mutil2 like mutil1;

from userinfo insert overwrite table mutil1 select id, name

insert overwrite table mutil2 select count(distint id),name group by name;

//创建视图

create view teacher_classnum as select teacher, count(classname) from classinfo group by teacher;

hive在客户端除了直接执行hive命令连接外,还可以利用beeline连接,常用到的就是以下三种:

1beeline直接连接:

beeline -u jdbc:hive2://192168188100:10000 -n wind(用户名)

2beeline的参数化连接

hiveserver2_url="jdbc:hive2://192168188100:10000 -n wind(用户名)"

beeline -u  ${hiveserver2_url} -f /home/hadoop/app/shell/hive/ --hivevar v_data=value;

3beeline的高可用性连接

beeline -u "jdbc:hive2://192168188100:2181,192168188101:2181,192168188102:2181,192168188103:2181/;serviceDiscoveryMode=zookeeper;zookeeperNmaespace=hiveserver2  -n wind(用户名)"

4beeline的有权限的高可用连接

beeline -u "jdbc:hive2://dn02hadoopcn:2181,dn01hadoopcn:2181,dn03hadoopcn:2181/devportaldemo;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2;auth=kerberos;principal=hive/dn04hadoopcn@HADOOPCNmapreducejobqueuename=0122a8ed-08e0-4945-acb7-d04f910b196c"

最近遇到的问题,由于hive语句中字段包含特殊符号 id` ,没有问题。

但是因为我要在shell里循环多个日期跑,使用hive -e "语句"时,却报错,最后排查是因为hive -e后面接双引号的话,会导致反引号失效,导致shell认为$id是参数。

解决方式:需要用hive -e '语句'来执行,并且将语句中本来判断条件的单引号换为双引号,需要传参的地方,用双引号+单引号参数即"'参数'"的形式。

以上就是关于如何在shell脚本中判断hive已经执行完毕全部的内容,包括:如何在shell脚本中判断hive已经执行完毕、Hive表数据质量校验的设计与开发、记一次Hive任务hang住的问题(2)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9696022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存