Java访问Hadoop编译和运行遇到的各类问题和解决方案

2019-03-28 13:01|来源: 网络

Java访问Hadoop编译和运行遇到的各类问题和解决方案:

问题1:

在javac编译时,老是缺少依赖的类,

解决方案:

所以我之后写了一个脚本,将所有的.jar文件都加载到CLASSPATH变量中,就ok了。

问题2:

而实际操作中出现文件操作的权限不足。因为用hadoop shell放进去的默认权限是rw-r--r--,所以作为程序对象就没有操作权限。

解决方案:

java之之前加上sudo权限即可。如果还是不行,那只好:/bin/hadoop fs -chmod 777 文件名

我的shell脚本是这样写的。(jardir是我先将所有的jar文件cp到了该目录)

#!/bin/sh
FILES=/usr/local/hadoop/jardir/*
v=""
for f in $FILES
do
    v1=${f}
    v2=${v1}:${v}
    v=${v2}
done

echo "$v"

v2="."
v=${v}${v2}

sudo javac -classpath ${v} CopyFile.java
sudo java -classpath ${v} CopyFile

之后只用运行:

sh build.sh

即可

下面附上我的java代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;

public class CopyFile {

    public static void main(String[] args) throws Exception {

            Configuration conf=new Configuration();

    conf.set("fs.default.name","hdfs://localhost:9000");
      conf.set("hadoop.job.ugi","hadoop,hadoop");

            FileSystem hdfs=FileSystem.get(conf);

            //本地文件

            Path src =new Path("t.txt");

            //HDFS为止

            Path dst =new Path("/my/b.txt");

               
            hdfs.copyFromLocalFile(src, dst);
            System.out.println("Upload to"+conf.get("fs.default.name"));

                 
            FileStatus files[]=hdfs.listStatus(dst);
            for(FileStatus file:files)
              System.out.println(file.getPath());

boolean b=hdfs.delete(new Path("/my/t.txt"));
System.out.println("b="+b);
hdfs.close();
        }

}

更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

相关问答

更多