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=https://www.linuxidc.com/Linux/2013-05/new Configuration();
conf.set("fs.default.name","hdfs://localhost:9000");
conf.set("hadoop.job.ugi","hadoop,hadoop");
FileSystem hdfs=FileSystem.get(conf);
//本地文件
Path src =https://www.linuxidc.com/Linux/2013-05/new Path("t.txt");
//HDFS为止
Path dst =https://www.linuxidc.com/Linux/2013-05/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();
}