http://www.meichua.com (收藏,设为首页)
以前打牌的时候出牌太慢,其他人就叫着出啊,出啊,所以就变成了chua...... (手机请访问 http://3g.dlog.cn/meichua)
上一篇:hadoop学习1 下一篇:hadoop学习3

hadoop学习2

2008年4月17日(Thursday) 15点20分 作者: chua 天气: 心情: 一般

 在windows上访问hadoop系统
按照hadoop的例子HadoopDFSFileReadWrite.java,在eclipse里建立项目,拷贝lib导入projext,创建conf拷贝到本地作为src一部分
修改hadoop-site.xml中的fs.default.name属性为namenode的ip形式

    static void usage() {
        System.out.println("Usage : Client <inputfile> <output file>");
        System.exit(1);
    }

    static void printAndExit(String str) {
        System.err.println(str);
        System.exit(1);
    }

    public static void main(String[] argv) throws IOException {
        for(String arg : argv) {
            System.out.println("arg="+arg);
        }
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);

        if (argv.length != 2) usage();

        // Hadoop DFS deals with Path
        Path inFile = new Path(argv[0]);
        Path outFile = new Path(argv[1]);

        // Check if input/output are valid
        if (!fs.exists(inFile)) {
            printAndExit("Input file not found");
        }
        if (!fs.isFile(inFile)) {
            printAndExit("Input should be a file");
        }
        if (fs.exists(outFile)) {
            printAndExit("Output already exists");
        }

        // Read from and write to new file
        FSDataInputStream in = fs.open(inFile);
        FSDataOutputStream out = fs.create(outFile);
        byte buffer[] = new byte[256];
        try {
            int bytesRead = 0;
            while ((bytesRead = in.read(buffer)) > 0) {
                out.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            System.out.println("Error while copying file");
        } finally {
            in.close();
            out.close();
        }
    }

运行报错:
Exception in thread "main" java.io.IOException: Login failed: Cannot run program "whoami": CreateProcess error=2, ?????????
 at org.apache.hadoop.dfs.DFSClient.createNamenode(DFSClient.java:124)
 at org.apache.hadoop.dfs.DFSClient.<init>(DFSClient.java:143)
 at org.apache.hadoop.dfs.DistributedFileSystem.initialize(DistributedFileSystem.java:65)
 at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:166)
 at org.apache.hadoop.fs.FileSystem.getNamed(FileSystem.java:122)
 at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:94)
 at com.chua.hadoop.client.Client.main(Client.java:25)

网上查资料,发现windows上没有whoami命令(即使有估计也是访问不了,因为hdfs的文件权限形式;后来试了一下随便填了一个用户去做,报错:org.apache.hadoop.fs.permission.AccessControlException: Permission denied),
在hadoop-site.xml里加入
 <property>
  <name>hadoop.job.ugi</name>
  <value>zxf,zxf</value>
 </property>
 
 

还是报错
java.net.ConnectException: Connection refused

此时我又把代码放到linux下运行,还是同样的错误,期间让费了很多时间,看了很多blog,都没有相关资料,我看了hadoop中关于Permissions and Security的资料,也没有看出问题.
于是把代码放到linux下,并把把fs.default.name改回到namenode的运行参数,即:localhost:prot的形式,这次运行成功,我纳闷
分别telnet localhost prot与telnet ip port,发现localhost的可以连上,而ip的连不上,问题集中在这里了,我没有socket编程经验,所以问了旁边的人,说socket listener的建立分形式的,像我这样的情况,listener只能创建本地socket.
这次修改hdfs环境的hadoop-site.xml将fs.default.name改成ip形式,重启hdfs
然后把clinet的hadoop-site.xml中的fs.default.name改为ip,运行成功,这个问题困扰了一天时间.
windows环境的clinet运行也同样成功了

评论者: samuel 2008-6-10 17:45 (Tuesday)

telnet localhost prot与telnet ip port,发现localhost的可以连上,而ip的连不上,问题:原因是hadoop在通过 NetworkInterface netIF = NetworkInterface.getByName(strInterface); 取得IP。其中getDefaultIP取得是第一个IP。如果在linux的net环境下,etc/hosts 不要把你寻找的hostname :127.0.0.1排在首位

评论者: chua 2008-6-12 11:27 (Thursday)

多谢指点

评论者: [hidden] 2008-10-1 23:52 (Wednesday)
[这是悄悄话]
评论者: chua 2008-10-6 14:44 (Monday)

在hadoop-site.xml里加入
 <property>
  <name>hadoop.job.ugi</name>
  <value>youruser,youruserGroup</value>
 </property>

试试?如果没有加是一定不可能访问到的,具体看一下UserGroupInformation.login方法,他会去取hadoop.job.ugi配置,没有没有取到数据,才执行whoami命令

如果像你说的,只读到了hadoop-default.xml的值,那你就把配置直接写到这个文件里试试

评论者: [hidden] 2008-10-9 21:27 (Thursday)
[这是悄悄话]
评论者: chua 2008-10-15 23:16 (Wednesday)

恭喜!

姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验