Class 存在。但它抱怨

Class is present. But it complaints

 package org.myorg;

 import java.security.PrivilegedExceptionAction;

 import org.apache.hadoop.conf.*;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.FileStatus;

 public class Write{

  public static void main(String args[]) {

    try {
        UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hbase");

        ugi.doAs(new PrivilegedExceptionAction<Void>() {

            public Void run() throws Exception {

                Configuration conf = new Configuration();
                conf.set("fs.defaultFS", "hdfs://10.236.173.95:8020/user/hbase");
                conf.set("hadoop.job.ugi", "hbase");

                FileSystem fs = FileSystem.get(conf);


                 fs.createNewFile(new Path("/user/hbase/test"));

                 System.out.println("File Created");

                return null;
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
   }
 }

这是我的 java 程序。我已经从 this site 下载了我的 jar。我可以看到 UserGroupInformation class 在那里。我检查了 createRemoteUser 方法是这个 class.

的成员

我使用

编译这个程序
  javac -classpath hadoop-0.20.1-dev-core.jar -d Write/ Write.java

我的目录结构包含

 jarfile WriteDirectory Write.java

我收到以下错误

 Write.java:16: error: cannot find symbol
        UserGroupInformation ugi =   UserGroupInformation.createRemoteUser("hbase");
                                                       ^
 symbol:   method createRemoteUser(String)
 location: class UserGroupInformation
 Write.java:18: error: cannot find symbol
        ugi.doAs(new PrivilegedExceptionAction<Void>() {
           ^
 symbol:   method doAs(<anonymous PrivilegedExceptionAction<Void>>)
 location: variable ugi of type UserGroupInformation
 2 errors

可能是什么原因?

问题在于您编译时所针对的 Hadoop 版本。您正在针对 hadoop-0.20.1-dev-core.jar 进行编译。我刚刚下载了它,javap 显示了 UserGroupInformation class 的以下内容:

public abstract class org.apache.hadoop.security.UserGroupInformation implements org.apache.hadoop.io.Writable,java.security.Principal {
  public static final org.apache.commons.logging.Log LOG;
  public org.apache.hadoop.security.UserGroupInformation();
  public static org.apache.hadoop.security.UserGroupInformation getCurrentUGI();
  public static void setCurrentUGI(org.apache.hadoop.security.UserGroupInformation);
  static javax.security.auth.Subject getCurrentUser();
  public static void setCurrentUser(org.apache.hadoop.security.UserGroupInformation);
  public abstract java.lang.String getUserName();
  public abstract java.lang.String[] getGroupNames();
  public static org.apache.hadoop.security.UserGroupInformation login(org.apache.hadoop.conf.Configuration) throws javax.security.auth.login.LoginException;
  public static org.apache.hadoop.security.UserGroupInformation readFrom(org.apache.hadoop.conf.Configuration) throws java.io.IOException;
  static {};
}

没有迹象表明您尝试调用的方法。

看来您应该下载更新版本的 Hadoop。 (我建议你把Hadoop的整个都换掉,不要只换一个jar文件,我没做过Hadoop开发,不知道有多少个jar文件。)