【发布时间】:2013-07-01 11:18:14
【问题描述】:
当查询被触发时,客户端如何联系 impalad 守护进程? 当客户端触发必须由 impala 执行的查询时,后台究竟会发生什么?
【问题讨论】:
当查询被触发时,客户端如何联系 impalad 守护进程? 当客户端触发必须由 impala 执行的查询时,后台究竟会发生什么?
【问题讨论】:
以impala-shell 为例,它是一个ImpalaShell Python 类扩展cmd.Cmd。用户将:
1) connect ip:port 在 shell 中,它将调用 do_connect(..) 并通过 Thrift 连接到 Impala 后端。一个节俭客户端被创建为self.imp_service = ImpalaService.Client(protocol)
2) select xxx from table... 在 shell 中,它将调用 do_select(...) 和 self.imp_service.query(query) 将被调用,这是一个 thrfit rpc。
3) 然后在 Impalad 端由void ImpalaServer::query(QueryHandle&, const Query&) 执行 rpc 查询:
rpc 调用对每个片段的每个主机并行发出。
父片段将等到子片段完成。
4) 当所有片段都完成后,屏幕上会显示fetch() 后面的数据,这是客户端的 thrift 调用。
【讨论】: