Search in sources :

Example 1 with AccumuloSecurityException

use of org.apache.accumulo.core.client.AccumuloSecurityException in project hive by apache.

the class HiveAccumuloTableInputFormat method getSplits.

@Override
public InputSplit[] getSplits(JobConf jobConf, int numSplits) throws IOException {
    final AccumuloConnectionParameters accumuloParams = new AccumuloConnectionParameters(jobConf);
    final Instance instance = accumuloParams.getInstance();
    final ColumnMapper columnMapper;
    try {
        columnMapper = getColumnMapper(jobConf);
    } catch (TooManyAccumuloColumnsException e) {
        throw new IOException(e);
    }
    JobContext context = ShimLoader.getHadoopShims().newJobContext(Job.getInstance(jobConf));
    Path[] tablePaths = FileInputFormat.getInputPaths(context);
    try {
        UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
        final Connector connector;
        // Need to get a Connector so we look up the user's authorizations if not otherwise specified
        if (accumuloParams.useSasl() && !ugi.hasKerberosCredentials()) {
            // In a YARN/Tez job, don't have the Kerberos credentials anymore, use the delegation token
            AuthenticationToken token = ConfiguratorBase.getAuthenticationToken(AccumuloInputFormat.class, jobConf);
            // Convert the stub from the configuration back into a normal Token
            // More reflection to support 1.6
            token = helper.unwrapAuthenticationToken(jobConf, token);
            connector = instance.getConnector(accumuloParams.getAccumuloUserName(), token);
        } else {
            // Still in the local JVM, use the username+password or Kerberos credentials
            connector = accumuloParams.getConnector(instance);
        }
        final List<ColumnMapping> columnMappings = columnMapper.getColumnMappings();
        final List<IteratorSetting> iterators = predicateHandler.getIterators(jobConf, columnMapper);
        final Collection<Range> ranges = predicateHandler.getRanges(jobConf, columnMapper);
        // We don't want that.
        if (null != ranges && ranges.isEmpty()) {
            return new InputSplit[0];
        }
        // Set the relevant information in the Configuration for the AccumuloInputFormat
        configure(jobConf, instance, connector, accumuloParams, columnMapper, iterators, ranges);
        int numColumns = columnMappings.size();
        List<Integer> readColIds = ColumnProjectionUtils.getReadColumnIDs(jobConf);
        // Sanity check
        if (numColumns < readColIds.size())
            throw new IOException("Number of column mappings (" + numColumns + ")" + " numbers less than the hive table columns. (" + readColIds.size() + ")");
        // get splits from Accumulo
        InputSplit[] splits = accumuloInputFormat.getSplits(jobConf, numSplits);
        HiveAccumuloSplit[] hiveSplits = new HiveAccumuloSplit[splits.length];
        for (int i = 0; i < splits.length; i++) {
            RangeInputSplit ris = (RangeInputSplit) splits[i];
            hiveSplits[i] = new HiveAccumuloSplit(ris, tablePaths[0]);
        }
        return hiveSplits;
    } catch (AccumuloException e) {
        log.error("Could not configure AccumuloInputFormat", e);
        throw new IOException(StringUtils.stringifyException(e));
    } catch (AccumuloSecurityException e) {
        log.error("Could not configure AccumuloInputFormat", e);
        throw new IOException(StringUtils.stringifyException(e));
    } catch (SerDeException e) {
        log.error("Could not configure AccumuloInputFormat", e);
        throw new IOException(StringUtils.stringifyException(e));
    }
}
Also used : Connector(org.apache.accumulo.core.client.Connector) AuthenticationToken(org.apache.accumulo.core.client.security.tokens.AuthenticationToken) MockInstance(org.apache.accumulo.core.client.mock.MockInstance) Instance(org.apache.accumulo.core.client.Instance) RangeInputSplit(org.apache.accumulo.core.client.mapred.RangeInputSplit) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) JobContext(org.apache.hadoop.mapreduce.JobContext) RangeInputSplit(org.apache.accumulo.core.client.mapred.RangeInputSplit) InputSplit(org.apache.hadoop.mapred.InputSplit) HiveAccumuloMapColumnMapping(org.apache.hadoop.hive.accumulo.columns.HiveAccumuloMapColumnMapping) ColumnMapping(org.apache.hadoop.hive.accumulo.columns.ColumnMapping) HiveAccumuloColumnMapping(org.apache.hadoop.hive.accumulo.columns.HiveAccumuloColumnMapping) SerDeException(org.apache.hadoop.hive.serde2.SerDeException) UserGroupInformation(org.apache.hadoop.security.UserGroupInformation) Path(org.apache.hadoop.fs.Path) AccumuloException(org.apache.accumulo.core.client.AccumuloException) IOException(java.io.IOException) TooManyAccumuloColumnsException(org.apache.hadoop.hive.accumulo.serde.TooManyAccumuloColumnsException) Range(org.apache.accumulo.core.data.Range) IteratorSetting(org.apache.accumulo.core.client.IteratorSetting) AccumuloConnectionParameters(org.apache.hadoop.hive.accumulo.AccumuloConnectionParameters) ColumnMapper(org.apache.hadoop.hive.accumulo.columns.ColumnMapper)

Example 2 with AccumuloSecurityException

use of org.apache.accumulo.core.client.AccumuloSecurityException in project hive by apache.

the class HiveAccumuloTableOutputFormat method configureAccumuloOutputFormat.

protected void configureAccumuloOutputFormat(JobConf job) throws IOException {
    AccumuloConnectionParameters cnxnParams = getConnectionParams(job);
    final String tableName = job.get(AccumuloSerDeParameters.TABLE_NAME);
    // Make sure we actually go the table name
    Preconditions.checkNotNull(tableName, "Expected Accumulo table name to be provided in job configuration");
    // Set the necessary Accumulo information
    try {
        if (cnxnParams.useMockInstance()) {
            setMockInstanceWithErrorChecking(job, cnxnParams.getAccumuloInstanceName());
        } else {
            // Accumulo instance name with ZK quorum
            setZooKeeperInstanceWithErrorChecking(job, cnxnParams.getAccumuloInstanceName(), cnxnParams.getZooKeepers(), cnxnParams.useSasl());
        }
        // The AccumuloOutputFormat will look for it there.
        if (cnxnParams.useSasl()) {
            UserGroupInformation ugi = getCurrentUser();
            if (!hasKerberosCredentials(ugi)) {
                getHelper().addTokenFromUserToJobConf(ugi, job);
            } else {
                // Still in the local JVM, can use Kerberos credentials
                try {
                    Connector connector = cnxnParams.getConnector();
                    AuthenticationToken token = getHelper().getDelegationToken(connector);
                    // Send the DelegationToken down to the Configuration for Accumulo to use
                    setConnectorInfoWithErrorChecking(job, cnxnParams.getAccumuloUserName(), token);
                    // Convert the Accumulo token in a Hadoop token
                    Token<? extends TokenIdentifier> accumuloToken = getHelper().getHadoopToken(token);
                    log.info("Adding Hadoop Token for Accumulo to Job's Credentials");
                    // Add the Hadoop token to the JobConf
                    getHelper().mergeTokenIntoJobConf(job, accumuloToken);
                    // Make sure the UGI contains the token too for good measure
                    if (!ugi.addToken(accumuloToken)) {
                        throw new IOException("Failed to add Accumulo Token to UGI");
                    }
                } catch (AccumuloException | AccumuloSecurityException e) {
                    throw new IOException("Failed to acquire Accumulo DelegationToken", e);
                }
            }
        } else {
            setConnectorInfoWithErrorChecking(job, cnxnParams.getAccumuloUserName(), new PasswordToken(cnxnParams.getAccumuloPassword()));
        }
        // Set the table where we're writing this data
        setDefaultAccumuloTableName(job, tableName);
    } catch (AccumuloSecurityException e) {
        log.error("Could not connect to Accumulo with provided credentials", e);
        throw new IOException(e);
    }
}
Also used : Connector(org.apache.accumulo.core.client.Connector) AccumuloException(org.apache.accumulo.core.client.AccumuloException) PasswordToken(org.apache.accumulo.core.client.security.tokens.PasswordToken) AuthenticationToken(org.apache.accumulo.core.client.security.tokens.AuthenticationToken) AccumuloConnectionParameters(org.apache.hadoop.hive.accumulo.AccumuloConnectionParameters) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) IOException(java.io.IOException) UserGroupInformation(org.apache.hadoop.security.UserGroupInformation)

Example 3 with AccumuloSecurityException

use of org.apache.accumulo.core.client.AccumuloSecurityException in project YCSB by brianfrankcooper.

the class AccumuloClient method init.

@Override
public void init() throws DBException {
    colFam = new Text(getProperties().getProperty("accumulo.columnFamily"));
    inst = new ZooKeeperInstance(getProperties().getProperty("accumulo.instanceName"), getProperties().getProperty("accumulo.zooKeepers"));
    try {
        String principal = getProperties().getProperty("accumulo.username");
        AuthenticationToken token = new PasswordToken(getProperties().getProperty("accumulo.password"));
        connector = inst.getConnector(principal, token);
    } catch (AccumuloException e) {
        throw new DBException(e);
    } catch (AccumuloSecurityException e) {
        throw new DBException(e);
    }
    if (!(getProperties().getProperty("accumulo.pcFlag", "none").equals("none"))) {
        System.err.println("Sorry, the ZK based producer/consumer implementation has been removed. " + "Please see YCSB issue #416 for work on adding a general solution to coordinated work.");
    }
}
Also used : AccumuloException(org.apache.accumulo.core.client.AccumuloException) DBException(com.yahoo.ycsb.DBException) PasswordToken(org.apache.accumulo.core.client.security.tokens.PasswordToken) AuthenticationToken(org.apache.accumulo.core.client.security.tokens.AuthenticationToken) Text(org.apache.hadoop.io.Text) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) ZooKeeperInstance(org.apache.accumulo.core.client.ZooKeeperInstance)

Example 4 with AccumuloSecurityException

use of org.apache.accumulo.core.client.AccumuloSecurityException in project Gaffer by gchq.

the class IngestUtils method createSplitsFile.

/**
     * Get the existing splits from a table in Accumulo and write a splits file.
     * The number of splits is returned.
     *
     * @param conn       - An existing connection to an Accumulo instance
     * @param table      - The table name
     * @param fs         - The FileSystem in which to create the splits file
     * @param splitsFile - A Path for the output splits file
     * @param maxSplits  - The maximum number of splits
     * @return The number of splits in the table
     * @throws IOException for any IO issues reading from the file system. Other accumulo exceptions are caught and wrapped in an IOException.
     */
public static int createSplitsFile(final Connector conn, final String table, final FileSystem fs, final Path splitsFile, final int maxSplits) throws IOException {
    LOGGER.info("Creating splits file in location {} from table {} with maximum splits {}", splitsFile, table, maxSplits);
    // Get the splits from the table
    Collection<Text> splits;
    try {
        splits = conn.tableOperations().listSplits(table, maxSplits);
    } catch (TableNotFoundException | AccumuloSecurityException | AccumuloException e) {
        throw new IOException(e.getMessage(), e);
    }
    // This should have returned at most maxSplits splits, but this is not implemented properly in MockInstance.
    if (splits.size() > maxSplits) {
        if (conn instanceof MockConnector) {
            LOGGER.info("Manually reducing the number of splits to {} due to MockInstance not implementing" + " listSplits(table, maxSplits) properly", maxSplits);
        } else {
            LOGGER.info("Manually reducing the number of splits to {} (number of splits was {})", maxSplits, splits.size());
        }
        final Collection<Text> filteredSplits = new TreeSet<>();
        final int outputEveryNth = splits.size() / maxSplits;
        LOGGER.info("Outputting every {}-th split from {} total", outputEveryNth, splits.size());
        int i = 0;
        for (final Text text : splits) {
            if (i % outputEveryNth == 0) {
                filteredSplits.add(text);
            }
            i++;
            if (filteredSplits.size() >= maxSplits) {
                break;
            }
        }
        splits = filteredSplits;
    }
    LOGGER.info("Found {} splits from table {}", splits.size(), table);
    try (final PrintStream out = new PrintStream(new BufferedOutputStream(fs.create(splitsFile, true)), false, CommonConstants.UTF_8)) {
        // Write the splits to file
        if (splits.isEmpty()) {
            out.close();
            return 0;
        }
        for (final Text split : splits) {
            out.println(new String(Base64.encodeBase64(split.getBytes()), CommonConstants.UTF_8));
        }
    }
    return splits.size();
}
Also used : AccumuloException(org.apache.accumulo.core.client.AccumuloException) PrintStream(java.io.PrintStream) Text(org.apache.hadoop.io.Text) IOException(java.io.IOException) TableNotFoundException(org.apache.accumulo.core.client.TableNotFoundException) TreeSet(java.util.TreeSet) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) MockConnector(org.apache.accumulo.core.client.mock.MockConnector) BufferedOutputStream(java.io.BufferedOutputStream)

Example 5 with AccumuloSecurityException

use of org.apache.accumulo.core.client.AccumuloSecurityException in project Gaffer by gchq.

the class TableUtils method setLocalityGroups.

public static void setLocalityGroups(final AccumuloStore store) throws StoreException {
    final String tableName = store.getProperties().getTable();
    Map<String, Set<Text>> localityGroups = new HashMap<>();
    for (final String group : store.getSchema().getGroups()) {
        HashSet<Text> localityGroup = new HashSet<>();
        localityGroup.add(new Text(group));
        localityGroups.put(group, localityGroup);
    }
    LOGGER.info("Setting locality groups on table {}", tableName);
    try {
        store.getConnection().tableOperations().setLocalityGroups(tableName, localityGroups);
    } catch (AccumuloException | AccumuloSecurityException | TableNotFoundException e) {
        throw new StoreException(e.getMessage(), e);
    }
}
Also used : AccumuloException(org.apache.accumulo.core.client.AccumuloException) TableNotFoundException(org.apache.accumulo.core.client.TableNotFoundException) HashSet(java.util.HashSet) EnumSet(java.util.EnumSet) Set(java.util.Set) HashMap(java.util.HashMap) Text(org.apache.hadoop.io.Text) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) HashSet(java.util.HashSet) StoreException(uk.gov.gchq.gaffer.store.StoreException)

Aggregations

AccumuloSecurityException (org.apache.accumulo.core.client.AccumuloSecurityException)15 AccumuloException (org.apache.accumulo.core.client.AccumuloException)14 TableNotFoundException (org.apache.accumulo.core.client.TableNotFoundException)8 IOException (java.io.IOException)7 Text (org.apache.hadoop.io.Text)6 Connector (org.apache.accumulo.core.client.Connector)5 StoreException (uk.gov.gchq.gaffer.store.StoreException)5 AuthenticationToken (org.apache.accumulo.core.client.security.tokens.AuthenticationToken)4 PasswordToken (org.apache.accumulo.core.client.security.tokens.PasswordToken)4 PrestoException (com.facebook.presto.spi.PrestoException)3 ZooKeeperInstance (org.apache.accumulo.core.client.ZooKeeperInstance)3 EnumSet (java.util.EnumSet)2 HashMap (java.util.HashMap)2 TreeSet (java.util.TreeSet)2 Instance (org.apache.accumulo.core.client.Instance)2 IteratorSetting (org.apache.accumulo.core.client.IteratorSetting)2 MockConnector (org.apache.accumulo.core.client.mock.MockConnector)2 MockInstance (org.apache.accumulo.core.client.mock.MockInstance)2 Range (org.apache.accumulo.core.data.Range)2 AccumuloConnectionParameters (org.apache.hadoop.hive.accumulo.AccumuloConnectionParameters)2