Hive Fetch Task

show tables; metastore->>mysql; 
select * from bi.dpods_dp_unsubscribe where hp_statdate = '2015-03-22' limit 10; -》不起job 
select dpid from bi.dpods_dp_unsubscribe where hp_statdate = '2015-03-22' limit 10; ->起job,需要resource manager

如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务,如下: 我们都知道,启用MapReduce Job是会消耗系统开销的。对于这个问题,从Hive0.10.0版本开始,对于简单的不需要聚合的类似(SELECT columns from table_name)不需要起MapReduce job,直接通过Fetch task获取数据,可以通过设置如下属性实现:

set hive.fetch.task.conversion=more; // 简单查询就不走map/reduce了,直接读取hdfs文件进行filter过滤。但是有数据量大时要等很长时间,且没有任何返回。
set hive.fetch.task.conversion=minimal; // 任何简单select都会走map/reduce;

开启了Fetch任务,所以对于上述简单的列查询不在启用MapReduce job。上面的两种方法都可以开启了Fetch任务,但是都是临时起作用的;如果你想一直启用这个功能,可以在${HIVE_HOME}/conf/hive-site.xml里面加入以下配置: 

<property>
  <name>hive.fetch.task.conversion</name>
  <value>more</value>
  <description>
    Some select queries can be converted to single FETCH task 
    minimizing latency.Currently the query should be single 
    sourced not having any subquery and should not have
    any aggregations or distincts (which incurrs RS), 
    lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)
  </description>
</property>

meta store查询:

show tables;
desc database finance;

PS:

发现hive就可以启动起来了,其实我们只需要把hive理解为几个部分即可:metastore、thrift server和剩下的hive,这几个部分都是可以分开部署的,放在不同的服务器上,这样的设计增加了hive的ha和可扩展性 但是分开部署会牺牲很大的可维护性,也增加了运维的复杂性,所以一般还是把元数据留着mysql中其他的部分放在一个jvm中。 hive也是个cs结构的东西 thrift是负责client和server通信的。 


你可能感兴趣的:(Hive Fetch Task)