下面列出了org.apache.hadoop.hbase.ServerName#getPort ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Convert a ServerName to a protocol buffer ServerName
*
* @param serverName the ServerName to convert
* @return the converted protocol buffer ServerName
* @see #toServerName(org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos.ServerName)
*/
public static HBaseProtos.ServerName toServerName(final ServerName serverName) {
if (serverName == null) {
return null;
}
HBaseProtos.ServerName.Builder builder =
HBaseProtos.ServerName.newBuilder();
builder.setHostName(serverName.getHostname());
if (serverName.getPort() >= 0) {
builder.setPort(serverName.getPort());
}
if (serverName.getStartcode() >= 0) {
builder.setStartCode(serverName.getStartcode());
}
return builder.build();
}
/**
* Check if we know if a server is dead.
*
* @param sn the server name to check.
* @return true if we know for sure that the server is dead, false otherwise.
*/
public boolean isDeadServer(ServerName sn) {
if (sn.getStartcode() <= 0) {
return false;
}
for (ServerName dead : deadServers) {
if (dead.getStartcode() >= sn.getStartcode() &&
dead.getPort() == sn.getPort() &&
dead.getHostname().equals(sn.getHostname())) {
return true;
}
}
return false;
}
/**
* Get a unique key for the rpc stub to the given server.
*/
static String getStubKey(String serviceName, ServerName serverName, boolean hostnameCanChange) {
// Sometimes, servers go down and they come back up with the same hostname but a different
// IP address. Force a resolution of the rsHostname by trying to instantiate an
// InetSocketAddress, and this way we will rightfully get a new stubKey.
// Also, include the hostname in the key so as to take care of those cases where the
// DNS name is different but IP address remains the same.
String hostname = serverName.getHostname();
int port = serverName.getPort();
if (hostnameCanChange) {
try {
InetAddress ip = InetAddress.getByName(hostname);
return serviceName + "@" + hostname + "-" + ip.getHostAddress() + ":" + port;
} catch (UnknownHostException e) {
LOG.warn("Can not resolve " + hostname + ", please check your network", e);
}
}
return serviceName + "@" + hostname + ":" + port;
}
/**
* Interrupt the connections to the given ip:port server. This should be called if the server is
* known as actually dead. This will not prevent current operation to be retried, and, depending
* on their own behavior, they may retry on the same server. This can be a feature, for example at
* startup. In any case, they're likely to get connection refused (if the process died) or no
* route to host: i.e. their next retries should be faster and with a safe exception.
*/
@Override
public void cancelConnections(ServerName sn) {
synchronized (connections) {
for (T connection : connections.values()) {
ConnectionId remoteId = connection.remoteId();
if (remoteId.address.getPort() == sn.getPort()
&& remoteId.address.getHostName().equals(sn.getHostname())) {
LOG.info("The server on " + sn.toString() + " is dead - stopping the connection "
+ connection.remoteId);
connections.removeValue(remoteId, connection);
connection.shutdown();
connection.cleanupConnection();
}
}
}
}
@Test
public void testMC_RS() throws Exception {
// move each RS has one region
splitTable("c".getBytes());
ArrayList<ServerName> serverNameList = getServerNameList();
assertTrue(serverNameList.size() >= 2);
ArrayList<HRegionInfo> regionInfoList = getRegionInfoList(tableName);
assertEquals(2, regionInfoList.size());
HRegionInfo regionInfo1 = regionInfoList.get(0);
HRegionInfo regionInfo2 = regionInfoList.get(1);
ServerName serverName1 = serverNameList.get(0);
ServerName serverName2 = serverNameList.get(1);
move(regionInfo1, serverName1);
move(regionInfo2, serverName2);
// make 2 + 2 store files
putData(table, "a".getBytes());
admin.flush(tableName);
putData(table, "b".getBytes());
admin.flush(tableName);
putData(table, "c".getBytes());
admin.flush(tableName);
putData(table, "d".getBytes());
admin.flush(tableName);
Thread.sleep(3000);
assertEquals(2, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
// run MC
String regex = serverName1.getHostname() + "," + serverName1.getPort() + ".*";
String[] argsParam = {"zookeeper", tableName, "--rs=" + regex, "--force-proceed", "--wait", "--test"};
Args args = new ManagerArgs(argsParam);
MC command = new MC(admin, args);
command.run();
assertRegionName(command);
// should be 1 store file
assertEquals(1, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
}
@Test
public void testMC_RS() throws Exception {
// move each RS has one region
splitTable("c".getBytes());
ArrayList<ServerName> serverNameList = getServerNameList();
assertTrue(serverNameList.size() >= 2);
ArrayList<HRegionInfo> regionInfoList = getRegionInfoList(tableName);
assertEquals(2, regionInfoList.size());
HRegionInfo regionInfo1 = regionInfoList.get(0);
HRegionInfo regionInfo2 = regionInfoList.get(1);
ServerName serverName1 = serverNameList.get(0);
ServerName serverName2 = serverNameList.get(1);
move(regionInfo1, serverName1);
move(regionInfo2, serverName2);
// make 2 + 2 store files
putData(table, "a".getBytes());
admin.flush(tableName);
putData(table, "b".getBytes());
admin.flush(tableName);
putData(table, "c".getBytes());
admin.flush(tableName);
putData(table, "d".getBytes());
admin.flush(tableName);
Thread.sleep(3000);
assertEquals(2, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
// run MC
String regex = serverName1.getHostname() + "," + serverName1.getPort() + ".*";
String[] argsParam = {"zookeeper", tableName, "--rs=" + regex, "--force-proceed", "--wait", "--test"};
Args args = new ManagerArgs(argsParam);
MC command = new MC(admin, args);
command.run();
assertRegionName(command);
// should be 1 store file
assertEquals(1, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
}
@Test
public void testMC_RS() throws Exception {
// move each RS has one region
splitTable("c".getBytes());
ArrayList<ServerName> serverNameList = getServerNameList();
assertTrue(serverNameList.size() >= 2);
ArrayList<HRegionInfo> regionInfoList = getRegionInfoList(tableName);
assertEquals(2, regionInfoList.size());
HRegionInfo regionInfo1 = regionInfoList.get(0);
HRegionInfo regionInfo2 = regionInfoList.get(1);
ServerName serverName1 = serverNameList.get(0);
ServerName serverName2 = serverNameList.get(1);
move(regionInfo1, serverName1);
move(regionInfo2, serverName2);
// make 2 + 2 store files
putData(table, "a".getBytes());
admin.flush(tableName);
putData(table, "b".getBytes());
admin.flush(tableName);
putData(table, "c".getBytes());
admin.flush(tableName);
putData(table, "d".getBytes());
admin.flush(tableName);
Thread.sleep(3000);
assertEquals(2, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
// run MC
String regex = serverName1.getHostname() + "," + serverName1.getPort() + ".*";
String[] argsParam = {"zookeeper", tableName, "--rs=" + regex, "--force-proceed", "--wait", "--test"};
Args args = new ManagerArgs(argsParam);
MC command = new MC(admin, args);
command.run();
assertRegionName(command);
// should be 1 store file
assertEquals(1, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
}
@Test
public void testMC_RS() throws Exception {
// move each RS has one region
splitTable("c".getBytes());
ArrayList<ServerName> serverNameList = getServerNameList();
assertTrue(serverNameList.size() >= 2);
ArrayList<HRegionInfo> regionInfoList = getRegionInfoList(tableName);
assertEquals(2, regionInfoList.size());
HRegionInfo regionInfo1 = regionInfoList.get(0);
HRegionInfo regionInfo2 = regionInfoList.get(1);
ServerName serverName1 = serverNameList.get(0);
ServerName serverName2 = serverNameList.get(1);
move(regionInfo1, serverName1);
move(regionInfo2, serverName2);
// make 2 + 2 store files
putData(table, "a".getBytes());
admin.flush(tableName);
putData(table, "b".getBytes());
admin.flush(tableName);
putData(table, "c".getBytes());
admin.flush(tableName);
putData(table, "d".getBytes());
admin.flush(tableName);
Thread.sleep(3000);
assertEquals(2, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
// run MC
String regex = serverName1.getHostname() + "," + serverName1.getPort() + ".*";
String[] argsParam = {"zookeeper", tableName, "--rs=" + regex, "--force-proceed", "--wait", "--test"};
Args args = new ManagerArgs(argsParam);
MC command = new MC(admin, args);
command.run();
assertRegionName(command);
// should be 1 store file
assertEquals(1, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
}
@Override
public int compareTo(ServerName other) {
int compare = this.getHostname().compareTo(other.getHostname());
if (compare != 0) return compare;
compare = this.getPort() - other.getPort();
if (compare != 0) return compare;
return 0;
}
@Override
public TRegionInfo getRegionInfo(ByteBuffer searchRow) throws IOError {
try {
byte[] row = getBytes(searchRow);
Result startRowResult = getReverseScanResult(TableName.META_TABLE_NAME.getName(), row,
HConstants.CATALOG_FAMILY);
if (startRowResult == null) {
throw new IOException("Cannot find row in "+ TableName.META_TABLE_NAME+", row="
+ Bytes.toStringBinary(row));
}
// find region start and end keys
RegionInfo regionInfo = CatalogFamilyFormat.getRegionInfo(startRowResult);
if (regionInfo == null) {
throw new IOException("RegionInfo REGIONINFO was null or " +
" empty in Meta for row="
+ Bytes.toStringBinary(row));
}
TRegionInfo region = new TRegionInfo();
region.setStartKey(regionInfo.getStartKey());
region.setEndKey(regionInfo.getEndKey());
region.id = regionInfo.getRegionId();
region.setName(regionInfo.getRegionName());
region.version = HREGION_VERSION; // version not used anymore, PB encoding used.
// find region assignment to server
ServerName serverName = CatalogFamilyFormat.getServerName(startRowResult, 0);
if (serverName != null) {
region.setServerName(Bytes.toBytes(serverName.getHostname()));
region.port = serverName.getPort();
}
return region;
} catch (IOException e) {
LOG.warn(e.getMessage(), e);
throw getIOError(e);
}
}
InetSocketAddress createAddr(ServerName sn) throws UnknownHostException {
InetSocketAddress addr = new InetSocketAddress(sn.getHostname(), sn.getPort());
if (addr.isUnresolved()) {
throw new UnknownHostException("can not resolve " + sn.getServerName());
}
return addr;
}
void checkTableInfo(TableInfoModel model) {
assertEquals(model.getName(), TABLE.getNameAsString());
Iterator<TableRegionModel> regions = model.getRegions().iterator();
assertTrue(regions.hasNext());
while (regions.hasNext()) {
TableRegionModel region = regions.next();
boolean found = false;
LOG.debug("looking for region " + region.getName());
for (HRegionLocation e: regionMap) {
RegionInfo hri = e.getRegion();
// getRegionNameAsString uses Bytes.toStringBinary which escapes some non-printable
// characters
String hriRegionName = Bytes.toString(hri.getRegionName());
String regionName = region.getName();
LOG.debug("comparing to region " + hriRegionName);
if (hriRegionName.equals(regionName)) {
found = true;
byte[] startKey = hri.getStartKey();
byte[] endKey = hri.getEndKey();
ServerName serverName = e.getServerName();
InetSocketAddress sa =
new InetSocketAddress(serverName.getHostname(), serverName.getPort());
String location = sa.getHostName() + ":" +
Integer.valueOf(sa.getPort());
assertEquals(hri.getRegionId(), region.getId());
assertTrue(Bytes.equals(startKey, region.getStartKey()));
assertTrue(Bytes.equals(endKey, region.getEndKey()));
assertEquals(location, region.getLocation());
break;
}
}
assertTrue("Couldn't find region " + region.getName(), found);
}
}
@Test
public void testMC_LocalityMultipleRSs() throws Exception {
// fixme Data locality is not correct in HBaseTestingUtility
if (miniCluster) return;
// move each RS has one region
splitTable("c".getBytes());
ArrayList<ServerName> serverNameList = getServerNameList();
assertTrue(serverNameList.size() >= 2);
ArrayList<HRegionInfo> regionInfoList = getRegionInfoList(tableName);
assertEquals(2, regionInfoList.size());
HRegionInfo regionInfo1 = regionInfoList.get(0);
HRegionInfo regionInfo2 = regionInfoList.get(1);
ServerName serverName1 = serverNameList.get(0);
ServerName serverName2 = serverNameList.get(1);
move(regionInfo1, serverName1);
move(regionInfo2, serverName2);
// make 2 + 2 store files
putData(table, "a".getBytes());
admin.flush(tableName);
putData(table, "b".getBytes());
admin.flush(tableName);
putData(table, "c".getBytes());
admin.flush(tableName);
putData(table, "d".getBytes());
admin.flush(tableName);
Thread.sleep(3000);
assertEquals(2, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
// Data locality of regionInfo1 is 0%, data locality of regionInfo2 is 0%
move(regionInfo1, serverName2);
move(regionInfo2, serverName1);
assertEquals(2, getRegionLoad(regionInfo1, serverName2).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName1).getStorefiles());
// run MC
String regex;
if (miniCluster) regex = serverName1.getHostname() + "," + serverName1.getPort() + ".*";
else regex = serverName1.getHostname() + ".*";
String[] argsParam = {"zookeeper", tableName, "--locality=100", "--rs=" + regex,
"--force-proceed", "--wait", "--test"};
Args args = new ManagerArgs(argsParam);
MC command = new MC(admin, args);
command.run();
// should be 1 store file
assertEquals(2, getRegionLoad(regionInfo1, serverName2).getStorefiles());
assertEquals(1, getRegionLoad(regionInfo2, serverName1).getStorefiles());
}
@Test
public void testMC_LocalityMultipleRSs() throws Exception {
// fixme Data locality is not correct in HBaseTestingUtility
if (miniCluster) return;
// move each RS has one region
splitTable("c".getBytes());
ArrayList<ServerName> serverNameList = getServerNameList();
assertTrue(serverNameList.size() >= 2);
ArrayList<HRegionInfo> regionInfoList = getRegionInfoList(tableName);
assertEquals(2, regionInfoList.size());
HRegionInfo regionInfo1 = regionInfoList.get(0);
HRegionInfo regionInfo2 = regionInfoList.get(1);
ServerName serverName1 = serverNameList.get(0);
ServerName serverName2 = serverNameList.get(1);
move(regionInfo1, serverName1);
move(regionInfo2, serverName2);
// make 2 + 2 store files
putData(table, "a".getBytes());
admin.flush(tableName);
putData(table, "b".getBytes());
admin.flush(tableName);
putData(table, "c".getBytes());
admin.flush(tableName);
putData(table, "d".getBytes());
admin.flush(tableName);
Thread.sleep(3000);
assertEquals(2, getRegionLoad(regionInfo1, serverName1).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName2).getStorefiles());
// Data locality of regionInfo1 is 0%, data locality of regionInfo2 is 0%
move(regionInfo1, serverName2);
move(regionInfo2, serverName1);
assertEquals(2, getRegionLoad(regionInfo1, serverName2).getStorefiles());
assertEquals(2, getRegionLoad(regionInfo2, serverName1).getStorefiles());
// run MC
String regex;
if (miniCluster) regex = serverName1.getHostname() + "," + serverName1.getPort() + ".*";
else regex = serverName1.getHostname() + ".*";
String[] argsParam = {"zookeeper", tableName, "--locality=100", "--rs=" + regex,
"--force-proceed", "--wait", "--test"};
Args args = new ManagerArgs(argsParam);
MC command = new MC(admin, args);
command.run();
// should be 1 store file
assertEquals(2, getRegionLoad(regionInfo1, serverName2).getStorefiles());
assertEquals(1, getRegionLoad(regionInfo2, serverName1).getStorefiles());
}
public static StartcodeAgnosticServerName valueOf(final ServerName serverName) {
return new StartcodeAgnosticServerName(serverName.getHostname(), serverName.getPort(),
serverName.getStartcode());
}
/**
* Tests the non cached version of getRegionLocator by moving a region.
*/
@Test
public void testNonCachedGetRegionLocation() throws Exception {
// Test Initialization.
final TableName tableName = name.getTableName();
byte [] family1 = Bytes.toBytes("f1");
byte [] family2 = Bytes.toBytes("f2");
try (Table ignored = TEST_UTIL.createTable(tableName, new byte[][] {family1, family2}, 10);
Admin admin = TEST_UTIL.getAdmin();
RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName)) {
List<HRegionLocation> allRegionLocations = locator.getAllRegionLocations();
assertEquals(1, allRegionLocations.size());
RegionInfo regionInfo = allRegionLocations.get(0).getRegion();
ServerName addrBefore = allRegionLocations.get(0).getServerName();
// Verify region location before move.
HRegionLocation addrCache = locator.getRegionLocation(regionInfo.getStartKey(), false);
HRegionLocation addrNoCache = locator.getRegionLocation(regionInfo.getStartKey(), true);
assertEquals(addrBefore.getPort(), addrCache.getPort());
assertEquals(addrBefore.getPort(), addrNoCache.getPort());
// Make sure more than one server.
if (TEST_UTIL.getMiniHBaseCluster().getLiveRegionServerThreads().size() <= 1) {
TEST_UTIL.getMiniHBaseCluster().startRegionServer();
Waiter.waitFor(TEST_UTIL.getConfiguration(), 30000, new Waiter.Predicate<Exception>() {
@Override public boolean evaluate() throws Exception {
return TEST_UTIL.getMiniHBaseCluster().getLiveRegionServerThreads().size() > 1;
}
});
}
ServerName addrAfter = null;
// Now move the region to a different server.
for (int i = 0; i < TEST_UTIL.getMiniHBaseCluster().getLiveRegionServerThreads().size();
i++) {
HRegionServer regionServer = TEST_UTIL.getHBaseCluster().getRegionServer(i);
ServerName addr = regionServer.getServerName();
if (addr.getPort() != addrBefore.getPort()) {
admin.move(regionInfo.getEncodedNameAsBytes(), addr);
// Wait for the region to move.
Thread.sleep(5000);
addrAfter = addr;
break;
}
}
// Verify the region was moved.
addrCache = locator.getRegionLocation(regionInfo.getStartKey(), false);
addrNoCache = locator.getRegionLocation(regionInfo.getStartKey(), true);
assertNotNull(addrAfter);
assertTrue(addrAfter.getPort() != addrCache.getPort());
assertEquals(addrAfter.getPort(), addrNoCache.getPort());
}
}
RandomTimeoutBlockingRpcChannel(BlockingRpcClient rpcClient, ServerName sn, User ticket,
int rpcTimeout) {
super(rpcClient, new InetSocketAddress(sn.getHostname(), sn.getPort()), ticket, rpcTimeout);
}
RandomTimeoutRpcChannel(AbstractRpcClient<?> rpcClient, ServerName sn, User ticket,
int rpcTimeout) throws UnknownHostException {
super(rpcClient, new InetSocketAddress(sn.getHostname(), sn.getPort()), ticket, rpcTimeout);
}
public RegionMovedException(ServerName serverName, long locationSeqNum) {
this.hostname = serverName.getHostname();
this.port = serverName.getPort();
this.startCode = serverName.getStartcode();
this.locationSeqNum = locationSeqNum;
}