Search in sources :

Example 6 with OperatorContext

use of com.facebook.presto.operator.OperatorContext in project presto by prestodb.

the class AbstractOperatorBenchmark method createTableScanOperator.

protected final OperatorFactory createTableScanOperator(int operatorId, PlanNodeId planNodeId, String tableName, String... columnNames) {
    checkArgument(session.getCatalog().isPresent(), "catalog not set");
    checkArgument(session.getSchema().isPresent(), "schema not set");
    // look up the table
    Metadata metadata = localQueryRunner.getMetadata();
    QualifiedObjectName qualifiedTableName = new QualifiedObjectName(session.getCatalog().get(), session.getSchema().get(), tableName);
    TableHandle tableHandle = metadata.getTableHandle(session, qualifiedTableName).orElse(null);
    checkArgument(tableHandle != null, "Table %s does not exist", qualifiedTableName);
    // lookup the columns
    Map<String, ColumnHandle> allColumnHandles = metadata.getColumnHandles(session, tableHandle);
    ImmutableList.Builder<ColumnHandle> columnHandlesBuilder = ImmutableList.builder();
    for (String columnName : columnNames) {
        ColumnHandle columnHandle = allColumnHandles.get(columnName);
        checkArgument(columnHandle != null, "Table %s does not have a column %s", tableName, columnName);
        columnHandlesBuilder.add(columnHandle);
    }
    List<ColumnHandle> columnHandles = columnHandlesBuilder.build();
    Split split = getLocalQuerySplit(session, tableHandle);
    return new OperatorFactory() {

        @Override
        public Operator createOperator(DriverContext driverContext) {
            OperatorContext operatorContext = driverContext.addOperatorContext(operatorId, planNodeId, "BenchmarkSource");
            ConnectorPageSource pageSource = localQueryRunner.getPageSourceManager().createPageSource(session, split, tableHandle.withDynamicFilter(TupleDomain::all), columnHandles);
            return new PageSourceOperator(pageSource, operatorContext);
        }

        @Override
        public void noMoreOperators() {
        }

        @Override
        public OperatorFactory duplicate() {
            throw new UnsupportedOperationException();
        }
    };
}
Also used : ColumnHandle(com.facebook.presto.spi.ColumnHandle) DriverContext(com.facebook.presto.operator.DriverContext) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) ImmutableList(com.google.common.collect.ImmutableList) Metadata(com.facebook.presto.metadata.Metadata) ConnectorPageSource(com.facebook.presto.spi.ConnectorPageSource) QualifiedObjectName(com.facebook.presto.common.QualifiedObjectName) PageSourceOperator(com.facebook.presto.operator.PageSourceOperator) OperatorFactory(com.facebook.presto.operator.OperatorFactory) OperatorContext(com.facebook.presto.operator.OperatorContext) TableHandle(com.facebook.presto.spi.TableHandle) Split(com.facebook.presto.metadata.Split)

Example 7 with OperatorContext

use of com.facebook.presto.operator.OperatorContext in project presto by prestodb.

the class TaskThresholdMemoryRevokingScheduler method revokeHighMemoryTasks.

private synchronized void revokeHighMemoryTasks() {
    if (checkPending.getAndSet(false)) {
        Collection<SqlTask> sqlTasks = requireNonNull(allTasksSupplier.get());
        for (SqlTask task : sqlTasks) {
            Optional<TaskContext> taskContext = task.getTaskContext();
            if (!taskContext.isPresent()) {
                continue;
            }
            long currentTaskRevocableMemory = taskContext.get().getTaskMemoryContext().getRevocableMemory();
            if (currentTaskRevocableMemory < maxRevocableMemoryPerTask) {
                continue;
            }
            AtomicLong remainingBytesToRevokeAtomic = new AtomicLong(currentTaskRevocableMemory - maxRevocableMemoryPerTask);
            taskContext.get().accept(new VoidTraversingQueryContextVisitor<AtomicLong>() {

                @Override
                public Void visitOperatorContext(OperatorContext operatorContext, AtomicLong remainingBytesToRevoke) {
                    if (remainingBytesToRevoke.get() > 0) {
                        long revokedBytes = operatorContext.requestMemoryRevoking();
                        if (revokedBytes > 0) {
                            remainingBytesToRevoke.addAndGet(-revokedBytes);
                            log.debug("taskId=%s: requested revoking %s; remaining %s", task.getTaskId(), revokedBytes, remainingBytesToRevoke.get());
                        }
                    }
                    return null;
                }
            }, remainingBytesToRevokeAtomic);
        }
    }
}
Also used : AtomicLong(java.util.concurrent.atomic.AtomicLong) TaskContext(com.facebook.presto.operator.TaskContext) OperatorContext(com.facebook.presto.operator.OperatorContext)

Example 8 with OperatorContext

use of com.facebook.presto.operator.OperatorContext in project presto by prestodb.

the class MemoryRevokingScheduler method requestRevoking.

private void requestRevoking(MemoryPoolId memoryPoolId, ArrayList<SqlTask> sqlTasks, long remainingBytesToRevoke) {
    VoidTraversingQueryContextVisitor<AtomicLong> visitor = new VoidTraversingQueryContextVisitor<AtomicLong>() {

        @Override
        public Void visitPipelineContext(PipelineContext pipelineContext, AtomicLong remainingBytesToRevoke) {
            if (remainingBytesToRevoke.get() <= 0) {
                // exit immediately if no work needs to be done
                return null;
            }
            return super.visitPipelineContext(pipelineContext, remainingBytesToRevoke);
        }

        @Override
        public Void visitOperatorContext(OperatorContext operatorContext, AtomicLong remainingBytesToRevoke) {
            if (remainingBytesToRevoke.get() > 0) {
                long revokedBytes = operatorContext.requestMemoryRevoking();
                if (revokedBytes > 0) {
                    remainingBytesToRevoke.addAndGet(-revokedBytes);
                    log.debug("memoryPool=%s: requested revoking %s; remaining %s", memoryPoolId, revokedBytes, remainingBytesToRevoke.get());
                }
            }
            return null;
        }
    };
    // Sort the tasks into their traversal order
    log.debug("Ordering by %s", spillingStrategy);
    sortTasksToTraversalOrder(sqlTasks, spillingStrategy);
    AtomicLong remainingBytesToRevokeAtomic = new AtomicLong(remainingBytesToRevoke);
    for (SqlTask task : sqlTasks) {
        Optional<TaskContext> taskContext = task.getTaskContext();
        if (taskContext.isPresent()) {
            taskContext.get().accept(visitor, remainingBytesToRevokeAtomic);
            if (remainingBytesToRevokeAtomic.get() <= 0) {
                // No further revoking required
                return;
            }
        }
    }
}
Also used : AtomicLong(java.util.concurrent.atomic.AtomicLong) TaskContext(com.facebook.presto.operator.TaskContext) VoidTraversingQueryContextVisitor(com.facebook.presto.memory.VoidTraversingQueryContextVisitor) PipelineContext(com.facebook.presto.operator.PipelineContext) OperatorContext(com.facebook.presto.operator.OperatorContext)

Example 9 with OperatorContext

use of com.facebook.presto.operator.OperatorContext in project presto by prestodb.

the class MemoryRevokingScheduler method revokeQueryMemory.

private void revokeQueryMemory(QueryContext queryContext, long maxTotalMemory) {
    QueryId queryId = queryContext.getQueryId();
    MemoryPool memoryPool = queryContext.getMemoryPool();
    // get a fresh value for queryTotalMemory in case it's changed (e.g. by a previous revocation request)
    long queryTotalMemory = getTotalQueryMemoryReservation(queryId, memoryPool);
    // order tasks by decreasing revocableMemory so that we don't spill more tasks than needed
    SortedMap<Long, TaskContext> queryTaskContextsMap = new TreeMap<>(Comparator.reverseOrder());
    queryContext.getAllTaskContexts().forEach(taskContext -> queryTaskContextsMap.put(taskContext.getTaskMemoryContext().getRevocableMemory(), taskContext));
    AtomicLong remainingBytesToRevoke = new AtomicLong(queryTotalMemory - maxTotalMemory);
    Collection<TaskContext> queryTaskContexts = queryTaskContextsMap.values();
    remainingBytesToRevoke.addAndGet(-MemoryRevokingSchedulerUtils.getMemoryAlreadyBeingRevoked(queryTaskContexts, remainingBytesToRevoke.get()));
    for (TaskContext taskContext : queryTaskContexts) {
        if (remainingBytesToRevoke.get() <= 0) {
            break;
        }
        taskContext.accept(new VoidTraversingQueryContextVisitor<AtomicLong>() {

            @Override
            public Void visitOperatorContext(OperatorContext operatorContext, AtomicLong remainingBytesToRevoke) {
                if (remainingBytesToRevoke.get() > 0) {
                    long revokedBytes = operatorContext.requestMemoryRevoking();
                    if (revokedBytes > 0) {
                        remainingBytesToRevoke.addAndGet(-revokedBytes);
                        log.debug("taskId=%s: requested revoking %s; remaining %s", taskContext.getTaskId(), revokedBytes, remainingBytesToRevoke);
                    }
                }
                return null;
            }
        }, remainingBytesToRevoke);
    }
}
Also used : TaskContext(com.facebook.presto.operator.TaskContext) QueryId(com.facebook.presto.spi.QueryId) TreeMap(java.util.TreeMap) AtomicLong(java.util.concurrent.atomic.AtomicLong) OperatorContext(com.facebook.presto.operator.OperatorContext) AtomicLong(java.util.concurrent.atomic.AtomicLong) MemoryPool(com.facebook.presto.memory.MemoryPool)

Example 10 with OperatorContext

use of com.facebook.presto.operator.OperatorContext in project presto by prestodb.

the class MemoryRevokingSchedulerUtils method getMemoryAlreadyBeingRevoked.

public static long getMemoryAlreadyBeingRevoked(Collection<TaskContext> taskContexts, long targetRevokingLimit) {
    TraversingQueryContextVisitor<Void, Long> visitor = new TraversingQueryContextVisitor<Void, Long>() {

        @Override
        public Long visitOperatorContext(OperatorContext operatorContext, Void context) {
            if (operatorContext.isMemoryRevokingRequested()) {
                return operatorContext.getReservedRevocableBytes();
            }
            return 0L;
        }

        @Override
        public Long mergeResults(List<Long> childrenResults) {
            return childrenResults.stream().mapToLong(i -> i).sum();
        }
    };
    long currentRevoking = 0;
    for (TaskContext taskContext : taskContexts) {
        currentRevoking += taskContext.accept(visitor, null);
        if (currentRevoking > targetRevokingLimit) {
            // Return early, target value exceeded and revoking will not occur
            return currentRevoking;
        }
    }
    return currentRevoking;
}
Also used : TaskContext(com.facebook.presto.operator.TaskContext) List(java.util.List) TraversingQueryContextVisitor(com.facebook.presto.memory.TraversingQueryContextVisitor) Collection(java.util.Collection) OperatorContext(com.facebook.presto.operator.OperatorContext) TaskContext(com.facebook.presto.operator.TaskContext) TraversingQueryContextVisitor(com.facebook.presto.memory.TraversingQueryContextVisitor) OperatorContext(com.facebook.presto.operator.OperatorContext) List(java.util.List)

Aggregations

OperatorContext (com.facebook.presto.operator.OperatorContext)14 TaskContext (com.facebook.presto.operator.TaskContext)10 DriverContext (com.facebook.presto.operator.DriverContext)7 QueryId (com.facebook.presto.spi.QueryId)6 PlanNodeId (com.facebook.presto.spi.plan.PlanNodeId)6 ImmutableList (com.google.common.collect.ImmutableList)5 AtomicLong (java.util.concurrent.atomic.AtomicLong)5 Test (org.testng.annotations.Test)5 DataSize (io.airlift.units.DataSize)4 List (java.util.List)4 Session (com.facebook.presto.Session)3 MemoryPool (com.facebook.presto.memory.MemoryPool)3 QueryContext (com.facebook.presto.memory.QueryContext)3 LocalMemoryContext (com.facebook.presto.memory.context.LocalMemoryContext)3 Split (com.facebook.presto.metadata.Split)3 TestingGcMonitor (com.facebook.airlift.stats.TestingGcMonitor)2 QualifiedObjectName (com.facebook.presto.common.QualifiedObjectName)2 SqlTask.createSqlTask (com.facebook.presto.execution.SqlTask.createSqlTask)2 Metadata (com.facebook.presto.metadata.Metadata)2 PipelineContext (com.facebook.presto.operator.PipelineContext)2