Java 配置单元、JDBC、TTTransportException:SASL身份验证未完成

Java 配置单元、JDBC、TTTransportException:SASL身份验证未完成,java,jdbc,hive,sasl,Java,Jdbc,Hive,Sasl,我连接到配置单元并从表的行中获取数据的id。问题不会发生,当我连接到配置单元时,发送请求并获得响应。但是当我从ResultSet中获取id时,我得到一个异常:org.apache.thrift.transport.ttTransportException:SASL身份验证未完成。为什么会出现这种例外情况?需要采取什么措施来避免这种情况?对不起,我的英语不好 创建配置单元连接和发送请求是我的附属类: public class HiveDataSearcher implements AutoClos

我连接到配置单元并从表的行中获取数据的id。问题不会发生,当我连接到配置单元时,发送请求并获得响应。但是当我从ResultSet中获取id时,我得到一个异常:org.apache.thrift.transport.ttTransportException:SASL身份验证未完成。为什么会出现这种例外情况?需要采取什么措施来避免这种情况?对不起,我的英语不好

创建配置单元连接和发送请求是我的附属类:

public class HiveDataSearcher implements AutoCloseable {
private static final String hiveDriverName = "org.apache.hive.jdbc.HiveDriver";

static {
    try {
        Class.forName(hiveDriverName);
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}

private Connection hiveConnection;

private String tableName;
private String whereBody;

public HiveDataSearcher(String url, String login, String password) {
    try {
        hiveConnection = DriverManager.getConnection(url, login, password);
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }

    this.tableName = "";
    this.whereBody = "";
}

public HiveDataSearcher(Connection hiveConnection) {
    Objects.requireNonNull(hiveConnection, "hiveConnection");

    this.hiveConnection = hiveConnection;

    this.tableName = "";
    this.whereBody = "";
}

public String getTableName() {
    return tableName;
}

public HiveDataSearcher setTableName(String tableName) {
    Objects.requireNonNull(tableName, "tableName");

    this.tableName = tableName;

    return this;
}

public String getWhereBody() {
    return whereBody;
}

public HiveDataSearcher setWhereBody(String whereBody) {
    Objects.requireNonNull(whereBody, "whereBody");

    this.whereBody = whereBody;

    return this;
}

public ResultSet select(String ... selectParams) {
    return select(Arrays.asList(selectParams));
}

public ResultSet select(Iterable<String> selectParams) {
    String request = prepareRequest(selectParams);
    ResultSet response;

    try {
        response = hiveConnection
                .createStatement()
                .executeQuery(request);
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }

    return response;
}

private String prepareRequest(Iterable<String> selectParams) {
    return new StringBuilder()
            .append("select").append(' ').append(selectParamsToHiveFormat(selectParams)).append(' ')
            .append("from").append(' ').append(tableName).append(' ')
            .append("where").append(' ').append(whereBody)
            .toString();
}

private String selectParamsToHiveFormat(Iterable<String> selectParams) {
    StringBuilder formattedSelectParams = new StringBuilder();

    for (String selectedParam : selectParams) {
        formattedSelectParams.append('\'').append(selectedParam).append('\'').append(',');
    }

    if (formattedSelectParams.length() == 0) {
        formattedSelectParams.append('*');
    } else {
        formattedSelectParams.deleteCharAt(formattedSelectParams.length() - 1);
    }

    return formattedSelectParams.toString();
}

public void close() {
    if (hiveConnection != null) {
        try {
            hiveConnection.close();
        } catch (SQLException e) {
            //nothing to do, just close connection
        } finally {
            hiveConnection = null;
        }
    }
}
公共类HiveDataSearcher实现自动关闭{
私有静态最终字符串hiveDriverName=“org.apache.hive.jdbc.HiveDriver”;
静止的{
试一试{
Class.forName(hiveDriverName);
}catch(classnotfounde异常){
抛出新的运行时异常(e);
}
}
专用连接hiveConnection;
私有字符串表名;
私人机构;
公共HiveDataSearcher(字符串url、字符串登录、字符串密码){
试一试{
hiveConnection=DriverManager.getConnection(url、登录名、密码);
}捕获(SQLE异常){
抛出新的运行时异常(e);
}
this.tableName=“”;
this.whereBody=“”;
}
公共HiveDataSearcher(连接hiveConnection){
对象。requirennull(hiveConnection,“hiveConnection”);
this.hiveConnection=hiveConnection;
this.tableName=“”;
this.whereBody=“”;
}
公共字符串getTableName(){
返回表名;
}
公共HiveDataSearcher setTableName(字符串tableName){
对象。requirennull(tableName,“tableName”);
this.tableName=tableName;
归还这个;
}
公共字符串getWhereBody(){
返回实体;
}
公共HiveDataSearcher setWhereBody(字符串whereBody){
对象。要求不完整(whereBody,“whereBody”);
this.whereBody=whereBody;
归还这个;
}
公共结果集选择(字符串…选择参数){
返回select(Arrays.asList(selectParams));
}
公共结果集选择(Iterable selectParams){
字符串请求=prepareRequest(选择参数);
结果集反应;
试一试{
响应=hiveConnection
.createStatement()
.执行(请求);
}捕获(SQLE异常){
抛出新的运行时异常(e);
}
返回响应;
}
私有字符串prepareRequest(Iterable selectParams){
返回新的StringBuilder()
.append(“select”).append(“”).append(selectParamsToHiveFormat(selectParams)).append(“”)
.append(“from”).append(“”).append(表名).append(“”)
附加(whereBody)
.toString();
}
私有字符串selectParamsToHiveFormat(Iterable selectParams){
StringBuilder formattedSelectParams=新建StringBuilder();
for(字符串selectedParam:selectParams){
formattedSelectParams.append('\'').append(selectedParam.append('\'').append('\'');
}
如果(formattedSelectParams.length()==0){
formattedSelectParams.append('*');
}否则{
formattedSelectParams.deleteCharAt(formattedSelectParams.length()-1);
}
返回格式化的SelectParams.toString();
}
公众假期结束(){
如果(hiveConnection!=null){
试一试{
hiveConnection.close();
}捕获(SQLE异常){
//无事可做,只需关闭连接即可
}最后{
hiveConnection=null;
}
}
}
}

这是我连接到hive的代码:

private static final String HIVE_URL = <hive url>;
private static final String HIVE_LOGIN = <hive login>;
private static final String HIVE_PASSWORD = <hive password>;

private static final String[] SEARCH_FIELDS = new String[] {"rowkey"};

private List<String> getIdsFromHive(String tableName, String whereBody) {
    ResultSet hiveResponse;

    try (HiveDataSearcher searcher = new HiveDataSearcher(HIVE_URL, HIVE_LOGIN, HIVE_PASSWORD)) {
        hiveResponse = searcher
                .setTableName(tableName)
                .setWhereBody(whereBody)
                .select(SEARCH_FIELDS);
    }

    List<String> ids = new ArrayList<>();

    try {
        while (hiveResponse.next()) { // in this place throw TTransportException
            ids.add(hiveResponse.getString(SEARCH_FIELDS[0]));
        }
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }

    return ids;
}
private静态最终字符串配置单元URL=;
私有静态最终字符串HIVE_LOGIN=;
私有静态最终字符串配置单元密码=;
私有静态最终字符串[]搜索\字段=新字符串[]{“rowkey”};
私有列表getIdsFromHive(字符串tableName,字符串whereBody){
结果集hiveResponse;
try(HiveDataSearcher search=新的HiveDataSearcher(配置单元URL、配置单元登录名、配置单元密码)){
HiverResponse=搜索者
.setTableName(tableName)
.setWhereBody(whereBody)
.选择(搜索字段);
}
列表ID=新的ArrayList();
试一试{
while(hiveResponse.next()){//在此处抛出TTTransportException
add(hiveResponse.getString(搜索字段[0]);
}
}捕获(SQLE异常){
抛出新的运行时异常(e);
}
返回ID;
}

在我的例子中,此异常的原因是在关闭语句之前关闭了连接。因此,我建议您检查是否已正确维护连接

这是我的代码,希望它能给你一些启发:

代码错误,请在关闭语句之前关闭连接:

    Connection connection = null;
    Statement statement = null;
    try {
        connection = HIVEUTILS.getConnection();
        statement = connection.createStatement();
        statement.execute("DROP TABLE IF EXISTS tbl1");
        statement.execute("CREATE TABLE `tbl1` (`id` int)");
        statement.execute("INSERT INTO tbl1 VALUES(1)");
    }finally {
        if (connection != null){
            connection.close();
        }
        if (statement != null){
            statement.close(); // exception occur here.
        }
    }
正确的关闭顺序是:关闭结果集(如果有)->关闭语句->关闭连接

    Connection connection = null;
    Statement statement = null;
    try {
        connection = HIVEUTILS.getConnection();
        statement = connection.createStatement();
        statement.execute("DROP TABLE IF EXISTS tbl1");
        statement.execute("CREATE TABLE `tbl1` (`id` int)");
        statement.execute("INSERT INTO tbl1 VALUES(1)");
    }finally {
        if (statement != null){
            statement.close(); // change the order
        }
        if (connection != null){
            connection.close();
        }
    }

在我的例子中,此异常的原因是在关闭语句之前关闭了连接。因此,我建议您检查是否已正确维护连接

这是我的代码,希望它能给你一些启发:

代码错误,请在关闭语句之前关闭连接:

    Connection connection = null;
    Statement statement = null;
    try {
        connection = HIVEUTILS.getConnection();
        statement = connection.createStatement();
        statement.execute("DROP TABLE IF EXISTS tbl1");
        statement.execute("CREATE TABLE `tbl1` (`id` int)");
        statement.execute("INSERT INTO tbl1 VALUES(1)");
    }finally {
        if (connection != null){
            connection.close();
        }
        if (statement != null){
            statement.close(); // exception occur here.
        }
    }
正确的关闭顺序是:关闭结果集(如果有)->关闭语句->关闭连接

    Connection connection = null;
    Statement statement = null;
    try {
        connection = HIVEUTILS.getConnection();
        statement = connection.createStatement();
        statement.execute("DROP TABLE IF EXISTS tbl1");
        statement.execute("CREATE TABLE `tbl1` (`id` int)");
        statement.execute("INSERT INTO tbl1 VALUES(1)");
    }finally {
        if (statement != null){
            statement.close(); // change the order
        }
        if (connection != null){
            connection.close();
        }
    }

您找到解决方案了吗?您找到解决方案了吗?此问题不会导致问题中所述的异常。此问题不会导致问题中所述的异常。