1

我正在尝试运行 HBase importTSV hadoop 作业以将数据从 TSV 文件加载到 HBase 中。我正在使用以下代码。

    Configuration config = new Configuration();
    Iterator iter = config.iterator();
    while(iter.hasNext())
    {
        Object obj = iter.next();
        System.out.println(obj);
    }

    Job job = new Job(config);
    job.setJarByClass(ImportTsv.class);
    job.setJobName("ImportTsv");
    job.getConfiguration().set("user", "hadoop");
    job.waitForCompletion(true);

我收到此错误

错误 security.UserGroupInformation:PriviledgedActionException as:E317376 原因:org.apache.hadoop.security.AccessControlException:org.apache.hadoop.security.AccessControlException:权限被拒绝:user=E317376,access=WRITE,inode="staging":hadoop:超群:rwxr-xr-x

我不知道如何设置用户名 E317376。这是我试图在远程集群中运行此作业的 Windows 机器用户。我在 linux 机器上的 haddop 用户帐户是“hadoop”

当我在 linux 机器上运行它时,它是 hadoop 用户帐户下的 Hadoop 集群的一部分,一切正常。但我想以编程方式在 java web 应用程序中运行这项工作。我做错什么了吗。请帮忙...

4

2 回答 2

2

您的 mapred-site.xml 文件中应该有如下属性

<property>
<name>mapreduce.jobtracker.staging.root.dir</name>
<value>/user</value>
<property>

也许有必要将您的 dfs 文件系统的 /user 文件夹更改为 777

不要忘记停止/启动您的 jobtrackers 和 tasktrackers(sh stop-mapred.sh 和 sh start-mapred.sh)

于 2012-10-28T10:13:50.023 回答
0

我还没有测试这些解决方案,但尝试在你的工作配置中添加这样的东西

conf.set("hadoop.job.ugi", "hadoop");

以上内容可能已过时,因此您也可以将用户设置为 hadoop (来自http://hadoop.apache.org/common/docs/r1.0.3/Secure_Impersonation.html的代码)尝试以下操作:

UserGroupInformation ugi = 
                     UserGroupInformation.createProxyUser(user, UserGroupInformation.getLoginUser());
             ugi.doAs(new PrivilegedExceptionAction<Void>() {
               public Void run() throws Exception {
                 //Submit a job
                 JobClient jc = new JobClient(conf);
                 jc.submitJob(conf);
                 //OR access hdfs
                 FileSystem fs = FileSystem.get(conf);
                 fs.mkdir(someFilePath); 
               }
             }
于 2012-07-16T21:47:03.367 回答