Michael Ho created IMPALA-7049:
----------------------------------
Summary: Scan node reservation calculation seems off
Key: IMPALA-7049
URL: https://issues.apache.org/jira/browse/IMPALA-7049
Project: IMPALA
Issue Type: Bug
Components: Backend
Affects Versions: Impala 2.13.0, Impala 3.1.0
Reporter: Michael Ho
Assignee: Tim Armstrong
Running the query TPC-DS Q77a with a memory limit, we ran into the error *HDFS
scan min reservation 0 must be >= min buffer size 8192*:
{noformat}
Query Type: QUERY
Query State: EXCEPTION
Query Status: HDFS scan min reservation 0 must be >= min buffer size 8192
Sql Statement: /* Mem: 2375 MB. Coordinator: machine. */
-- RESULT MISMATCH FROM ORIGINAL
-- FIXED. TAKE ACTUAL RESULT AS EXPECTED
with ss as
(select s_store_sk,
sum(ss_ext_sales_price) as sales,
sum(ss_net_profit) as profit
from store_sales,
date_dim,
store
where ss_sold_date_sk = d_date_sk
and cast(d_date as timestamp) between cast('2000-08-23' as timestamp)
and (cast('2000-08-23' as timestamp) + interval 30 days)
and ss_store_sk = s_store_sk
group by s_store_sk)
,
sr as
(select s_store_sk,
sum(sr_return_amt) as return_amt,
sum(sr_net_loss) as profit_loss
from store_returns,
date_dim,
store
where sr_returned_date_sk = d_date_sk
and cast(d_date as timestamp) between cast('2000-08-23' as timestamp)
and (cast('2000-08-23' as timestamp) + interval 30 days)
and sr_store_sk = s_store_sk
group by s_store_sk),
cs as
(select cs_call_center_sk,
sum(cs_ext_sales_price) as sales,
sum(cs_net_profit) as profit
from catalog_sales,
date_dim
where cs_sold_date_sk = d_date_sk
and cast(d_date as timestamp) between cast('2000-08-23' as timestamp)
and (cast('2000-08-23' as timestamp) + interval 30 days)
group by cs_call_center_sk
),
cr as
(select cr_call_center_sk,
sum(cr_return_amount) as return_amt,
sum(cr_net_loss) as profit_loss
from catalog_returns,
date_dim
where cr_returned_date_sk = d_date_sk
and cast(d_date as timestamp) between cast('2000-08-23' as timestamp)
and (cast('2000-08-23' as timestamp) + interval 30 days)
group by cr_call_center_sk
),
ws as
( select wp_web_page_sk,
sum(ws_ext_sales_price) as sales,
sum(ws_net_profit) as profit
from web_sales,
date_dim,
web_page
where ws_sold_date_sk = d_date_sk
and cast(d_date as timestamp) between cast('2000-08-23' as timestamp)
and (cast('2000-08-23' as timestamp) + interval 30 days)
and ws_web_page_sk = wp_web_page_sk
group by wp_web_page_sk),
wr as
(select wp_web_page_sk,
sum(wr_return_amt) as return_amt,
sum(wr_net_loss) as profit_loss
from web_returns,
date_dim,
web_page
where wr_returned_date_sk = d_date_sk
and cast(d_date as timestamp) between cast('2000-08-23' as timestamp)
and (cast('2000-08-23' as timestamp) + interval 30 days)
and wr_web_page_sk = wp_web_page_sk
group by wp_web_page_sk)
,
results as
(select channel
, id
, sum(sales) as sales
, sum(return_amt) as return_amt
, sum(profit) as profit
from
(select 'store channel' as channel
, ss.s_store_sk as id
, sales
, coalesce(return_amt, 0) as return_amt
, (profit - coalesce(profit_loss,0)) as profit
from ss left join sr
on ss.s_store_sk = sr.s_store_sk
union all
select 'catalog channel' as channel
, cs_call_center_sk as id
, sales
, return_amt
, (profit - profit_loss) as profit
from cs
, cr
union all
select 'web channel' as channel
, ws.wp_web_page_sk as id
, sales
, coalesce(return_amt, 0) return_amt
, (profit - coalesce(profit_loss,0)) as profit
from ws left join wr
on ws.wp_web_page_sk = wr.wp_web_page_sk
) x
group by channel, id )
select *
from (
select channel, id, sales, return_amt, profit from results
union
select channel, NULL AS id, sum(sales) as sales, sum(return_amt) as
return_amt, sum(profit) as profit from results group by channel
union
select NULL AS channel, NULL AS id, sum(sales) as sales, sum(return_amt) as
return_amt, sum(profit) as profit from results
) foo
order by channel, id
limit 100;
Coordinator: machine
Query Options (set by configuration): ABORT_ON_ERROR=1,MEM_LIMIT=2490368000
Query Options (set by configuration and planner):
ABORT_ON_ERROR=1,MEM_LIMIT=2490368000,MT_DOP=0
Plan:
{noformat}
According to the code, the reservation for the scan node is supposed to be
computed correctly in the FE but this doesn't appear to be the case
{noformat}
// Check if reservation was enough to allocate at least one buffer. The
// reservation calculation in HdfsScanNode.java should guarantee this.
// Hitting this error indicates a misconfiguration or bug.
int64_t min_buffer_size =
ExecEnv::GetInstance()->disk_io_mgr()->min_buffer_size();
if (scan_range_params_->size() > 0
&& resource_profile_.min_reservation < min_buffer_size) {
return Status(TErrorCode::INTERNAL_ERROR,
Substitute("HDFS scan min reservation $0 must be >= min buffer size $1",
resource_profile_.min_reservation, min_buffer_size));
}
{noformat}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)