面试题答案
一键面试常见异常类型及处理方法
- Zookeeper 相关异常
- 异常类型:HBase 依赖 Zookeeper 进行集群协调,如
KeeperException
相关异常,可能由于 Zookeeper 连接超时、节点丢失等原因引发。 - 处理方法:增加 Zookeeper 连接重试机制。例如,使用
try - catch
块捕获异常,在catch
块中进行重试逻辑,如下代码片段:
- 异常类型:HBase 依赖 Zookeeper 进行集群协调,如
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
public class ZKRetryExample {
private static final int MAX_RETRIES = 3;
private static final int SESSION_TIMEOUT = 5000;
public static ZooKeeper getZooKeeperConnection(String zkServer) {
for (int i = 0; i < MAX_RETRIES; i++) {
try {
return new ZooKeeper(zkServer, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 处理 Watcher 事件
}
});
} catch (KeeperException | InterruptedException e) {
System.out.println("连接 Zookeeper 失败,重试第 " + (i + 1) + " 次...");
}
}
throw new RuntimeException("无法连接到 Zookeeper");
}
}
- HBase 连接异常
- 异常类型:如
IOException
可能在创建 HBase 连接时由于网络问题、配置错误等原因抛出。例如MasterNotRunningException
、ZooKeeperConnectionException
等。 - 处理方法:检查 HBase 配置文件(如
hbase - site.xml
)是否正确,确保网络连接正常。可以通过在代码中捕获异常并进行日志记录,提示用户检查相关配置。示例如下:
- 异常类型:如
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
public class HBaseConnectionExample {
public static Connection getHBaseConnection() {
Configuration conf = HBaseConfiguration.create();
try {
return ConnectionFactory.createConnection(conf);
} catch (IOException e) {
System.err.println("创建 HBase 连接失败: " + e.getMessage());
e.printStackTrace();
return null;
}
}
}
- 表操作异常
- 异常类型:
TableNotFoundException
当尝试访问不存在的表时会抛出此异常;RegionOfflineException
当操作的 Region 离线时会出现此异常。 - 处理方法:对于
TableNotFoundException
,在操作表之前先检查表是否存在,示例代码如下:
- 异常类型:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;
public class TableExistsExample {
public static boolean tableExists(String tableName) {
Configuration conf = HBaseConfiguration.create();
try (Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin()) {
return admin.tableExists(TableName.valueOf(tableName));
} catch (IOException e) {
System.err.println("检查表是否存在失败: " + e.getMessage());
e.printStackTrace();
return false;
}
}
}
对于 RegionOfflineException
,可以等待 Region 重新上线或者尝试重新分配 Region(需要管理员权限操作)。同时捕获异常进行日志记录,如:
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class RegionOfflineExample {
public static void putData(Table table, String rowKey, String family, String qualifier, String value) {
Put put = new Put(Bytes.toBytes(rowKey));
put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value));
try {
table.put(put);
} catch (IOException e) {
if (e instanceof org.apache.hadoop.hbase.RegionOfflineException) {
System.err.println("Region 离线,无法写入数据: " + e.getMessage());
e.printStackTrace();
} else {
throw new RuntimeException(e);
}
}
}
}