Search in sources :

Example 11 with ServerName

use of org.apache.hadoop.hbase.ServerName in project hbase by apache.

the class TestRSGroups method testNamespaceCreateAndAssign.

@Test
public void testNamespaceCreateAndAssign() throws Exception {
    LOG.info("testNamespaceCreateAndAssign");
    String nsName = tablePrefix + "_foo";
    final TableName tableName = TableName.valueOf(nsName, tablePrefix + "_testCreateAndAssign");
    RSGroupInfo appInfo = addGroup("appInfo", 1);
    admin.createNamespace(NamespaceDescriptor.create(nsName).addConfiguration(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP, "appInfo").build());
    final HTableDescriptor desc = new HTableDescriptor(tableName);
    desc.addFamily(new HColumnDescriptor("f"));
    admin.createTable(desc);
    //wait for created table to be assigned
    TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() {

        @Override
        public boolean evaluate() throws Exception {
            return getTableRegionMap().get(desc.getTableName()) != null;
        }
    });
    ServerName targetServer = ServerName.parseServerName(appInfo.getServers().iterator().next().toString());
    AdminProtos.AdminService.BlockingInterface rs = ((ClusterConnection) admin.getConnection()).getAdmin(targetServer);
    //verify it was assigned to the right group
    Assert.assertEquals(1, ProtobufUtil.getOnlineRegions(rs).size());
}
Also used : HColumnDescriptor(org.apache.hadoop.hbase.HColumnDescriptor) IOException(java.io.IOException) HTableDescriptor(org.apache.hadoop.hbase.HTableDescriptor) TableName(org.apache.hadoop.hbase.TableName) ClusterConnection(org.apache.hadoop.hbase.client.ClusterConnection) ServerName(org.apache.hadoop.hbase.ServerName) Waiter(org.apache.hadoop.hbase.Waiter) Test(org.junit.Test)

Example 12 with ServerName

use of org.apache.hadoop.hbase.ServerName in project hbase by apache.

the class TestRSGroupsBase method testKillRS.

@Test
public void testKillRS() throws Exception {
    RSGroupInfo appInfo = addGroup("appInfo", 1);
    final TableName tableName = TableName.valueOf(tablePrefix + "_ns", name.getMethodName());
    admin.createNamespace(NamespaceDescriptor.create(tableName.getNamespaceAsString()).addConfiguration(RSGroupInfo.NAMESPACE_DESC_PROP_GROUP, appInfo.getName()).build());
    final HTableDescriptor desc = new HTableDescriptor(tableName);
    desc.addFamily(new HColumnDescriptor("f"));
    admin.createTable(desc);
    //wait for created table to be assigned
    TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() {

        @Override
        public boolean evaluate() throws Exception {
            return getTableRegionMap().get(desc.getTableName()) != null;
        }
    });
    ServerName targetServer = ServerName.parseServerName(appInfo.getServers().iterator().next().toString());
    AdminProtos.AdminService.BlockingInterface targetRS = ((ClusterConnection) admin.getConnection()).getAdmin(targetServer);
    HRegionInfo targetRegion = ProtobufUtil.getOnlineRegions(targetRS).get(0);
    Assert.assertEquals(1, ProtobufUtil.getOnlineRegions(targetRS).size());
    try {
        //stopping may cause an exception
        //due to the connection loss
        targetRS.stopServer(null, AdminProtos.StopServerRequest.newBuilder().setReason("Die").build());
    } catch (Exception e) {
    }
    assertFalse(cluster.getClusterStatus().getServers().contains(targetServer));
    //wait for created table to be assigned
    TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() {

        @Override
        public boolean evaluate() throws Exception {
            return cluster.getClusterStatus().getRegionsInTransition().isEmpty();
        }
    });
    Set<Address> newServers = Sets.newHashSet();
    newServers.add(rsGroupAdmin.getRSGroupInfo(RSGroupInfo.DEFAULT_GROUP).getServers().iterator().next());
    rsGroupAdmin.moveServers(newServers, appInfo.getName());
    //Make sure all the table's regions get reassigned
    //disabling the table guarantees no conflicting assign/unassign (ie SSH) happens
    admin.disableTable(tableName);
    admin.enableTable(tableName);
    //wait for region to be assigned
    TEST_UTIL.waitFor(WAIT_TIMEOUT, new Waiter.Predicate<Exception>() {

        @Override
        public boolean evaluate() throws Exception {
            return cluster.getClusterStatus().getRegionsInTransition().isEmpty();
        }
    });
    targetServer = ServerName.parseServerName(newServers.iterator().next().toString());
    targetRS = ((ClusterConnection) admin.getConnection()).getAdmin(targetServer);
    Assert.assertEquals(1, ProtobufUtil.getOnlineRegions(targetRS).size());
    Assert.assertEquals(tableName, ProtobufUtil.getOnlineRegions(targetRS).get(0).getTable());
}
Also used : Address(org.apache.hadoop.hbase.net.Address) HColumnDescriptor(org.apache.hadoop.hbase.HColumnDescriptor) IOException(java.io.IOException) ConstraintException(org.apache.hadoop.hbase.constraint.ConstraintException) HTableDescriptor(org.apache.hadoop.hbase.HTableDescriptor) HRegionInfo(org.apache.hadoop.hbase.HRegionInfo) TableName(org.apache.hadoop.hbase.TableName) ClusterConnection(org.apache.hadoop.hbase.client.ClusterConnection) ServerName(org.apache.hadoop.hbase.ServerName) Waiter(org.apache.hadoop.hbase.Waiter) Test(org.junit.Test)

Example 13 with ServerName

use of org.apache.hadoop.hbase.ServerName in project hbase by apache.

the class RSGroupAdminServer method getRSGroupAssignmentsByTable.

private Map<TableName, Map<ServerName, List<HRegionInfo>>> getRSGroupAssignmentsByTable(String groupName) throws IOException {
    Map<TableName, Map<ServerName, List<HRegionInfo>>> result = Maps.newHashMap();
    RSGroupInfo rsGroupInfo = getRSGroupInfo(groupName);
    Map<TableName, Map<ServerName, List<HRegionInfo>>> assignments = Maps.newHashMap();
    for (Map.Entry<HRegionInfo, ServerName> entry : master.getAssignmentManager().getRegionStates().getRegionAssignments().entrySet()) {
        TableName currTable = entry.getKey().getTable();
        ServerName currServer = entry.getValue();
        HRegionInfo currRegion = entry.getKey();
        if (rsGroupInfo.getTables().contains(currTable)) {
            assignments.putIfAbsent(currTable, new HashMap<>());
            assignments.get(currTable).putIfAbsent(currServer, new ArrayList<>());
            assignments.get(currTable).get(currServer).add(currRegion);
        }
    }
    Map<ServerName, List<HRegionInfo>> serverMap = Maps.newHashMap();
    for (ServerName serverName : master.getServerManager().getOnlineServers().keySet()) {
        if (rsGroupInfo.getServers().contains(serverName.getAddress())) {
            serverMap.put(serverName, Collections.emptyList());
        }
    }
    // add all tables that are members of the group
    for (TableName tableName : rsGroupInfo.getTables()) {
        if (assignments.containsKey(tableName)) {
            result.put(tableName, new HashMap<>());
            result.get(tableName).putAll(serverMap);
            result.get(tableName).putAll(assignments.get(tableName));
            LOG.debug("Adding assignments for " + tableName + ": " + assignments.get(tableName));
        }
    }
    return result;
}
Also used : HRegionInfo(org.apache.hadoop.hbase.HRegionInfo) TableName(org.apache.hadoop.hbase.TableName) ServerName(org.apache.hadoop.hbase.ServerName) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map)

Example 14 with ServerName

use of org.apache.hadoop.hbase.ServerName in project hbase by apache.

the class ActiveMasterManager method blockUntilBecomingActiveMaster.

/**
   * Block until becoming the active master.
   *
   * Method blocks until there is not another active master and our attempt
   * to become the new active master is successful.
   *
   * This also makes sure that we are watching the master znode so will be
   * notified if another master dies.
   * @param checkInterval the interval to check if the master is stopped
   * @param startupStatus the monitor status to track the progress
   * @return True if no issue becoming active master else false if another
   * master was running or if some other problem (zookeeper, stop flag has been
   * set on this Master)
   */
boolean blockUntilBecomingActiveMaster(int checkInterval, MonitoredTask startupStatus) {
    String backupZNode = ZKUtil.joinZNode(this.watcher.znodePaths.backupMasterAddressesZNode, this.sn.toString());
    while (!(master.isAborted() || master.isStopped())) {
        startupStatus.setStatus("Trying to register in ZK as active master");
        // Write out our ServerName as versioned bytes.
        try {
            if (MasterAddressTracker.setMasterAddress(this.watcher, this.watcher.znodePaths.masterAddressZNode, this.sn, infoPort)) {
                // master directory since we are the active now)
                if (ZKUtil.checkExists(this.watcher, backupZNode) != -1) {
                    LOG.info("Deleting ZNode for " + backupZNode + " from backup master directory");
                    ZKUtil.deleteNodeFailSilent(this.watcher, backupZNode);
                }
                // Save the znode in a file, this will allow to check if we crash in the launch scripts
                ZNodeClearer.writeMyEphemeralNodeOnDisk(this.sn.toString());
                // We are the master, return
                startupStatus.setStatus("Successfully registered as active master.");
                this.clusterHasActiveMaster.set(true);
                LOG.info("Registered Active Master=" + this.sn);
                return true;
            }
            // There is another active master running elsewhere or this is a restart
            // and the master ephemeral node has not expired yet.
            this.clusterHasActiveMaster.set(true);
            String msg;
            byte[] bytes = ZKUtil.getDataAndWatch(this.watcher, this.watcher.znodePaths.masterAddressZNode);
            if (bytes == null) {
                msg = ("A master was detected, but went down before its address " + "could be read.  Attempting to become the next active master");
            } else {
                ServerName currentMaster;
                try {
                    currentMaster = ProtobufUtil.parseServerNameFrom(bytes);
                } catch (DeserializationException e) {
                    LOG.warn("Failed parse", e);
                    // Hopefully next time around we won't fail the parse.  Dangerous.
                    continue;
                }
                if (ServerName.isSameHostnameAndPort(currentMaster, this.sn)) {
                    msg = ("Current master has this master's address, " + currentMaster + "; master was restarted? Deleting node.");
                    // Hurry along the expiration of the znode.
                    ZKUtil.deleteNode(this.watcher, this.watcher.znodePaths.masterAddressZNode);
                    // We may have failed to delete the znode at the previous step, but
                    //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.
                    ZNodeClearer.deleteMyEphemeralNodeOnDisk();
                } else {
                    msg = "Another master is the active master, " + currentMaster + "; waiting to become the next active master";
                }
            }
            LOG.info(msg);
            startupStatus.setStatus(msg);
        } catch (KeeperException ke) {
            master.abort("Received an unexpected KeeperException, aborting", ke);
            return false;
        }
        synchronized (this.clusterHasActiveMaster) {
            while (clusterHasActiveMaster.get() && !master.isStopped()) {
                try {
                    clusterHasActiveMaster.wait(checkInterval);
                } catch (InterruptedException e) {
                    // We expect to be interrupted when a master dies,
                    //  will fall out if so
                    LOG.debug("Interrupted waiting for master to die", e);
                }
            }
            if (clusterShutDown.get()) {
                this.master.stop("Cluster went down before this master became active");
            }
        }
    }
    return false;
}
Also used : ServerName(org.apache.hadoop.hbase.ServerName) DeserializationException(org.apache.hadoop.hbase.exceptions.DeserializationException) KeeperException(org.apache.zookeeper.KeeperException)

Example 15 with ServerName

use of org.apache.hadoop.hbase.ServerName in project hbase by apache.

the class ActiveMasterManager method stop.

public void stop() {
    try {
        synchronized (clusterHasActiveMaster) {
            // Master is already stopped, wake up the manager
            // thread so that it can shutdown soon.
            clusterHasActiveMaster.notifyAll();
        }
        // If our address is in ZK, delete it on our way out
        ServerName activeMaster = null;
        try {
            activeMaster = MasterAddressTracker.getMasterAddress(this.watcher);
        } catch (IOException e) {
            LOG.warn("Failed get of master address: " + e.toString());
        }
        if (activeMaster != null && activeMaster.equals(this.sn)) {
            ZKUtil.deleteNode(watcher, watcher.znodePaths.masterAddressZNode);
            // We may have failed to delete the znode at the previous step, but
            //  we delete the file anyway: a second attempt to delete the znode is likely to fail again.
            ZNodeClearer.deleteMyEphemeralNodeOnDisk();
        }
    } catch (KeeperException e) {
        LOG.error(this.watcher.prefix("Error deleting our own master address node"), e);
    }
}
Also used : ServerName(org.apache.hadoop.hbase.ServerName) IOException(java.io.IOException) KeeperException(org.apache.zookeeper.KeeperException)

Aggregations

ServerName (org.apache.hadoop.hbase.ServerName)426 HRegionInfo (org.apache.hadoop.hbase.HRegionInfo)202 Test (org.junit.Test)163 ArrayList (java.util.ArrayList)97 TableName (org.apache.hadoop.hbase.TableName)89 IOException (java.io.IOException)87 HashMap (java.util.HashMap)81 List (java.util.List)72 Map (java.util.Map)54 HRegionLocation (org.apache.hadoop.hbase.HRegionLocation)45 HTableDescriptor (org.apache.hadoop.hbase.HTableDescriptor)34 Table (org.apache.hadoop.hbase.client.Table)33 HashSet (java.util.HashSet)32 TreeMap (java.util.TreeMap)31 HColumnDescriptor (org.apache.hadoop.hbase.HColumnDescriptor)29 Configuration (org.apache.hadoop.conf.Configuration)26 HRegionServer (org.apache.hadoop.hbase.regionserver.HRegionServer)26 Pair (org.apache.hadoop.hbase.util.Pair)24 KeeperException (org.apache.zookeeper.KeeperException)23 InterruptedIOException (java.io.InterruptedIOException)22