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文件。)
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文件。)