Search in sources :

Example 1 with TaskSource

use of com.facebook.presto.execution.TaskSource in project presto by prestodb.

the class PrestoSparkModule method setup.

@Override
protected void setup(Binder binder) {
    // configs
    // TODO: decouple configuration properties that don't make sense on Spark
    configBinder(binder).bindConfig(NodeSchedulerConfig.class);
    configBinder(binder).bindConfig(SimpleTtlNodeSelectorConfig.class);
    configBinder(binder).bindConfig(QueryManagerConfig.class);
    configBinder(binder).bindConfigGlobalDefaults(QueryManagerConfig.class, PrestoSparkSettingsRequirements::setDefaults);
    configBinder(binder).bindConfig(FeaturesConfig.class);
    configBinder(binder).bindConfigGlobalDefaults(FeaturesConfig.class, PrestoSparkSettingsRequirements::setDefaults);
    configBinder(binder).bindConfig(MemoryManagerConfig.class);
    configBinder(binder).bindConfig(TaskManagerConfig.class);
    configBinder(binder).bindConfig(TransactionManagerConfig.class);
    configBinder(binder).bindConfig(NodeMemoryConfig.class);
    configBinder(binder).bindConfig(WarningCollectorConfig.class);
    configBinder(binder).bindConfig(NodeSpillConfig.class);
    configBinder(binder).bindConfig(CompilerConfig.class);
    configBinder(binder).bindConfig(SqlEnvironmentConfig.class);
    configBinder(binder).bindConfig(StaticFunctionNamespaceStoreConfig.class);
    configBinder(binder).bindConfig(PrestoSparkConfig.class);
    configBinder(binder).bindConfig(TracingConfig.class);
    // json codecs
    jsonCodecBinder(binder).bindJsonCodec(ViewDefinition.class);
    jsonCodecBinder(binder).bindJsonCodec(TaskInfo.class);
    jsonCodecBinder(binder).bindJsonCodec(PrestoSparkTaskDescriptor.class);
    jsonCodecBinder(binder).bindJsonCodec(PlanFragment.class);
    jsonCodecBinder(binder).bindJsonCodec(TaskSource.class);
    jsonCodecBinder(binder).bindJsonCodec(TableCommitContext.class);
    jsonCodecBinder(binder).bindJsonCodec(ExplainAnalyzeContext.class);
    jsonCodecBinder(binder).bindJsonCodec(ExecutionFailureInfo.class);
    jsonCodecBinder(binder).bindJsonCodec(StageInfo.class);
    jsonCodecBinder(binder).bindJsonCodec(OperatorStats.class);
    jsonCodecBinder(binder).bindJsonCodec(QueryInfo.class);
    jsonCodecBinder(binder).bindJsonCodec(PrestoSparkQueryStatusInfo.class);
    jsonCodecBinder(binder).bindJsonCodec(PrestoSparkQueryData.class);
    jsonCodecBinder(binder).bindListJsonCodec(TaskMemoryReservationSummary.class);
    // smile codecs
    smileCodecBinder(binder).bindSmileCodec(TaskSource.class);
    smileCodecBinder(binder).bindSmileCodec(TaskInfo.class);
    PrestoSparkConfig prestoSparkConfig = buildConfigObject(PrestoSparkConfig.class);
    if (prestoSparkConfig.isSmileSerializationEnabled()) {
        binder.bind(new TypeLiteral<Codec<TaskSource>>() {
        }).to(new TypeLiteral<SmileCodec<TaskSource>>() {
        }).in(Scopes.SINGLETON);
        binder.bind(new TypeLiteral<Codec<TaskInfo>>() {
        }).to(new TypeLiteral<SmileCodec<TaskInfo>>() {
        }).in(Scopes.SINGLETON);
    } else {
        binder.bind(new TypeLiteral<Codec<TaskSource>>() {
        }).to(new TypeLiteral<JsonCodec<TaskSource>>() {
        }).in(Scopes.SINGLETON);
        binder.bind(new TypeLiteral<Codec<TaskInfo>>() {
        }).to(new TypeLiteral<JsonCodec<TaskInfo>>() {
        }).in(Scopes.SINGLETON);
    }
    // index manager
    binder.bind(IndexManager.class).in(Scopes.SINGLETON);
    // handle resolver
    binder.install(new HandleJsonModule());
    // plugin manager
    configBinder(binder).bindConfig(PluginManagerConfig.class);
    binder.bind(PluginManager.class).in(Scopes.SINGLETON);
    // catalog manager
    binder.bind(StaticCatalogStore.class).in(Scopes.SINGLETON);
    configBinder(binder).bindConfig(StaticCatalogStoreConfig.class);
    // catalog
    binder.bind(ConnectorManager.class).in(Scopes.SINGLETON);
    binder.bind(CatalogManager.class).in(Scopes.SINGLETON);
    // property managers
    binder.bind(SessionPropertyManager.class).toProvider(PrestoSparkSessionPropertyManagerProvider.class).in(Scopes.SINGLETON);
    binder.bind(SystemSessionProperties.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkSessionProperties.class).in(Scopes.SINGLETON);
    binder.bind(SessionPropertyDefaults.class).in(Scopes.SINGLETON);
    binder.bind(SchemaPropertyManager.class).in(Scopes.SINGLETON);
    binder.bind(TablePropertyManager.class).in(Scopes.SINGLETON);
    binder.bind(ColumnPropertyManager.class).in(Scopes.SINGLETON);
    binder.bind(AnalyzePropertyManager.class).in(Scopes.SINGLETON);
    binder.bind(QuerySessionSupplier.class).in(Scopes.SINGLETON);
    // block encodings
    binder.bind(BlockEncodingManager.class).in(Scopes.SINGLETON);
    binder.bind(BlockEncodingSerde.class).to(BlockEncodingManager.class).in(Scopes.SINGLETON);
    newSetBinder(binder, BlockEncoding.class);
    jsonBinder(binder).addSerializerBinding(Block.class).to(BlockJsonSerde.Serializer.class);
    jsonBinder(binder).addDeserializerBinding(Block.class).to(BlockJsonSerde.Deserializer.class);
    // metadata
    binder.bind(FunctionAndTypeManager.class).in(Scopes.SINGLETON);
    binder.bind(MetadataManager.class).in(Scopes.SINGLETON);
    binder.bind(Metadata.class).to(MetadataManager.class).in(Scopes.SINGLETON);
    binder.bind(StaticFunctionNamespaceStore.class).in(Scopes.SINGLETON);
    // type
    newSetBinder(binder, Type.class);
    binder.bind(TypeManager.class).to(FunctionAndTypeManager.class).in(Scopes.SINGLETON);
    jsonBinder(binder).addDeserializerBinding(Type.class).to(TypeDeserializer.class);
    // PageSorter
    binder.bind(PageSorter.class).to(PagesIndexPageSorter.class).in(Scopes.SINGLETON);
    // PageIndexer
    binder.bind(PagesIndex.Factory.class).to(PagesIndex.DefaultFactory.class);
    binder.bind(PageIndexerFactory.class).to(GroupByHashPageIndexerFactory.class).in(Scopes.SINGLETON);
    // compilers
    binder.bind(JoinFilterFunctionCompiler.class).in(Scopes.SINGLETON);
    newExporter(binder).export(JoinFilterFunctionCompiler.class).withGeneratedName();
    binder.bind(JoinCompiler.class).in(Scopes.SINGLETON);
    newExporter(binder).export(JoinCompiler.class).withGeneratedName();
    binder.bind(OrderingCompiler.class).in(Scopes.SINGLETON);
    newExporter(binder).export(OrderingCompiler.class).withGeneratedName();
    binder.bind(LookupJoinOperators.class).in(Scopes.SINGLETON);
    binder.bind(DomainTranslator.class).to(RowExpressionDomainTranslator.class).in(Scopes.SINGLETON);
    binder.bind(PredicateCompiler.class).to(RowExpressionPredicateCompiler.class).in(Scopes.SINGLETON);
    binder.bind(DeterminismEvaluator.class).to(RowExpressionDeterminismEvaluator.class).in(Scopes.SINGLETON);
    binder.bind(ExpressionCompiler.class).in(Scopes.SINGLETON);
    binder.bind(PageFunctionCompiler.class).in(Scopes.SINGLETON);
    // split manager
    binder.bind(SplitManager.class).in(Scopes.SINGLETON);
    // partitioning provider manager
    binder.bind(PartitioningProviderManager.class).in(Scopes.SINGLETON);
    // executors
    ExecutorService executor = newCachedThreadPool(daemonThreadsNamed("presto-spark-executor-%s"));
    binder.bind(Executor.class).toInstance(executor);
    binder.bind(ExecutorService.class).toInstance(executor);
    binder.bind(ScheduledExecutorService.class).toInstance(newScheduledThreadPool(0, daemonThreadsNamed("presto-spark-scheduled-executor-%s")));
    // task executor
    binder.bind(EmbedVersion.class).in(Scopes.SINGLETON);
    binder.bind(MultilevelSplitQueue.class).in(Scopes.SINGLETON);
    binder.bind(TaskExecutor.class).in(Scopes.SINGLETON);
    // data stream provider
    binder.bind(PageSourceManager.class).in(Scopes.SINGLETON);
    binder.bind(PageSourceProvider.class).to(PageSourceManager.class).in(Scopes.SINGLETON);
    // connector distributed metadata manager
    binder.bind(ConnectorMetadataUpdaterManager.class).in(Scopes.SINGLETON);
    // page sink provider
    binder.bind(PageSinkManager.class).in(Scopes.SINGLETON);
    binder.bind(PageSinkProvider.class).to(PageSinkManager.class).in(Scopes.SINGLETON);
    // query explainer
    binder.bind(QueryExplainer.class).in(Scopes.SINGLETON);
    // parser
    binder.bind(PlanChecker.class).in(Scopes.SINGLETON);
    binder.bind(SqlParser.class).in(Scopes.SINGLETON);
    binder.bind(SqlParserOptions.class).toInstance(sqlParserOptions);
    // planner
    binder.bind(PlanFragmenter.class).in(Scopes.SINGLETON);
    binder.bind(PlanOptimizers.class).in(Scopes.SINGLETON);
    binder.bind(ConnectorPlanOptimizerManager.class).in(Scopes.SINGLETON);
    binder.bind(LocalExecutionPlanner.class).in(Scopes.SINGLETON);
    configBinder(binder).bindConfig(FileFragmentResultCacheConfig.class);
    binder.bind(FragmentCacheStats.class).in(Scopes.SINGLETON);
    binder.bind(IndexJoinLookupStats.class).in(Scopes.SINGLETON);
    binder.bind(QueryIdGenerator.class).in(Scopes.SINGLETON);
    binder.bind(QueryPreparer.class).in(Scopes.SINGLETON);
    jsonBinder(binder).addKeySerializerBinding(VariableReferenceExpression.class).to(VariableReferenceExpressionSerializer.class);
    jsonBinder(binder).addKeyDeserializerBinding(VariableReferenceExpression.class).to(VariableReferenceExpressionDeserializer.class);
    // statistics calculator / cost calculator
    binder.install(new StatsCalculatorModule());
    binder.bind(CostCalculator.class).to(CostCalculatorUsingExchanges.class).in(Scopes.SINGLETON);
    binder.bind(CostCalculator.class).annotatedWith(CostCalculator.EstimatedExchanges.class).to(CostCalculatorWithEstimatedExchanges.class).in(Scopes.SINGLETON);
    binder.bind(CostComparator.class).in(Scopes.SINGLETON);
    // JMX (Do not export to the real MXBean server, as the Presto context may be created multiple times per JVM)
    binder.bind(MBeanServer.class).toInstance(new TestingMBeanServer());
    binder.bind(MBeanExporter.class).in(Scopes.SINGLETON);
    // spill
    binder.bind(SpillerFactory.class).to(GenericSpillerFactory.class).in(Scopes.SINGLETON);
    binder.bind(SingleStreamSpillerFactory.class).to(TempStorageSingleStreamSpillerFactory.class).in(Scopes.SINGLETON);
    binder.bind(PartitioningSpillerFactory.class).to(GenericPartitioningSpillerFactory.class).in(Scopes.SINGLETON);
    binder.bind(SpillerStats.class).in(Scopes.SINGLETON);
    binder.bind(StandaloneSpillerFactory.class).to(TempStorageStandaloneSpillerFactory.class).in(Scopes.SINGLETON);
    // monitoring
    jsonCodecBinder(binder).bindJsonCodec(OperatorInfo.class);
    binder.bind(QueryMonitor.class).in(Scopes.SINGLETON);
    configBinder(binder).bindConfig(QueryMonitorConfig.class);
    binder.bind(SplitMonitor.class).in(Scopes.SINGLETON);
    // Determine the NodeVersion
    ServerConfig serverConfig = buildConfigObject(ServerConfig.class);
    NodeVersion nodeVersion = new NodeVersion(serverConfig.getPrestoVersion());
    binder.bind(NodeVersion.class).toInstance(nodeVersion);
    // Support DDL statements. Helper class binds DDL statements to DataDefinitionTasks
    PrestoDataDefBindingHelper.bindDDLDefinitionTasks(binder);
    // TODO: Decouple node specific system tables
    binder.bind(QueryManager.class).to(PrestoSparkQueryManager.class).in(Scopes.SINGLETON);
    binder.bind(TaskManager.class).to(PrestoSparkTaskManager.class).in(Scopes.SINGLETON);
    binder.install(new SystemConnectorModule());
    // TODO: support explain analyze for Spark
    binder.bind(new TypeLiteral<Optional<ExplainAnalyzeContext>>() {
    }).toInstance(Optional.of(new ExplainAnalyzeContext((queryId) -> {
        throw new UnsupportedOperationException("explain analyze is not supported");
    })));
    // TODO: support CBO, supply real nodes count
    binder.bind(TaskCountEstimator.class).toInstance(new TaskCountEstimator(() -> 1000));
    // TODO: Decouple and remove: required by ConnectorManager
    binder.bind(InternalNodeManager.class).toInstance(new PrestoSparkInternalNodeManager());
    // TODO: Decouple and remove: required by PluginManager
    binder.bind(InternalResourceGroupManager.class).in(Scopes.SINGLETON);
    binder.bind(ResourceGroupManager.class).to(InternalResourceGroupManager.class);
    binder.bind(new TypeLiteral<ResourceGroupManager<?>>() {
    }).to(new TypeLiteral<InternalResourceGroupManager<?>>() {
    });
    binder.bind(LegacyResourceGroupConfigurationManager.class).in(Scopes.SINGLETON);
    binder.bind(ClusterMemoryPoolManager.class).toInstance(((poolId, listener) -> {
    }));
    binder.bind(QueryPrerequisitesManager.class).in(Scopes.SINGLETON);
    binder.bind(ResourceGroupService.class).to(NoopResourceGroupService.class).in(Scopes.SINGLETON);
    binder.bind(NodeTtlFetcherManager.class).to(ThrowingNodeTtlFetcherManager.class).in(Scopes.SINGLETON);
    binder.bind(ClusterTtlProviderManager.class).to(ThrowingClusterTtlProviderManager.class).in(Scopes.SINGLETON);
    // TODO: Decouple and remove: required by SessionPropertyDefaults, PluginManager, InternalResourceGroupManager, ConnectorManager
    configBinder(binder).bindConfig(NodeConfig.class);
    binder.bind(NodeInfo.class).in(Scopes.SINGLETON);
    // TODO: Decouple and remove: required by LocalExecutionPlanner, PlanFragmenter
    binder.bind(NodePartitioningManager.class).to(PrestoSparkNodePartitioningManager.class).in(Scopes.SINGLETON);
    // TODO: Decouple and remove: required by PluginManager
    install(new ServerSecurityModule());
    // spark specific
    binder.bind(SparkProcessType.class).toInstance(sparkProcessType);
    binder.bind(PrestoSparkExecutionExceptionFactory.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkSettingsRequirements.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkQueryPlanner.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkPlanFragmenter.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkRddFactory.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkTaskExecutorFactory.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkQueryExecutionFactory.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkService.class).in(Scopes.SINGLETON);
    binder.bind(PrestoSparkBroadcastTableCacheManager.class).in(Scopes.SINGLETON);
    newSetBinder(binder, PrestoSparkServiceWaitTimeMetrics.class);
    // extra credentials and authenticator for Presto-on-Spark
    newSetBinder(binder, PrestoSparkCredentialsProvider.class);
    newSetBinder(binder, PrestoSparkAuthenticatorProvider.class);
}
Also used : RowExpressionDomainTranslator(com.facebook.presto.sql.relational.RowExpressionDomainTranslator) PrestoSparkBroadcastTableCacheManager(com.facebook.presto.spark.execution.PrestoSparkBroadcastTableCacheManager) PageSourceProvider(com.facebook.presto.split.PageSourceProvider) PluginManagerConfig(com.facebook.presto.server.PluginManagerConfig) QueryExplainer(com.facebook.presto.sql.analyzer.QueryExplainer) ConnectorPlanOptimizerManager(com.facebook.presto.sql.planner.ConnectorPlanOptimizerManager) ColumnPropertyManager(com.facebook.presto.metadata.ColumnPropertyManager) OperatorStats(com.facebook.presto.operator.OperatorStats) StageInfo(com.facebook.presto.execution.StageInfo) InternalNodeManager(com.facebook.presto.metadata.InternalNodeManager) PrestoSparkTaskExecutorFactory(com.facebook.presto.spark.execution.PrestoSparkTaskExecutorFactory) ThrowingNodeTtlFetcherManager(com.facebook.presto.ttl.nodettlfetchermanagers.ThrowingNodeTtlFetcherManager) NoOpFragmentResultCacheManager(com.facebook.presto.operator.NoOpFragmentResultCacheManager) Executors.newScheduledThreadPool(java.util.concurrent.Executors.newScheduledThreadPool) Multibinder.newSetBinder(com.google.inject.multibindings.Multibinder.newSetBinder) QueryManagerConfig(com.facebook.presto.execution.QueryManagerConfig) FragmentResultCacheManager(com.facebook.presto.operator.FragmentResultCacheManager) PageFunctionCompiler(com.facebook.presto.sql.gen.PageFunctionCompiler) TaskCountEstimator(com.facebook.presto.cost.TaskCountEstimator) ServerConfig(com.facebook.presto.server.ServerConfig) ClusterTtlProviderManager(com.facebook.presto.ttl.clusterttlprovidermanagers.ClusterTtlProviderManager) SessionPropertyDefaults(com.facebook.presto.server.SessionPropertyDefaults) EmbedVersion(com.facebook.presto.version.EmbedVersion) PageSinkManager(com.facebook.presto.split.PageSinkManager) GenericPartitioningSpillerFactory(com.facebook.presto.spiller.GenericPartitioningSpillerFactory) StandaloneSpillerFactory(com.facebook.presto.spiller.StandaloneSpillerFactory) DomainTranslator(com.facebook.presto.spi.relation.DomainTranslator) QueryIdGenerator(com.facebook.presto.execution.QueryIdGenerator) FeaturesConfig(com.facebook.presto.sql.analyzer.FeaturesConfig) QueryInfo(com.facebook.presto.execution.QueryInfo) QueryPreparer(com.facebook.presto.execution.QueryPreparer) QuerySessionSupplier(com.facebook.presto.server.QuerySessionSupplier) RowExpressionPredicateCompiler(com.facebook.presto.sql.gen.RowExpressionPredicateCompiler) FragmentCacheStats(com.facebook.presto.operator.FragmentCacheStats) PrestoSparkInternalNodeManager(com.facebook.presto.spark.node.PrestoSparkInternalNodeManager) TaskMemoryReservationSummary(com.facebook.presto.operator.TaskMemoryReservationSummary) InternalResourceGroupManager(com.facebook.presto.execution.resourceGroups.InternalResourceGroupManager) TypeLiteral(com.google.inject.TypeLiteral) SystemSessionProperties(com.facebook.presto.SystemSessionProperties) ViewDefinition(com.facebook.presto.metadata.ViewDefinition) NodeInfo(com.facebook.airlift.node.NodeInfo) TempStorageSingleStreamSpillerFactory(com.facebook.presto.spiller.TempStorageSingleStreamSpillerFactory) VariableReferenceExpressionDeserializer(com.facebook.presto.sql.Serialization.VariableReferenceExpressionDeserializer) ResourceGroupService(com.facebook.presto.resourcemanager.ResourceGroupService) LookupJoinOperators(com.facebook.presto.operator.LookupJoinOperators) NoopResourceGroupService(com.facebook.presto.resourcemanager.NoopResourceGroupService) StaticCatalogStore(com.facebook.presto.metadata.StaticCatalogStore) Binder(com.google.inject.Binder) BlockEncodingManager(com.facebook.presto.common.block.BlockEncodingManager) StaticFunctionNamespaceStoreConfig(com.facebook.presto.metadata.StaticFunctionNamespaceStoreConfig) GenericSpillerFactory(com.facebook.presto.spiller.GenericSpillerFactory) PrestoSparkExecutionExceptionFactory(com.facebook.presto.spark.execution.PrestoSparkExecutionExceptionFactory) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) PageSorter(com.facebook.presto.spi.PageSorter) AnalyzePropertyManager(com.facebook.presto.metadata.AnalyzePropertyManager) IndexJoinLookupStats(com.facebook.presto.operator.index.IndexJoinLookupStats) TransactionManager(com.facebook.presto.transaction.TransactionManager) ResourceGroupManager(com.facebook.presto.execution.resourceGroups.ResourceGroupManager) LegacyResourceGroupConfigurationManager(com.facebook.presto.execution.resourceGroups.LegacyResourceGroupConfigurationManager) TableCommitContext(com.facebook.presto.operator.TableCommitContext) ClusterMemoryPoolManager(com.facebook.presto.spi.memory.ClusterMemoryPoolManager) PrestoSparkTaskManager(com.facebook.presto.spark.node.PrestoSparkTaskManager) Executor(java.util.concurrent.Executor) SystemConnectorModule(com.facebook.presto.connector.system.SystemConnectorModule) ServerSecurityModule(com.facebook.presto.server.security.ServerSecurityModule) PrestoSparkNodePartitioningManager(com.facebook.presto.spark.node.PrestoSparkNodePartitioningManager) PrestoSparkRddFactory(com.facebook.presto.spark.planner.PrestoSparkRddFactory) SqlEnvironmentConfig(com.facebook.presto.sql.SqlEnvironmentConfig) PrestoSparkQueryPlanner(com.facebook.presto.spark.planner.PrestoSparkQueryPlanner) MultilevelSplitQueue(com.facebook.presto.execution.executor.MultilevelSplitQueue) StaticCatalogStoreConfig(com.facebook.presto.metadata.StaticCatalogStoreConfig) TracingConfig(com.facebook.presto.tracing.TracingConfig) QueryMonitor(com.facebook.presto.event.QueryMonitor) StaticFunctionNamespaceStore(com.facebook.presto.metadata.StaticFunctionNamespaceStore) InMemoryTransactionManager(com.facebook.presto.transaction.InMemoryTransactionManager) ThrowingClusterTtlProviderManager(com.facebook.presto.ttl.clusterttlprovidermanagers.ThrowingClusterTtlProviderManager) SpillerFactory(com.facebook.presto.spiller.SpillerFactory) TaskInfo(com.facebook.presto.execution.TaskInfo) Metadata(com.facebook.presto.metadata.Metadata) PartitioningProviderManager(com.facebook.presto.sql.planner.PartitioningProviderManager) FunctionAndTypeManager(com.facebook.presto.metadata.FunctionAndTypeManager) PartitioningSpillerFactory(com.facebook.presto.spiller.PartitioningSpillerFactory) LocalExecutionPlanner(com.facebook.presto.sql.planner.LocalExecutionPlanner) JsonCodec(com.facebook.airlift.json.JsonCodec) TablePropertyManager(com.facebook.presto.metadata.TablePropertyManager) SqlParserOptions(com.facebook.presto.sql.parser.SqlParserOptions) CostCalculatorWithEstimatedExchanges(com.facebook.presto.cost.CostCalculatorWithEstimatedExchanges) MetadataManager(com.facebook.presto.metadata.MetadataManager) TestingMBeanServer(org.weakref.jmx.testing.TestingMBeanServer) BlockEncoding(com.facebook.presto.common.block.BlockEncoding) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) NodeVersion(com.facebook.presto.client.NodeVersion) TaskManagerConfig(com.facebook.presto.execution.TaskManagerConfig) PagesIndex(com.facebook.presto.operator.PagesIndex) TempStorageStandaloneSpillerFactory(com.facebook.presto.spiller.TempStorageStandaloneSpillerFactory) PlanFragment(com.facebook.presto.sql.planner.PlanFragment) WarningCollectorConfig(com.facebook.presto.execution.warnings.WarningCollectorConfig) AbstractConfigurationAwareModule(com.facebook.airlift.configuration.AbstractConfigurationAwareModule) ConnectorManager(com.facebook.presto.connector.ConnectorManager) PrestoSparkPlanFragmenter(com.facebook.presto.spark.planner.PrestoSparkPlanFragmenter) ExportBinder.newExporter(org.weakref.jmx.guice.ExportBinder.newExporter) HandleJsonModule(com.facebook.presto.metadata.HandleJsonModule) PageIndexerFactory(com.facebook.presto.spi.PageIndexerFactory) OperatorInfo(com.facebook.presto.operator.OperatorInfo) ConnectorMetadataUpdaterManager(com.facebook.presto.metadata.ConnectorMetadataUpdaterManager) FileFragmentResultCacheManager(com.facebook.presto.operator.FileFragmentResultCacheManager) NodeMemoryConfig(com.facebook.presto.memory.NodeMemoryConfig) CostCalculatorUsingExchanges(com.facebook.presto.cost.CostCalculatorUsingExchanges) CostCalculator(com.facebook.presto.cost.CostCalculator) JsonBinder.jsonBinder(com.facebook.airlift.json.JsonBinder.jsonBinder) NodeSpillConfig(com.facebook.presto.spiller.NodeSpillConfig) SplitManager(com.facebook.presto.split.SplitManager) SchemaPropertyManager(com.facebook.presto.metadata.SchemaPropertyManager) Codec(com.facebook.airlift.json.Codec) NodeConfig(com.facebook.airlift.node.NodeConfig) SqlParser(com.facebook.presto.sql.parser.SqlParser) PrestoSparkQueryManager(com.facebook.presto.spark.node.PrestoSparkQueryManager) Threads.daemonThreadsNamed(com.facebook.airlift.concurrent.Threads.daemonThreadsNamed) TransactionManagerConfig(com.facebook.presto.transaction.TransactionManagerConfig) NodeTtlFetcherManager(com.facebook.presto.ttl.nodettlfetchermanagers.NodeTtlFetcherManager) TaskExecutor(com.facebook.presto.execution.executor.TaskExecutor) Optional(java.util.Optional) PredicateCompiler(com.facebook.presto.spi.relation.PredicateCompiler) PluginManager(com.facebook.presto.server.PluginManager) ExpressionCompiler(com.facebook.presto.sql.gen.ExpressionCompiler) NodeSchedulerConfig(com.facebook.presto.execution.scheduler.NodeSchedulerConfig) DeterminismEvaluator(com.facebook.presto.spi.relation.DeterminismEvaluator) VariableReferenceExpressionSerializer(com.facebook.presto.sql.Serialization.VariableReferenceExpressionSerializer) SpillerStats(com.facebook.presto.spiller.SpillerStats) QueryPrerequisitesManager(com.facebook.presto.dispatcher.QueryPrerequisitesManager) PrestoDataDefBindingHelper(com.facebook.presto.util.PrestoDataDefBindingHelper) SimpleTtlNodeSelectorConfig(com.facebook.presto.execution.scheduler.nodeSelection.SimpleTtlNodeSelectorConfig) PageSinkProvider(com.facebook.presto.split.PageSinkProvider) RowExpressionDeterminismEvaluator(com.facebook.presto.sql.relational.RowExpressionDeterminismEvaluator) ExecutionFailureInfo(com.facebook.presto.execution.ExecutionFailureInfo) QueryManager(com.facebook.presto.execution.QueryManager) Singleton(javax.inject.Singleton) JsonCodecBinder.jsonCodecBinder(com.facebook.airlift.json.JsonCodecBinder.jsonCodecBinder) BlockJsonSerde(com.facebook.presto.block.BlockJsonSerde) BlockEncodingSerde(com.facebook.presto.common.block.BlockEncodingSerde) StatsCalculatorModule(com.facebook.presto.cost.StatsCalculatorModule) PlanOptimizers(com.facebook.presto.sql.planner.PlanOptimizers) PageSourceManager(com.facebook.presto.split.PageSourceManager) OrderingCompiler(com.facebook.presto.sql.gen.OrderingCompiler) PlanChecker(com.facebook.presto.sql.planner.sanity.PlanChecker) SmileCodec(com.facebook.airlift.json.smile.SmileCodec) TypeManager(com.facebook.presto.common.type.TypeManager) TaskManager(com.facebook.presto.execution.TaskManager) FileFragmentResultCacheConfig(com.facebook.presto.operator.FileFragmentResultCacheConfig) MBeanServer(javax.management.MBeanServer) Objects.requireNonNull(java.util.Objects.requireNonNull) ExplainAnalyzeContext(com.facebook.presto.execution.ExplainAnalyzeContext) IndexManager(com.facebook.presto.index.IndexManager) MemoryManagerConfig(com.facebook.presto.memory.MemoryManagerConfig) SingleStreamSpillerFactory(com.facebook.presto.spiller.SingleStreamSpillerFactory) SessionPropertyManager(com.facebook.presto.metadata.SessionPropertyManager) PlanFragmenter(com.facebook.presto.sql.planner.PlanFragmenter) Type(com.facebook.presto.common.type.Type) ExecutorService(java.util.concurrent.ExecutorService) PagesIndexPageSorter(com.facebook.presto.PagesIndexPageSorter) NodePartitioningManager(com.facebook.presto.sql.planner.NodePartitioningManager) SplitMonitor(com.facebook.presto.event.SplitMonitor) TaskSource(com.facebook.presto.execution.TaskSource) JoinFilterFunctionCompiler(com.facebook.presto.sql.gen.JoinFilterFunctionCompiler) SparkProcessType(com.facebook.presto.spark.classloader_interface.SparkProcessType) Scopes(com.google.inject.Scopes) Executors.newFixedThreadPool(java.util.concurrent.Executors.newFixedThreadPool) CatalogManager(com.facebook.presto.metadata.CatalogManager) CompilerConfig(com.facebook.presto.sql.planner.CompilerConfig) SmileCodecBinder.smileCodecBinder(com.facebook.airlift.json.smile.SmileCodecBinder.smileCodecBinder) TypeDeserializer(com.facebook.presto.type.TypeDeserializer) Provides(com.google.inject.Provides) QueryMonitorConfig(com.facebook.presto.event.QueryMonitorConfig) Executors.newCachedThreadPool(java.util.concurrent.Executors.newCachedThreadPool) CostComparator(com.facebook.presto.cost.CostComparator) ConfigBinder.configBinder(com.facebook.airlift.configuration.ConfigBinder.configBinder) GroupByHashPageIndexerFactory(com.facebook.presto.GroupByHashPageIndexerFactory) Block(com.facebook.presto.common.block.Block) MBeanExporter(org.weakref.jmx.MBeanExporter) JoinCompiler(com.facebook.presto.sql.gen.JoinCompiler) PrestoSparkPlanFragmenter(com.facebook.presto.spark.planner.PrestoSparkPlanFragmenter) RowExpressionPredicateCompiler(com.facebook.presto.sql.gen.RowExpressionPredicateCompiler) PrestoSparkQueryManager(com.facebook.presto.spark.node.PrestoSparkQueryManager) PrestoSparkTaskExecutorFactory(com.facebook.presto.spark.execution.PrestoSparkTaskExecutorFactory) PluginManager(com.facebook.presto.server.PluginManager) NodeVersion(com.facebook.presto.client.NodeVersion) JsonCodec(com.facebook.airlift.json.JsonCodec) Codec(com.facebook.airlift.json.Codec) SmileCodec(com.facebook.airlift.json.smile.SmileCodec) FunctionAndTypeManager(com.facebook.presto.metadata.FunctionAndTypeManager) QueryMonitor(com.facebook.presto.event.QueryMonitor) TestingMBeanServer(org.weakref.jmx.testing.TestingMBeanServer) MBeanServer(javax.management.MBeanServer) PrestoSparkRddFactory(com.facebook.presto.spark.planner.PrestoSparkRddFactory) JoinCompiler(com.facebook.presto.sql.gen.JoinCompiler) GenericPartitioningSpillerFactory(com.facebook.presto.spiller.GenericPartitioningSpillerFactory) QueryExplainer(com.facebook.presto.sql.analyzer.QueryExplainer) SessionPropertyDefaults(com.facebook.presto.server.SessionPropertyDefaults) StaticFunctionNamespaceStore(com.facebook.presto.metadata.StaticFunctionNamespaceStore) SparkProcessType(com.facebook.presto.spark.classloader_interface.SparkProcessType) BlockJsonSerde(com.facebook.presto.block.BlockJsonSerde) NoopResourceGroupService(com.facebook.presto.resourcemanager.NoopResourceGroupService) MultilevelSplitQueue(com.facebook.presto.execution.executor.MultilevelSplitQueue) NodeInfo(com.facebook.airlift.node.NodeInfo) PlanOptimizers(com.facebook.presto.sql.planner.PlanOptimizers) CostCalculatorWithEstimatedExchanges(com.facebook.presto.cost.CostCalculatorWithEstimatedExchanges) ClusterMemoryPoolManager(com.facebook.presto.spi.memory.ClusterMemoryPoolManager) PrestoSparkPlanFragmenter(com.facebook.presto.spark.planner.PrestoSparkPlanFragmenter) PlanFragmenter(com.facebook.presto.sql.planner.PlanFragmenter) TempStorageStandaloneSpillerFactory(com.facebook.presto.spiller.TempStorageStandaloneSpillerFactory) PagesIndex(com.facebook.presto.operator.PagesIndex) PrestoSparkBroadcastTableCacheManager(com.facebook.presto.spark.execution.PrestoSparkBroadcastTableCacheManager) Executor(java.util.concurrent.Executor) TaskExecutor(com.facebook.presto.execution.executor.TaskExecutor) InternalNodeManager(com.facebook.presto.metadata.InternalNodeManager) PrestoSparkInternalNodeManager(com.facebook.presto.spark.node.PrestoSparkInternalNodeManager) TypeLiteral(com.google.inject.TypeLiteral) ServerSecurityModule(com.facebook.presto.server.security.ServerSecurityModule) SystemConnectorModule(com.facebook.presto.connector.system.SystemConnectorModule) CostCalculatorUsingExchanges(com.facebook.presto.cost.CostCalculatorUsingExchanges) EmbedVersion(com.facebook.presto.version.EmbedVersion) ExplainAnalyzeContext(com.facebook.presto.execution.ExplainAnalyzeContext) PrestoSparkQueryPlanner(com.facebook.presto.spark.planner.PrestoSparkQueryPlanner) LookupJoinOperators(com.facebook.presto.operator.LookupJoinOperators) PageSinkManager(com.facebook.presto.split.PageSinkManager) StatsCalculatorModule(com.facebook.presto.cost.StatsCalculatorModule) CostComparator(com.facebook.presto.cost.CostComparator) TaskCountEstimator(com.facebook.presto.cost.TaskCountEstimator) RowExpressionDeterminismEvaluator(com.facebook.presto.sql.relational.RowExpressionDeterminismEvaluator) ConnectorPlanOptimizerManager(com.facebook.presto.sql.planner.ConnectorPlanOptimizerManager) JoinFilterFunctionCompiler(com.facebook.presto.sql.gen.JoinFilterFunctionCompiler) RowExpressionDomainTranslator(com.facebook.presto.sql.relational.RowExpressionDomainTranslator) TempStorageSingleStreamSpillerFactory(com.facebook.presto.spiller.TempStorageSingleStreamSpillerFactory) ConnectorManager(com.facebook.presto.connector.ConnectorManager) CatalogManager(com.facebook.presto.metadata.CatalogManager) Type(com.facebook.presto.common.type.Type) SparkProcessType(com.facebook.presto.spark.classloader_interface.SparkProcessType) ConnectorMetadataUpdaterManager(com.facebook.presto.metadata.ConnectorMetadataUpdaterManager) TablePropertyManager(com.facebook.presto.metadata.TablePropertyManager) TaskSource(com.facebook.presto.execution.TaskSource) PrestoSparkTaskManager(com.facebook.presto.spark.node.PrestoSparkTaskManager) QueryIdGenerator(com.facebook.presto.execution.QueryIdGenerator) PageSourceManager(com.facebook.presto.split.PageSourceManager) TaskInfo(com.facebook.presto.execution.TaskInfo) PagesIndexPageSorter(com.facebook.presto.PagesIndexPageSorter) QueryPreparer(com.facebook.presto.execution.QueryPreparer) ServerConfig(com.facebook.presto.server.ServerConfig) PrestoSparkNodePartitioningManager(com.facebook.presto.spark.node.PrestoSparkNodePartitioningManager) OrderingCompiler(com.facebook.presto.sql.gen.OrderingCompiler) LegacyResourceGroupConfigurationManager(com.facebook.presto.execution.resourceGroups.LegacyResourceGroupConfigurationManager) SqlParserOptions(com.facebook.presto.sql.parser.SqlParserOptions) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) TestingMBeanServer(org.weakref.jmx.testing.TestingMBeanServer) QueryPrerequisitesManager(com.facebook.presto.dispatcher.QueryPrerequisitesManager) StaticCatalogStore(com.facebook.presto.metadata.StaticCatalogStore) IndexJoinLookupStats(com.facebook.presto.operator.index.IndexJoinLookupStats) SplitMonitor(com.facebook.presto.event.SplitMonitor) MBeanExporter(org.weakref.jmx.MBeanExporter) SqlParser(com.facebook.presto.sql.parser.SqlParser) InternalResourceGroupManager(com.facebook.presto.execution.resourceGroups.InternalResourceGroupManager) ResourceGroupManager(com.facebook.presto.execution.resourceGroups.ResourceGroupManager) ThrowingNodeTtlFetcherManager(com.facebook.presto.ttl.nodettlfetchermanagers.ThrowingNodeTtlFetcherManager) SpillerStats(com.facebook.presto.spiller.SpillerStats) IndexManager(com.facebook.presto.index.IndexManager) TaskExecutor(com.facebook.presto.execution.executor.TaskExecutor) BlockEncodingManager(com.facebook.presto.common.block.BlockEncodingManager) PlanChecker(com.facebook.presto.sql.planner.sanity.PlanChecker) VariableReferenceExpression(com.facebook.presto.spi.relation.VariableReferenceExpression) Block(com.facebook.presto.common.block.Block) ExpressionCompiler(com.facebook.presto.sql.gen.ExpressionCompiler) GroupByHashPageIndexerFactory(com.facebook.presto.GroupByHashPageIndexerFactory) ThrowingClusterTtlProviderManager(com.facebook.presto.ttl.clusterttlprovidermanagers.ThrowingClusterTtlProviderManager) ColumnPropertyManager(com.facebook.presto.metadata.ColumnPropertyManager) PageFunctionCompiler(com.facebook.presto.sql.gen.PageFunctionCompiler) PartitioningProviderManager(com.facebook.presto.sql.planner.PartitioningProviderManager) PrestoSparkTaskExecutorFactory(com.facebook.presto.spark.execution.PrestoSparkTaskExecutorFactory) GenericPartitioningSpillerFactory(com.facebook.presto.spiller.GenericPartitioningSpillerFactory) StandaloneSpillerFactory(com.facebook.presto.spiller.StandaloneSpillerFactory) TempStorageSingleStreamSpillerFactory(com.facebook.presto.spiller.TempStorageSingleStreamSpillerFactory) GenericSpillerFactory(com.facebook.presto.spiller.GenericSpillerFactory) PrestoSparkExecutionExceptionFactory(com.facebook.presto.spark.execution.PrestoSparkExecutionExceptionFactory) PrestoSparkRddFactory(com.facebook.presto.spark.planner.PrestoSparkRddFactory) SpillerFactory(com.facebook.presto.spiller.SpillerFactory) PartitioningSpillerFactory(com.facebook.presto.spiller.PartitioningSpillerFactory) TempStorageStandaloneSpillerFactory(com.facebook.presto.spiller.TempStorageStandaloneSpillerFactory) PageIndexerFactory(com.facebook.presto.spi.PageIndexerFactory) SingleStreamSpillerFactory(com.facebook.presto.spiller.SingleStreamSpillerFactory) GroupByHashPageIndexerFactory(com.facebook.presto.GroupByHashPageIndexerFactory) HandleJsonModule(com.facebook.presto.metadata.HandleJsonModule) InternalResourceGroupManager(com.facebook.presto.execution.resourceGroups.InternalResourceGroupManager) SchemaPropertyManager(com.facebook.presto.metadata.SchemaPropertyManager) FragmentCacheStats(com.facebook.presto.operator.FragmentCacheStats) GenericSpillerFactory(com.facebook.presto.spiller.GenericSpillerFactory) AnalyzePropertyManager(com.facebook.presto.metadata.AnalyzePropertyManager) LocalExecutionPlanner(com.facebook.presto.sql.planner.LocalExecutionPlanner) PrestoSparkExecutionExceptionFactory(com.facebook.presto.spark.execution.PrestoSparkExecutionExceptionFactory) PrestoSparkInternalNodeManager(com.facebook.presto.spark.node.PrestoSparkInternalNodeManager) SplitManager(com.facebook.presto.split.SplitManager) CostCalculator(com.facebook.presto.cost.CostCalculator) QuerySessionSupplier(com.facebook.presto.server.QuerySessionSupplier) MetadataManager(com.facebook.presto.metadata.MetadataManager) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ExecutorService(java.util.concurrent.ExecutorService) SystemSessionProperties(com.facebook.presto.SystemSessionProperties)

Example 2 with TaskSource

use of com.facebook.presto.execution.TaskSource in project presto by prestodb.

the class PrestoSparkTaskExecutorFactory method computeAllSplitsSize.

private static OptionalLong computeAllSplitsSize(List<TaskSource> taskSources) {
    long sum = 0;
    for (TaskSource taskSource : taskSources) {
        for (ScheduledSplit scheduledSplit : taskSource.getSplits()) {
            ConnectorSplit connectorSplit = scheduledSplit.getSplit().getConnectorSplit();
            if (!connectorSplit.getSplitSizeInBytes().isPresent()) {
                return OptionalLong.empty();
            }
            sum += connectorSplit.getSplitSizeInBytes().getAsLong();
        }
    }
    return OptionalLong.of(sum);
}
Also used : ScheduledSplit(com.facebook.presto.execution.ScheduledSplit) ConnectorSplit(com.facebook.presto.spi.ConnectorSplit) SerializedPrestoSparkTaskSource(com.facebook.presto.spark.classloader_interface.SerializedPrestoSparkTaskSource) TaskSource(com.facebook.presto.execution.TaskSource)

Example 3 with TaskSource

use of com.facebook.presto.execution.TaskSource in project presto by prestodb.

the class PrestoSparkTaskExecutorFactory method getTaskSources.

private List<TaskSource> getTaskSources(Iterator<SerializedPrestoSparkTaskSource> serializedTaskSources) {
    long totalSerializedSizeInBytes = 0;
    ImmutableList.Builder<TaskSource> result = ImmutableList.builder();
    while (serializedTaskSources.hasNext()) {
        SerializedPrestoSparkTaskSource serializedTaskSource = serializedTaskSources.next();
        totalSerializedSizeInBytes += serializedTaskSource.getBytes().length;
        result.add(deserializeZstdCompressed(taskSourceCodec, serializedTaskSource.getBytes()));
    }
    log.info("Total serialized size of all task sources: %s", succinctBytes(totalSerializedSizeInBytes));
    return result.build();
}
Also used : ImmutableList(com.google.common.collect.ImmutableList) SerializedPrestoSparkTaskSource(com.facebook.presto.spark.classloader_interface.SerializedPrestoSparkTaskSource) SerializedPrestoSparkTaskSource(com.facebook.presto.spark.classloader_interface.SerializedPrestoSparkTaskSource) TaskSource(com.facebook.presto.execution.TaskSource)

Example 4 with TaskSource

use of com.facebook.presto.execution.TaskSource in project presto by prestodb.

the class PrestoSparkTaskExecutorFactory method doCreate.

public <T extends PrestoSparkTaskOutput> IPrestoSparkTaskExecutor<T> doCreate(int partitionId, int attemptNumber, SerializedPrestoSparkTaskDescriptor serializedTaskDescriptor, Iterator<SerializedPrestoSparkTaskSource> serializedTaskSources, PrestoSparkTaskInputs inputs, CollectionAccumulator<SerializedTaskInfo> taskInfoCollector, CollectionAccumulator<PrestoSparkShuffleStats> shuffleStatsCollector, Class<T> outputType) {
    PrestoSparkTaskDescriptor taskDescriptor = taskDescriptorJsonCodec.fromJson(serializedTaskDescriptor.getBytes());
    ImmutableMap.Builder<String, TokenAuthenticator> extraAuthenticators = ImmutableMap.builder();
    authenticatorProviders.forEach(provider -> extraAuthenticators.putAll(provider.getTokenAuthenticators()));
    Session session = taskDescriptor.getSession().toSession(sessionPropertyManager, taskDescriptor.getExtraCredentials(), extraAuthenticators.build());
    PlanFragment fragment = taskDescriptor.getFragment();
    StageId stageId = new StageId(session.getQueryId(), fragment.getId().getId());
    // Clear the cache if the cache does not have broadcast table for current stageId.
    // We will only cache 1 HT at any time. If the stageId changes, we will drop the old cached HT
    prestoSparkBroadcastTableCacheManager.removeCachedTablesForStagesOtherThan(stageId);
    // TODO: include attemptId in taskId
    TaskId taskId = new TaskId(new StageExecutionId(stageId, 0), partitionId);
    List<TaskSource> taskSources = getTaskSources(serializedTaskSources);
    log.info("Task [%s] received %d splits.", taskId, taskSources.stream().mapToInt(taskSource -> taskSource.getSplits().size()).sum());
    OptionalLong totalSplitSize = computeAllSplitsSize(taskSources);
    if (totalSplitSize.isPresent()) {
        log.info("Total split size: %s bytes.", totalSplitSize.getAsLong());
    }
    // TODO: Remove this once we can display the plan on Spark UI.
    log.info(PlanPrinter.textPlanFragment(fragment, functionAndTypeManager, session, true));
    DataSize maxUserMemory = new DataSize(min(nodeMemoryConfig.getMaxQueryMemoryPerNode().toBytes(), getQueryMaxMemoryPerNode(session).toBytes()), BYTE);
    DataSize maxTotalMemory = new DataSize(min(nodeMemoryConfig.getMaxQueryTotalMemoryPerNode().toBytes(), getQueryMaxTotalMemoryPerNode(session).toBytes()), BYTE);
    DataSize maxBroadcastMemory = getSparkBroadcastJoinMaxMemoryOverride(session);
    if (maxBroadcastMemory == null) {
        maxBroadcastMemory = new DataSize(min(nodeMemoryConfig.getMaxQueryBroadcastMemory().toBytes(), getQueryMaxBroadcastMemory(session).toBytes()), BYTE);
    }
    MemoryPool memoryPool = new MemoryPool(new MemoryPoolId("spark-executor-memory-pool"), maxTotalMemory);
    SpillSpaceTracker spillSpaceTracker = new SpillSpaceTracker(maxQuerySpillPerNode);
    QueryContext queryContext = new QueryContext(session.getQueryId(), maxUserMemory, maxTotalMemory, maxBroadcastMemory, maxRevocableMemory, memoryPool, new TestingGcMonitor(), notificationExecutor, yieldExecutor, maxQuerySpillPerNode, spillSpaceTracker, memoryReservationSummaryJsonCodec);
    queryContext.setVerboseExceededMemoryLimitErrorsEnabled(isVerboseExceededMemoryLimitErrorsEnabled(session));
    queryContext.setHeapDumpOnExceededMemoryLimitEnabled(isHeapDumpOnExceededMemoryLimitEnabled(session));
    String heapDumpFilePath = Paths.get(getHeapDumpFileDirectory(session), format("%s_%s.hprof", session.getQueryId().getId(), stageId.getId())).toString();
    queryContext.setHeapDumpFilePath(heapDumpFilePath);
    TaskStateMachine taskStateMachine = new TaskStateMachine(taskId, notificationExecutor);
    TaskContext taskContext = queryContext.addTaskContext(taskStateMachine, session, // Plan has to be retained only if verbose memory exceeded errors are requested
    isVerboseExceededMemoryLimitErrorsEnabled(session) ? Optional.of(fragment.getRoot()) : Optional.empty(), perOperatorCpuTimerEnabled, cpuTimerEnabled, perOperatorAllocationTrackingEnabled, allocationTrackingEnabled, false);
    final double memoryRevokingThreshold = getMemoryRevokingThreshold(session);
    final double memoryRevokingTarget = getMemoryRevokingTarget(session);
    checkArgument(memoryRevokingTarget <= memoryRevokingThreshold, "memoryRevokingTarget should be less than or equal memoryRevokingThreshold, but got %s and %s respectively", memoryRevokingTarget, memoryRevokingThreshold);
    if (isSpillEnabled(session)) {
        memoryPool.addListener((pool, queryId, totalMemoryReservationBytes) -> {
            if (totalMemoryReservationBytes > queryContext.getPeakNodeTotalMemory()) {
                queryContext.setPeakNodeTotalMemory(totalMemoryReservationBytes);
            }
            if (totalMemoryReservationBytes > pool.getMaxBytes() * memoryRevokingThreshold && memoryRevokeRequestInProgress.compareAndSet(false, true)) {
                memoryRevocationExecutor.execute(() -> {
                    try {
                        AtomicLong remainingBytesToRevoke = new AtomicLong(totalMemoryReservationBytes - (long) (memoryRevokingTarget * pool.getMaxBytes()));
                        remainingBytesToRevoke.addAndGet(-MemoryRevokingSchedulerUtils.getMemoryAlreadyBeingRevoked(ImmutableList.of(taskContext), remainingBytesToRevoke.get()));
                        taskContext.accept(new VoidTraversingQueryContextVisitor<AtomicLong>() {

                            @Override
                            public Void visitOperatorContext(OperatorContext operatorContext, AtomicLong remainingBytesToRevoke) {
                                if (remainingBytesToRevoke.get() > 0) {
                                    long revokedBytes = operatorContext.requestMemoryRevoking();
                                    if (revokedBytes > 0) {
                                        memoryRevokePending.set(true);
                                        remainingBytesToRevoke.addAndGet(-revokedBytes);
                                    }
                                }
                                return null;
                            }
                        }, remainingBytesToRevoke);
                        memoryRevokeRequestInProgress.set(false);
                    } catch (Exception e) {
                        log.error(e, "Error requesting memory revoking");
                    }
                });
            }
            // Get the latest memory reservation info since it might have changed due to revoke
            long totalReservedMemory = pool.getQueryMemoryReservation(queryId) + pool.getQueryRevocableMemoryReservation(queryId);
            // If total memory usage is over maxTotalMemory and memory revoke request is not pending, fail the query with EXCEEDED_MEMORY_LIMIT error
            if (totalReservedMemory > maxTotalMemory.toBytes() && !memoryRevokeRequestInProgress.get() && !isMemoryRevokePending(taskContext)) {
                throw exceededLocalTotalMemoryLimit(maxTotalMemory, queryContext.getAdditionalFailureInfo(totalReservedMemory, 0) + format("Total reserved memory: %s, Total revocable memory: %s", succinctBytes(pool.getQueryMemoryReservation(queryId)), succinctBytes(pool.getQueryRevocableMemoryReservation(queryId))), isHeapDumpOnExceededMemoryLimitEnabled(session), Optional.ofNullable(heapDumpFilePath));
            }
        });
    }
    ImmutableMap.Builder<PlanNodeId, List<PrestoSparkShuffleInput>> shuffleInputs = ImmutableMap.builder();
    ImmutableMap.Builder<PlanNodeId, List<java.util.Iterator<PrestoSparkSerializedPage>>> pageInputs = ImmutableMap.builder();
    ImmutableMap.Builder<PlanNodeId, List<?>> broadcastInputs = ImmutableMap.builder();
    for (RemoteSourceNode remoteSource : fragment.getRemoteSourceNodes()) {
        List<PrestoSparkShuffleInput> remoteSourceRowInputs = new ArrayList<>();
        List<java.util.Iterator<PrestoSparkSerializedPage>> remoteSourcePageInputs = new ArrayList<>();
        List<List<?>> broadcastInputsList = new ArrayList<>();
        for (PlanFragmentId sourceFragmentId : remoteSource.getSourceFragmentIds()) {
            Iterator<Tuple2<MutablePartitionId, PrestoSparkMutableRow>> shuffleInput = inputs.getShuffleInputs().get(sourceFragmentId.toString());
            Broadcast<?> broadcastInput = inputs.getBroadcastInputs().get(sourceFragmentId.toString());
            List<PrestoSparkSerializedPage> inMemoryInput = inputs.getInMemoryInputs().get(sourceFragmentId.toString());
            if (shuffleInput != null) {
                checkArgument(broadcastInput == null, "single remote source is not expected to accept different kind of inputs");
                checkArgument(inMemoryInput == null, "single remote source is not expected to accept different kind of inputs");
                remoteSourceRowInputs.add(new PrestoSparkShuffleInput(sourceFragmentId.getId(), shuffleInput));
                continue;
            }
            if (broadcastInput != null) {
                checkArgument(inMemoryInput == null, "single remote source is not expected to accept different kind of inputs");
                // TODO: Enable NullifyingIterator once migrated to one task per JVM model
                // NullifyingIterator removes element from the list upon return
                // This allows GC to gradually reclaim memory
                // remoteSourcePageInputs.add(getNullifyingIterator(broadcastInput.value()));
                broadcastInputsList.add((List<?>) broadcastInput.value());
                continue;
            }
            if (inMemoryInput != null) {
                // for inmemory inputs pages can be released incrementally to save memory
                remoteSourcePageInputs.add(getNullifyingIterator(inMemoryInput));
                continue;
            }
            throw new IllegalArgumentException("Input not found for sourceFragmentId: " + sourceFragmentId);
        }
        if (!remoteSourceRowInputs.isEmpty()) {
            shuffleInputs.put(remoteSource.getId(), remoteSourceRowInputs);
        }
        if (!remoteSourcePageInputs.isEmpty()) {
            pageInputs.put(remoteSource.getId(), remoteSourcePageInputs);
        }
        if (!broadcastInputsList.isEmpty()) {
            broadcastInputs.put(remoteSource.getId(), broadcastInputsList);
        }
    }
    OutputBufferMemoryManager memoryManager = new OutputBufferMemoryManager(sinkMaxBufferSize.toBytes(), () -> queryContext.getTaskContextByTaskId(taskId).localSystemMemoryContext(), notificationExecutor);
    Optional<OutputPartitioning> preDeterminedPartition = Optional.empty();
    if (fragment.getPartitioningScheme().getPartitioning().getHandle().equals(FIXED_ARBITRARY_DISTRIBUTION)) {
        int partitionCount = getHashPartitionCount(session);
        preDeterminedPartition = Optional.of(new OutputPartitioning(new PreDeterminedPartitionFunction(partitionId % partitionCount, partitionCount), ImmutableList.of(), ImmutableList.of(), false, OptionalInt.empty()));
    }
    TempDataOperationContext tempDataOperationContext = new TempDataOperationContext(session.getSource(), session.getQueryId().getId(), session.getClientInfo(), Optional.of(session.getClientTags()), session.getIdentity());
    TempStorage tempStorage = tempStorageManager.getTempStorage(storageBasedBroadcastJoinStorage);
    Output<T> output = configureOutput(outputType, blockEncodingManager, memoryManager, getShuffleOutputTargetAverageRowSize(session), preDeterminedPartition, tempStorage, tempDataOperationContext, getStorageBasedBroadcastJoinWriteBufferSize(session));
    PrestoSparkOutputBuffer<?> outputBuffer = output.getOutputBuffer();
    LocalExecutionPlan localExecutionPlan = localExecutionPlanner.plan(taskContext, fragment.getRoot(), fragment.getPartitioningScheme(), fragment.getStageExecutionDescriptor(), fragment.getTableScanSchedulingOrder(), output.getOutputFactory(), new PrestoSparkRemoteSourceFactory(blockEncodingManager, shuffleInputs.build(), pageInputs.build(), broadcastInputs.build(), partitionId, shuffleStatsCollector, tempStorage, tempDataOperationContext, prestoSparkBroadcastTableCacheManager, stageId), taskDescriptor.getTableWriteInfo(), true);
    taskStateMachine.addStateChangeListener(state -> {
        if (state.isDone()) {
            outputBuffer.setNoMoreRows();
        }
    });
    PrestoSparkTaskExecution taskExecution = new PrestoSparkTaskExecution(taskStateMachine, taskContext, localExecutionPlan, taskExecutor, splitMonitor, notificationExecutor, memoryUpdateExecutor);
    taskExecution.start(taskSources);
    return new PrestoSparkTaskExecutor<>(taskContext, taskStateMachine, output.getOutputSupplier(), taskInfoCodec, taskInfoCollector, shuffleStatsCollector, executionExceptionFactory, output.getOutputBufferType(), outputBuffer, tempStorage, tempDataOperationContext);
}
Also used : StageId(com.facebook.presto.execution.StageId) ArrayList(java.util.ArrayList) PlanFragment(com.facebook.presto.sql.planner.PlanFragment) TaskStateMachine(com.facebook.presto.execution.TaskStateMachine) PlanNodeId(com.facebook.presto.spi.plan.PlanNodeId) RemoteSourceNode(com.facebook.presto.sql.planner.plan.RemoteSourceNode) DataSize(io.airlift.units.DataSize) OperatorContext(com.facebook.presto.operator.OperatorContext) OutputBufferMemoryManager(com.facebook.presto.execution.buffer.OutputBufferMemoryManager) ArrayList(java.util.ArrayList) List(java.util.List) ImmutableList(com.google.common.collect.ImmutableList) TempDataOperationContext(com.facebook.presto.spi.storage.TempDataOperationContext) PrestoSparkSessionProperties.getSparkBroadcastJoinMaxMemoryOverride(com.facebook.presto.spark.PrestoSparkSessionProperties.getSparkBroadcastJoinMaxMemoryOverride) PreDeterminedPartitionFunction(com.facebook.presto.spark.execution.PrestoSparkRowOutputOperator.PreDeterminedPartitionFunction) IPrestoSparkTaskExecutor(com.facebook.presto.spark.classloader_interface.IPrestoSparkTaskExecutor) ImmutableMap(com.google.common.collect.ImmutableMap) TokenAuthenticator(com.facebook.presto.spi.security.TokenAuthenticator) SerializedPrestoSparkTaskDescriptor(com.facebook.presto.spark.classloader_interface.SerializedPrestoSparkTaskDescriptor) PrestoSparkTaskDescriptor(com.facebook.presto.spark.PrestoSparkTaskDescriptor) TaskId(com.facebook.presto.execution.TaskId) StageExecutionId(com.facebook.presto.execution.StageExecutionId) PrestoSparkUtils.getNullifyingIterator(com.facebook.presto.spark.util.PrestoSparkUtils.getNullifyingIterator) AbstractIterator(scala.collection.AbstractIterator) Iterator(scala.collection.Iterator) TestingGcMonitor(com.facebook.airlift.stats.TestingGcMonitor) PlanFragmentId(com.facebook.presto.sql.planner.plan.PlanFragmentId) MemoryPoolId(com.facebook.presto.spi.memory.MemoryPoolId) SpillSpaceTracker(com.facebook.presto.spiller.SpillSpaceTracker) TaskContext(com.facebook.presto.operator.TaskContext) QueryContext(com.facebook.presto.memory.QueryContext) UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) NoSuchElementException(java.util.NoSuchElementException) PrestoSparkUtils.toPrestoSparkSerializedPage(com.facebook.presto.spark.util.PrestoSparkUtils.toPrestoSparkSerializedPage) PrestoSparkSerializedPage(com.facebook.presto.spark.classloader_interface.PrestoSparkSerializedPage) LocalExecutionPlan(com.facebook.presto.sql.planner.LocalExecutionPlanner.LocalExecutionPlan) AtomicLong(java.util.concurrent.atomic.AtomicLong) TempStorage(com.facebook.presto.spi.storage.TempStorage) Tuple2(scala.Tuple2) OptionalLong(java.util.OptionalLong) SerializedPrestoSparkTaskSource(com.facebook.presto.spark.classloader_interface.SerializedPrestoSparkTaskSource) TaskSource(com.facebook.presto.execution.TaskSource) OutputPartitioning(com.facebook.presto.sql.planner.OutputPartitioning) Session(com.facebook.presto.Session) MemoryPool(com.facebook.presto.memory.MemoryPool)

Example 5 with TaskSource

use of com.facebook.presto.execution.TaskSource in project presto by prestodb.

the class HttpRemoteTask method sendUpdate.

private synchronized void sendUpdate() {
    TaskStatus taskStatus = getTaskStatus();
    // don't update if the task hasn't been started yet or if it is already finished
    if (!started.get() || !needsUpdate.get() || taskStatus.getState().isDone()) {
        return;
    }
    // if there is a request already running, wait for it to complete
    if (this.currentRequest != null && !this.currentRequest.isDone()) {
        return;
    }
    // if throttled due to error, asynchronously wait for timeout and try again
    ListenableFuture<?> errorRateLimit = updateErrorTracker.acquireRequestPermit();
    if (!errorRateLimit.isDone()) {
        errorRateLimit.addListener(this::sendUpdate, executor);
        return;
    }
    List<TaskSource> sources = getSources();
    Optional<byte[]> fragment = sendPlan.get() ? Optional.of(planFragment.toBytes(planFragmentCodec)) : Optional.empty();
    Optional<TableWriteInfo> writeInfo = sendPlan.get() ? Optional.of(tableWriteInfo) : Optional.empty();
    TaskUpdateRequest updateRequest = new TaskUpdateRequest(session.toSessionRepresentation(), session.getIdentity().getExtraCredentials(), fragment, sources, outputBuffers.get(), writeInfo);
    byte[] taskUpdateRequestJson = taskUpdateRequestCodec.toBytes(updateRequest);
    taskUpdateRequestSize.add(taskUpdateRequestJson.length);
    if (taskUpdateRequestJson.length > maxTaskUpdateSizeInBytes) {
        failTask(new PrestoException(EXCEEDED_TASK_UPDATE_SIZE_LIMIT, format("TaskUpdate size of %d Bytes has exceeded the limit of %d Bytes", taskUpdateRequestJson.length, maxTaskUpdateSizeInBytes)));
    }
    if (fragment.isPresent()) {
        stats.updateWithPlanSize(taskUpdateRequestJson.length);
    } else {
        if (ThreadLocalRandom.current().nextDouble() < UPDATE_WITHOUT_PLAN_STATS_SAMPLE_RATE) {
            // This is to keep track of the task update size even when the plan fragment is NOT present
            stats.updateWithoutPlanSize(taskUpdateRequestJson.length);
        }
    }
    HttpUriBuilder uriBuilder = getHttpUriBuilder(taskStatus);
    Request request = setContentTypeHeaders(binaryTransportEnabled, preparePost()).setUri(uriBuilder.build()).setBodyGenerator(createStaticBodyGenerator(taskUpdateRequestJson)).build();
    ResponseHandler responseHandler;
    if (binaryTransportEnabled) {
        responseHandler = createFullSmileResponseHandler((SmileCodec<TaskInfo>) taskInfoCodec);
    } else {
        responseHandler = createAdaptingJsonResponseHandler((JsonCodec<TaskInfo>) taskInfoCodec);
    }
    updateErrorTracker.startRequest();
    ListenableFuture<BaseResponse<TaskInfo>> future = httpClient.executeAsync(request, responseHandler);
    currentRequest = future;
    currentRequestStartNanos = System.nanoTime();
    // The needsUpdate flag needs to be set to false BEFORE adding the Future callback since callback might change the flag value
    // and does so without grabbing the instance lock.
    needsUpdate.set(false);
    Futures.addCallback(future, new SimpleHttpResponseHandler<>(new UpdateResponseHandler(sources), request.getUri(), stats.getHttpResponseStats(), REMOTE_TASK_ERROR), executor);
}
Also used : SmileCodec(com.facebook.airlift.json.smile.SmileCodec) TableWriteInfo(com.facebook.presto.execution.scheduler.TableWriteInfo) SimpleHttpResponseHandler(com.facebook.presto.server.SimpleHttpResponseHandler) StatusResponseHandler.createStatusResponseHandler(com.facebook.airlift.http.client.StatusResponseHandler.createStatusResponseHandler) FullSmileResponseHandler.createFullSmileResponseHandler(com.facebook.presto.server.smile.FullSmileResponseHandler.createFullSmileResponseHandler) ResponseHandler(com.facebook.airlift.http.client.ResponseHandler) AdaptingJsonResponseHandler.createAdaptingJsonResponseHandler(com.facebook.presto.server.smile.AdaptingJsonResponseHandler.createAdaptingJsonResponseHandler) TaskUpdateRequest(com.facebook.presto.server.TaskUpdateRequest) TaskUpdateRequest(com.facebook.presto.server.TaskUpdateRequest) Request(com.facebook.airlift.http.client.Request) PrestoException(com.facebook.presto.spi.PrestoException) TaskStatus(com.facebook.presto.execution.TaskStatus) BaseResponse(com.facebook.presto.server.smile.BaseResponse) JsonCodec(com.facebook.airlift.json.JsonCodec) HttpUriBuilder(com.facebook.airlift.http.client.HttpUriBuilder) TaskSource(com.facebook.presto.execution.TaskSource)

Aggregations

TaskSource (com.facebook.presto.execution.TaskSource)16 ScheduledSplit (com.facebook.presto.execution.ScheduledSplit)12 PlanNodeId (com.facebook.presto.spi.plan.PlanNodeId)10 Duration (io.airlift.units.Duration)5 Type (com.facebook.presto.common.type.Type)4 SerializedPrestoSparkTaskSource (com.facebook.presto.spark.classloader_interface.SerializedPrestoSparkTaskSource)4 FixedPageSource (com.facebook.presto.spi.FixedPageSource)4 Split (com.facebook.presto.metadata.Split)3 PageConsumerOperator (com.facebook.presto.testing.PageConsumerOperator)3 ImmutableList (com.google.common.collect.ImmutableList)3 JsonCodec (com.facebook.airlift.json.JsonCodec)2 SmileCodec (com.facebook.airlift.json.smile.SmileCodec)2 Page (com.facebook.presto.common.Page)2 TaskManagerConfig (com.facebook.presto.execution.TaskManagerConfig)2 MemoryManagerConfig (com.facebook.presto.memory.MemoryManagerConfig)2 Driver (com.facebook.presto.operator.Driver)2 LookupJoinOperators (com.facebook.presto.operator.LookupJoinOperators)2 NoOpFragmentResultCacheManager (com.facebook.presto.operator.NoOpFragmentResultCacheManager)2 PagesIndex (com.facebook.presto.operator.PagesIndex)2 TableCommitContext (com.facebook.presto.operator.TableCommitContext)2