/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package gobblin.data.management.copy; import java.util.Map; import com.google.common.collect.ImmutableMap; import com.typesafe.config.Config; import gobblin.util.StringParsingUtils; import gobblin.util.request_allocation.ResourcePool; import gobblin.util.request_allocation.ResourceRequirement; import lombok.Singular; /** * A {@link ResourcePool} for resources used in distcp: total bytes to copy, total number of {@link CopyEntity}s. */ public class CopyResourcePool extends ResourcePool { public static final String SIZE_KEY = "size"; public static final String DEFAULT_MAX_SIZE = "10TB"; public static final String ENTITIES_KEY = "copyEntities"; public static final int DEFAULT_MAX_ENTITIES = 20000; public static final String TOLERANCE_KEY = "boundTolerance"; public static final double DEFAULT_TOLERANCE = 2.; private static final String ENTITIES_DIMENSION = "entities"; private static final String BYTES_DIMENSION = "bytesCopied"; /** * Parse a {@link CopyResourcePool} from an input {@link Config}. */ public static CopyResourcePool fromConfig(Config limitedScopeConfig) { try { String sizeStr = limitedScopeConfig.hasPath(SIZE_KEY) ? limitedScopeConfig.getString(SIZE_KEY) : DEFAULT_MAX_SIZE; long maxSize = StringParsingUtils.humanReadableToByteCount(sizeStr); int maxEntities = limitedScopeConfig.hasPath(ENTITIES_KEY) ? limitedScopeConfig.getInt(ENTITIES_KEY) : DEFAULT_MAX_ENTITIES; double tolerance = limitedScopeConfig.hasPath(TOLERANCE_KEY) ? limitedScopeConfig.getDouble(TOLERANCE_KEY) : DEFAULT_TOLERANCE; return new CopyResourcePool(ImmutableMap.of(ENTITIES_DIMENSION, (double) maxEntities, BYTES_DIMENSION, (double) maxSize), ImmutableMap.of(ENTITIES_DIMENSION, tolerance, BYTES_DIMENSION, tolerance), ImmutableMap.<String, Double>of()); } catch (StringParsingUtils.FormatException fe) { throw new RuntimeException(fe); } } private CopyResourcePool(@Singular Map<String, Double> maxResources, @Singular Map<String, Double> tolerances, @Singular Map<String, Double> defaults) { super(maxResources, tolerances, defaults); } private CopyResourcePool(ResourcePool other) { super(other); } @Override public ResourceRequirement.Builder getResourceRequirementBuilder() { return getCopyResourceRequirementBuilder(); } public CopyResourceRequirementBuilder getCopyResourceRequirementBuilder() { return new CopyResourceRequirementBuilder(this); } @Override protected ResourcePool contractPool(ResourceRequirement requirement) { ResourcePool superPool = super.contractPool(requirement); return new CopyResourcePool(superPool); } public class CopyResourceRequirementBuilder extends ResourceRequirement.Builder { private CopyResourceRequirementBuilder(CopyResourcePool pool) { super(pool); } /** * Set number of {@link CopyEntity}s in {@link gobblin.data.management.partition.FileSet}. */ public CopyResourceRequirementBuilder setEntities(int numberOfEntities) { setRequirement(ENTITIES_DIMENSION, (double) numberOfEntities); return this; } /** * Set total bytes to copy in {@link gobblin.data.management.partition.FileSet}. */ public CopyResourceRequirementBuilder setBytes(long totalBytes) { setRequirement(BYTES_DIMENSION, (double) totalBytes); return this; } } }