Hadoop 无法与蜂巢建立连接?

Hadoop 无法与蜂巢建立连接?,hadoop,hive,Hadoop,Hive,我正在使用java代码与hive建立连接,但我发现了以下错误- log4j:WARN找不到记录器(org.apache.thrift.transport.TSaslTransport)的追加器。 log4j:警告请正确初始化log4j系统。 log4j:有关更多信息,请参阅警告。 线程“main”java.sql.SQLException中的异常:处理语句时出错:失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。MetaException

我正在使用java代码与hive建立连接,但我发现了以下错误-

log4j:WARN找不到记录器(org.apache.thrift.transport.TSaslTransport)的追加器。 log4j:警告请正确初始化log4j系统。 log4j:有关更多信息,请参阅警告。 线程“main”java.sql.SQLException中的异常:处理语句时出错:失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。MetaException(消息:Get exception:org.apache.hadoop.security.AccessControlException权限被拒绝:user=anonymous,access=WRITE,inode=“/”:oodles:supergroup:drwxr-xr-x 位于org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271) 位于org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257) 位于org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:238) 位于org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:179) 位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5904) 位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5886) 位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkAncestorAccess(FSNamesystem.java:5860) 位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:3793) 位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInt(FSNamesystem.java:3763) 位于org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:3737) 位于org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.mkdirs(NameNodeRpcServer.java:778) 位于org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.mkdirs(ClientNamenodeProtocolServerSideTranslatorPB.java:573) 位于org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) 在org.apache.hadoop.ipc.protobufrpceengine$Server$protobufrpinvoker.call上(protobufrpceengine.java:585) 位于org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928) 位于org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013) 位于org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009) 位于java.security.AccessController.doPrivileged(本机方法) 位于javax.security.auth.Subject.doAs(Subject.java:415) 位于org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614) 位于org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007) ) 位于org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:275) 位于com.oodles.example.HiveJdbcClient.main(HiveJdbcClient.java:23)

下面是我的Java代码

package com.oodles.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HiveJdbcClient {
    private static String driverName = "org.apache.hive.jdbc.HiveDriver";
    public static void main(String[] args) throws SQLException {
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "", "");
        Statement stmt = con.createStatement();
        String tableName = "testHiveDriverTable";
        stmt.execute("drop table if exists " + tableName);
        stmt.execute("create table " + tableName + " (key int, value string)");
        System.out.println("success!");
        stmt.close();
        con.close();
    }
}
我的另一个担忧是,每当我在没有启动hadoop服务的情况下建立连接时,它都会出错

log4j:WARN No appenders could be found for logger (org.apache.thrift.transport.TSaslTransport).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: java.net.ConnectException Call From oodles-Latitude-3540/127.0.1.1 to localhost:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused)
    at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:275)
    at com.oodles.example.HiveJdbcClient.main(HiveJdbcClient.java:21)

如果我启动hadoop服务,后面的问题就会得到解决,所以我想问,为了与hive建立连接,是否必须启动hadoop服务?

因为您没有提到您使用的hive版本,但基于驱动程序名称和连接URl,我假设您使用的是hive 0.11或更高版本

因此,在Hive 0.11或更高版本中,您需要在连接URL中提及用户名:

DriverManager.getConnection("jdbc:hive2://localhost:10000/default", <user_name>, "")

NOTE: This user should have read+write permissions in HDFS.
DriverManager.getConnection(“jdbc:hive2://localhost:10000/default”,”)
注意:此用户在HDFS中应具有读写权限。
关于你的第二个问题:

我很确定Hadoop服务不仅仅是连接所必需的。我从来没有试过

这是我的假设,因为我们需要在连接URL中提到一个数据库,它是HDFS中的一个目录。因此,它可能需要NAMENODE服务来检查该目录是否存在


希望对你有帮助

谢谢Mukesh,但我的问题是“我们不能在不安装hadoop或HDFS的情况下与hive建立连接,因为我们需要namenode服务来检查目录的存在性,正如你所说的”即使你建立了hive连接,最终你还是需要hadoop,因为hive使用HDFS和其他hadoop服务(如Jobtracker)来运行查询。