Search in sources :

Example 1 with ShardMetadata

use of com.facebook.presto.raptor.metadata.ShardMetadata in project presto by prestodb.

the class ShardOrganizerUtil method getOrganizationEligibleShards.

public static Collection<ShardIndexInfo> getOrganizationEligibleShards(IDBI dbi, MetadataDao metadataDao, Table tableInfo, Collection<ShardMetadata> shards, boolean includeSortColumns) {
    Map<Long, ShardMetadata> shardsById = uniqueIndex(shards, ShardMetadata::getShardId);
    long tableId = tableInfo.getTableId();
    ImmutableList.Builder<String> columnsBuilder = ImmutableList.builder();
    columnsBuilder.add("shard_id");
    // include temporal columns if present
    Optional<TableColumn> temporalColumn = Optional.empty();
    if (tableInfo.getTemporalColumnId().isPresent()) {
        long temporalColumnId = tableInfo.getTemporalColumnId().getAsLong();
        temporalColumn = Optional.of(metadataDao.getTableColumn(tableId, temporalColumnId));
        columnsBuilder.add(minColumn(temporalColumnId), maxColumn(temporalColumnId));
    }
    // include sort columns if needed
    Optional<List<TableColumn>> sortColumns = Optional.empty();
    if (includeSortColumns) {
        sortColumns = Optional.of(metadataDao.listSortColumns(tableId));
        for (TableColumn column : sortColumns.get()) {
            columnsBuilder.add(minColumn(column.getColumnId()), maxColumn(column.getColumnId()));
        }
    }
    String columnToSelect = Joiner.on(",\n").join(columnsBuilder.build());
    ImmutableList.Builder<ShardIndexInfo> indexInfoBuilder = ImmutableList.builder();
    try (Connection connection = dbi.open().getConnection()) {
        for (List<ShardMetadata> partitionedShards : partition(shards, 1000)) {
            String shardIds = Joiner.on(",").join(nCopies(partitionedShards.size(), "?"));
            String sql = format("" + "SELECT %s\n" + "FROM %s\n" + "WHERE shard_id IN (%s)", columnToSelect, shardIndexTable(tableId), shardIds);
            try (PreparedStatement statement = connection.prepareStatement(sql)) {
                for (int i = 0; i < partitionedShards.size(); i++) {
                    statement.setLong(i + 1, partitionedShards.get(i).getShardId());
                }
                try (ResultSet resultSet = statement.executeQuery()) {
                    while (resultSet.next()) {
                        long shardId = resultSet.getLong("shard_id");
                        Optional<ShardRange> sortRange = Optional.empty();
                        if (includeSortColumns) {
                            sortRange = getShardRange(sortColumns.get(), resultSet);
                            if (!sortRange.isPresent()) {
                                continue;
                            }
                        }
                        Optional<ShardRange> temporalRange = Optional.empty();
                        if (temporalColumn.isPresent()) {
                            temporalRange = getShardRange(ImmutableList.of(temporalColumn.get()), resultSet);
                            if (!temporalRange.isPresent()) {
                                continue;
                            }
                        }
                        ShardMetadata shardMetadata = shardsById.get(shardId);
                        indexInfoBuilder.add(toShardIndexInfo(shardMetadata, temporalRange, sortRange));
                    }
                }
            }
        }
    } catch (SQLException e) {
        throw Throwables.propagate(e);
    }
    return indexInfoBuilder.build();
}
Also used : SQLException(java.sql.SQLException) ImmutableList(com.google.common.collect.ImmutableList) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) Connection(java.sql.Connection) PreparedStatement(java.sql.PreparedStatement) TableColumn(com.facebook.presto.raptor.metadata.TableColumn) ResultSet(java.sql.ResultSet) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List)

Example 2 with ShardMetadata

use of com.facebook.presto.raptor.metadata.ShardMetadata in project presto by prestodb.

the class ShardCompactionManager method filterAndCreateCompactionSets.

private Collection<OrganizationSet> filterAndCreateCompactionSets(long tableId, Collection<ShardMetadata> tableShards) {
    Table tableInfo = metadataDao.getTableInformation(tableId);
    OptionalLong temporalColumnId = tableInfo.getTemporalColumnId();
    if (temporalColumnId.isPresent()) {
        TableColumn tableColumn = metadataDao.getTableColumn(tableId, temporalColumnId.getAsLong());
        if (!isValidTemporalColumn(tableId, tableColumn.getDataType())) {
            return ImmutableSet.of();
        }
    }
    Set<ShardMetadata> filteredShards = tableShards.stream().filter(this::needsCompaction).filter(shard -> !organizer.inProgress(shard.getShardUuid())).collect(toSet());
    Collection<ShardIndexInfo> shardIndexInfos = getOrganizationEligibleShards(dbi, metadataDao, tableInfo, filteredShards, false);
    if (tableInfo.getTemporalColumnId().isPresent()) {
        Set<ShardIndexInfo> temporalShards = shardIndexInfos.stream().filter(shard -> shard.getTemporalRange().isPresent()).collect(toSet());
        return compactionSetCreator.createCompactionSets(tableInfo, temporalShards);
    }
    return compactionSetCreator.createCompactionSets(tableInfo, shardIndexInfos);
}
Also used : IDBI(org.skife.jdbi.v2.IDBI) ListMultimap(com.google.common.collect.ListMultimap) Logger(io.airlift.log.Logger) ForMetadata(com.facebook.presto.raptor.metadata.ForMetadata) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Multimaps(com.google.common.collect.Multimaps) Duration(io.airlift.units.Duration) Inject(javax.inject.Inject) PreDestroy(javax.annotation.PreDestroy) OptionalLong(java.util.OptionalLong) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) Executors.newScheduledThreadPool(java.util.concurrent.Executors.newScheduledThreadPool) Type(com.facebook.presto.spi.type.Type) Threads.daemonThreadsNamed(io.airlift.concurrent.Threads.daemonThreadsNamed) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Objects.requireNonNull(java.util.Objects.requireNonNull) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ShardManager(com.facebook.presto.raptor.metadata.ShardManager) DatabaseUtil.onDemandDao(com.facebook.presto.raptor.util.DatabaseUtil.onDemandDao) TIMESTAMP(com.facebook.presto.spi.type.TimestampType.TIMESTAMP) TableColumn(com.facebook.presto.raptor.metadata.TableColumn) Collectors.toSet(java.util.stream.Collectors.toSet) Table(com.facebook.presto.raptor.metadata.Table) ImmutableSet(com.google.common.collect.ImmutableSet) NodeManager(com.facebook.presto.spi.NodeManager) Collection(java.util.Collection) Set(java.util.Set) StorageManagerConfig(com.facebook.presto.raptor.storage.StorageManagerConfig) MetadataDao(com.facebook.presto.raptor.metadata.MetadataDao) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) TimeUnit(java.util.concurrent.TimeUnit) DataSize(io.airlift.units.DataSize) List(java.util.List) ShardOrganizerUtil.getOrganizationEligibleShards(com.facebook.presto.raptor.storage.organization.ShardOrganizerUtil.getOrganizationEligibleShards) DATE(com.facebook.presto.spi.type.DateType.DATE) PostConstruct(javax.annotation.PostConstruct) Entry(java.util.Map.Entry) SECONDS(java.util.concurrent.TimeUnit.SECONDS) Table(com.facebook.presto.raptor.metadata.Table) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) OptionalLong(java.util.OptionalLong) TableColumn(com.facebook.presto.raptor.metadata.TableColumn)

Example 3 with ShardMetadata

use of com.facebook.presto.raptor.metadata.ShardMetadata in project presto by prestodb.

the class TestShardOrganizerUtil method testGetOrganizationEligibleShards.

@Test
public void testGetOrganizationEligibleShards() throws Exception {
    int day1 = 1111;
    int day2 = 2222;
    SchemaTableName tableName = new SchemaTableName("default", "test");
    metadata.createTable(SESSION, tableMetadataBuilder(tableName).column("orderkey", BIGINT).column("orderdate", DATE).column("orderstatus", createVarcharType(3)).property("ordering", ImmutableList.of("orderstatus", "orderkey")).property("temporal_column", "orderdate").build());
    Table tableInfo = metadataDao.getTableInformation(tableName.getSchemaName(), tableName.getTableName());
    List<TableColumn> tableColumns = metadataDao.listTableColumns(tableInfo.getTableId());
    Map<String, TableColumn> tableColumnMap = Maps.uniqueIndex(tableColumns, TableColumn::getColumnName);
    long orderDate = tableColumnMap.get("orderdate").getColumnId();
    long orderKey = tableColumnMap.get("orderkey").getColumnId();
    long orderStatus = tableColumnMap.get("orderstatus").getColumnId();
    List<ShardInfo> shards = ImmutableList.<ShardInfo>builder().add(shardInfo(UUID.randomUUID(), "node1", ImmutableList.of(new ColumnStats(orderDate, day1, day1 + 10), new ColumnStats(orderKey, 13L, 14L), new ColumnStats(orderStatus, "aaa", "abc")))).add(shardInfo(UUID.randomUUID(), "node1", ImmutableList.of(new ColumnStats(orderDate, day2, day2 + 100), new ColumnStats(orderKey, 2L, 20L), new ColumnStats(orderStatus, "aaa", "abc")))).add(shardInfo(UUID.randomUUID(), "node1", ImmutableList.of(new ColumnStats(orderDate, day1, day2), new ColumnStats(orderKey, 2L, 11L), new ColumnStats(orderStatus, "aaa", "abc")))).add(shardInfo(UUID.randomUUID(), "node1", ImmutableList.of(new ColumnStats(orderDate, day1, day2), new ColumnStats(orderKey, 2L, null), new ColumnStats(orderStatus, "aaa", "abc")))).add(shardInfo(UUID.randomUUID(), "node1", ImmutableList.of(new ColumnStats(orderDate, day1, null), new ColumnStats(orderKey, 2L, 11L), new ColumnStats(orderStatus, "aaa", "abc")))).build();
    long transactionId = shardManager.beginTransaction();
    shardManager.commitShards(transactionId, tableInfo.getTableId(), COLUMNS, shards, Optional.empty(), 0);
    Set<ShardMetadata> shardMetadatas = shardManager.getNodeShards("node1");
    Long temporalColumnId = metadataDao.getTemporalColumnId(tableInfo.getTableId());
    TableColumn temporalColumn = metadataDao.getTableColumn(tableInfo.getTableId(), temporalColumnId);
    Set<ShardIndexInfo> actual = ImmutableSet.copyOf(getOrganizationEligibleShards(dbi, metadataDao, tableInfo, shardMetadatas, false));
    List<ShardIndexInfo> expected = getShardIndexInfo(tableInfo, shards, temporalColumn, Optional.empty());
    assertEquals(actual, expected);
    List<TableColumn> sortColumns = metadataDao.listSortColumns(tableInfo.getTableId());
    Set<ShardIndexInfo> actualSortRange = ImmutableSet.copyOf(getOrganizationEligibleShards(dbi, metadataDao, tableInfo, shardMetadatas, true));
    List<ShardIndexInfo> expectedSortRange = getShardIndexInfo(tableInfo, shards, temporalColumn, Optional.of(sortColumns));
    assertEquals(actualSortRange, expectedSortRange);
}
Also used : Table(com.facebook.presto.raptor.metadata.Table) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) SchemaTableName(com.facebook.presto.spi.SchemaTableName) TableColumn(com.facebook.presto.raptor.metadata.TableColumn) ColumnStats(com.facebook.presto.raptor.metadata.ColumnStats) ShardInfo(com.facebook.presto.raptor.metadata.ShardInfo) Test(org.testng.annotations.Test)

Example 4 with ShardMetadata

use of com.facebook.presto.raptor.metadata.ShardMetadata in project presto by prestodb.

the class ShardRecoveryManager method enqueueMissingShards.

private synchronized void enqueueMissingShards() {
    try {
        for (ShardMetadata shard : getMissingShards()) {
            stats.incrementBackgroundShardRecovery();
            Futures.addCallback(shardQueue.submit(MissingShard.createBackgroundMissingShard(shard.getShardUuid(), shard.getCompressedSize())), failureCallback(t -> log.warn(t, "Error recovering shard: %s", shard.getShardUuid())));
        }
    } catch (Throwable t) {
        log.error(t, "Error creating shard recovery tasks");
    }
}
Also used : LoadingCache(com.google.common.cache.LoadingCache) Duration(io.airlift.units.Duration) PreDestroy(javax.annotation.PreDestroy) Future(java.util.concurrent.Future) Executors.newScheduledThreadPool(java.util.concurrent.Executors.newScheduledThreadPool) Duration.nanosSince(io.airlift.units.Duration.nanosSince) ShardManager(com.facebook.presto.raptor.metadata.ShardManager) DataSize.succinctDataSize(io.airlift.units.DataSize.succinctDataSize) Collectors.toSet(java.util.stream.Collectors.toSet) NodeManager(com.facebook.presto.spi.NodeManager) Set(java.util.Set) RAPTOR_RECOVERY_ERROR(com.facebook.presto.raptor.RaptorErrorCode.RAPTOR_RECOVERY_ERROR) UUID(java.util.UUID) MoreExecutors.directExecutor(com.google.common.util.concurrent.MoreExecutors.directExecutor) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) CacheLoader(com.google.common.cache.CacheLoader) Objects(java.util.Objects) DataSize(io.airlift.units.DataSize) PostConstruct(javax.annotation.PostConstruct) Optional(java.util.Optional) CacheBuilder(com.google.common.cache.CacheBuilder) MoreObjects.toStringHelper(com.google.common.base.MoreObjects.toStringHelper) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) Logger(io.airlift.log.Logger) Flatten(org.weakref.jmx.Flatten) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) DataSize.succinctBytes(io.airlift.units.DataSize.succinctBytes) BackupStore(com.facebook.presto.raptor.backup.BackupStore) PrestoException(com.facebook.presto.spi.PrestoException) Inject(javax.inject.Inject) OptionalLong(java.util.OptionalLong) Managed(org.weakref.jmx.Managed) Threads.daemonThreadsNamed(io.airlift.concurrent.Threads.daemonThreadsNamed) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Objects.requireNonNull(java.util.Objects.requireNonNull) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ExecutorService(java.util.concurrent.ExecutorService) PrioritizedFifoExecutor(com.facebook.presto.raptor.util.PrioritizedFifoExecutor) ATOMIC_MOVE(java.nio.file.StandardCopyOption.ATOMIC_MOVE) Files(java.nio.file.Files) IOException(java.io.IOException) FileAlreadyExistsException(java.nio.file.FileAlreadyExistsException) FutureCallback(com.google.common.util.concurrent.FutureCallback) File(java.io.File) ExecutionException(java.util.concurrent.ExecutionException) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) Futures(com.google.common.util.concurrent.Futures) Executors.newCachedThreadPool(java.util.concurrent.Executors.newCachedThreadPool) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Comparator(java.util.Comparator) BYTE(io.airlift.units.DataSize.Unit.BYTE) SECONDS(java.util.concurrent.TimeUnit.SECONDS) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata)

Example 5 with ShardMetadata

use of com.facebook.presto.raptor.metadata.ShardMetadata in project presto by prestodb.

the class ShardOrganizationManager method runOrganization.

private void runOrganization(long tableId) {
    Set<ShardMetadata> shardMetadatas = shardManager.getNodeShards(currentNodeIdentifier, tableId);
    Table tableInfo = metadataDao.getTableInformation(tableId);
    Set<ShardMetadata> filteredShards = shardMetadatas.stream().filter(shard -> !organizer.inProgress(shard.getShardUuid())).collect(toSet());
    Collection<ShardIndexInfo> indexInfos = getOrganizationEligibleShards(dbi, metadataDao, tableInfo, filteredShards, true);
    Set<OrganizationSet> organizationSets = createOrganizationSets(tableInfo, indexInfos);
    if (organizationSets.isEmpty()) {
        return;
    }
    log.info("Created %s organization set(s) from %s shards for table ID %s", organizationSets.size(), filteredShards.size(), tableId);
    long lastStartTime = System.currentTimeMillis();
    tablesInProgress.add(tableId);
    ImmutableList.Builder<CompletableFuture<?>> futures = ImmutableList.builder();
    for (OrganizationSet organizationSet : organizationSets) {
        futures.add(organizer.enqueue(organizationSet));
    }
    allAsList(futures.build()).whenComplete((value, throwable) -> {
        tablesInProgress.remove(tableId);
        organizerDao.updateLastStartTime(currentNodeIdentifier, tableId, lastStartTime);
    });
}
Also used : IDBI(org.skife.jdbi.v2.IDBI) MoreFutures.allAsList(io.airlift.concurrent.MoreFutures.allAsList) Logger(io.airlift.log.Logger) ForMetadata(com.facebook.presto.raptor.metadata.ForMetadata) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CompletableFuture(java.util.concurrent.CompletableFuture) MINUTES(java.util.concurrent.TimeUnit.MINUTES) Duration(io.airlift.units.Duration) Inject(javax.inject.Inject) HashSet(java.util.HashSet) PreDestroy(javax.annotation.PreDestroy) Sets.difference(com.google.common.collect.Sets.difference) ImmutableList(com.google.common.collect.ImmutableList) Executors.newScheduledThreadPool(java.util.concurrent.Executors.newScheduledThreadPool) Threads.daemonThreadsNamed(io.airlift.concurrent.Threads.daemonThreadsNamed) Map(java.util.Map) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Objects.requireNonNull(java.util.Objects.requireNonNull) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ShardManager(com.facebook.presto.raptor.metadata.ShardManager) DatabaseUtil.onDemandDao(com.facebook.presto.raptor.util.DatabaseUtil.onDemandDao) Collectors.toSet(java.util.stream.Collectors.toSet) Table(com.facebook.presto.raptor.metadata.Table) ImmutableSet(com.google.common.collect.ImmutableSet) ShardOrganizerUtil.getShardsByDaysBuckets(com.facebook.presto.raptor.storage.organization.ShardOrganizerUtil.getShardsByDaysBuckets) NodeManager(com.facebook.presto.spi.NodeManager) Collection(java.util.Collection) Sets.newConcurrentHashSet(com.google.common.collect.Sets.newConcurrentHashSet) Set(java.util.Set) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) StorageManagerConfig(com.facebook.presto.raptor.storage.StorageManagerConfig) ComparisonChain(com.google.common.collect.ComparisonChain) Maps(com.google.common.collect.Maps) MetadataDao(com.facebook.presto.raptor.metadata.MetadataDao) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) List(java.util.List) ShardOrganizerUtil.getOrganizationEligibleShards(com.facebook.presto.raptor.storage.organization.ShardOrganizerUtil.getOrganizationEligibleShards) Collectors.toList(java.util.stream.Collectors.toList) ShardOrganizerUtil.createOrganizationSet(com.facebook.presto.raptor.storage.organization.ShardOrganizerUtil.createOrganizationSet) PostConstruct(javax.annotation.PostConstruct) Math.max(java.lang.Math.max) VisibleForTesting(com.google.common.annotations.VisibleForTesting) SECONDS(java.util.concurrent.TimeUnit.SECONDS) CompletableFuture(java.util.concurrent.CompletableFuture) Table(com.facebook.presto.raptor.metadata.Table) ImmutableList(com.google.common.collect.ImmutableList) ShardMetadata(com.facebook.presto.raptor.metadata.ShardMetadata) ShardOrganizerUtil.createOrganizationSet(com.facebook.presto.raptor.storage.organization.ShardOrganizerUtil.createOrganizationSet)

Aggregations

ShardMetadata (com.facebook.presto.raptor.metadata.ShardMetadata)6 ShardManager (com.facebook.presto.raptor.metadata.ShardManager)3 Table (com.facebook.presto.raptor.metadata.Table)3 TableColumn (com.facebook.presto.raptor.metadata.TableColumn)3 NodeManager (com.facebook.presto.spi.NodeManager)3 VisibleForTesting (com.google.common.annotations.VisibleForTesting)3 Threads.daemonThreadsNamed (io.airlift.concurrent.Threads.daemonThreadsNamed)3 Logger (io.airlift.log.Logger)3 Duration (io.airlift.units.Duration)3 Objects.requireNonNull (java.util.Objects.requireNonNull)3 Set (java.util.Set)3 Executors.newScheduledThreadPool (java.util.concurrent.Executors.newScheduledThreadPool)3 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)3 ThreadLocalRandom (java.util.concurrent.ThreadLocalRandom)3 SECONDS (java.util.concurrent.TimeUnit.SECONDS)3 ForMetadata (com.facebook.presto.raptor.metadata.ForMetadata)2 MetadataDao (com.facebook.presto.raptor.metadata.MetadataDao)2 StorageManagerConfig (com.facebook.presto.raptor.storage.StorageManagerConfig)2 ShardOrganizerUtil.getOrganizationEligibleShards (com.facebook.presto.raptor.storage.organization.ShardOrganizerUtil.getOrganizationEligibleShards)2 DatabaseUtil.onDemandDao (com.facebook.presto.raptor.util.DatabaseUtil.onDemandDao)2