JAvaはhadoopのコンパイルと実行に遭遇した様々な問題と解決策にアクセスします.

1813 ワード

質問1:
Javacコンパイルでは依存するクラスが常に欠けています.
ソリューション:
だから私はその後スクリプトを書いて、すべてを書きました.jarファイルはすべてCLASSSPATH変数にロードされ、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();
        }

}