[HADOOP] 원격으로 Hadoop 작업 실행
HADOOP원격으로 Hadoop 작업 실행
클러스터 외부에서 MapReduce 작업을 실행하려고합니다.
예 : Hadoop 클러스터가 Linux 컴퓨터에서 실행 중입니다. 우리는 하나의 웹 응용 프로그램을 Windows 컴퓨터에서 실행합니다. 이 원격 웹 응용 프로그램에서 hadoop 작업을 실행하려고합니다. 우리는 hadoop 출력 디렉토리를 검색하여 그래프로 제시하려고합니다.
다음 코드를 작성했습니다.
Configuration conf = new Configuration();
Job job = new Job(conf);
conf.set("mapred.job.tracker", "192.168.56.101:54311");
conf.set("fs.default.name", "hdfs://192.168.56.101:54310");
job.setJarByClass(Analysis.class) ;
//job.setOutputKeyClass(Text.class);
//job.setOutputValueClass(IntWritable.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
//job.set
job.setInputFormatClass(CustomFileInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.waitForCompletion(true);
그리고 이것은 우리가 얻는 오류입니다. hadoop 1.1.2 클러스터를 종료하더라도 오류는 여전히 동일합니다.
14/03/07 00:23:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
14/03/07 00:23:37 ERROR security.UserGroupInformation: PriviledgedActionException as:user cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-user\mapred\staging\user818037780\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-user\mapred\staging\user818037780\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)
at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)
at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349)
at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193)
at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:550)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:580)
at LineCounter.main(LineCounter.java:86)
해결법
-
==============================
1.원격 시스템에서 실행하는 동안 원격 사용자로 실행해야합니다. 당신은 다음과 같이 당신의 메인 클래스에서 그것을 할 수 있습니다 :
원격 시스템에서 실행하는 동안 원격 사용자로 실행해야합니다. 당신은 다음과 같이 당신의 메인 클래스에서 그것을 할 수 있습니다 :
public static void main(String a[]) { UserGroupInformation ugi = UserGroupInformation.createRemoteUser("root"); try { ugi.doAs(new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { Configuration conf = new Configuration(); Job job = new Job(conf); conf.set("hadoop.job.ugi", "root"); // write your remaining piece of code here. return null; } }); } catch (Exception e) { e.printStackTrace(); } }
또한 mapreduce 작업을 제출하는 동안 종속 항아리가있는 Java 클래스를 hadoop 클러스터로 복사해야하며 여기서 mapreduce 작업을 실행합니다. 여기에서 자세한 내용을 읽을 수 있습니다.
따라서 매니페스트 클래스 패스에 종속 된 모든 jar 파일을 사용하여 코드의 실행 가능한 항아리 (기본 클래스 분석을 사용하여)를 만들어야합니다. 다음을 사용하여 명령 줄에서 jar 파일을 실행하십시오.
java -jar job-jar-with-dependencies.jar arguments
HTH!
from https://stackoverflow.com/questions/22231904/running-hadoop-job-remotely by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop HDFS 최대 파일 크기 (0) | 2019.07.26 |
---|---|
[HADOOP] 여러 CPU 코어에서 독립 실행 형 Hadoop 응용 프로그램 실행 (0) | 2019.07.26 |
[HADOOP] 원격 HDFS에서 파일 검색 (0) | 2019.07.26 |
[HADOOP] 하이브 병을 영구히 추가하기 (0) | 2019.07.26 |
[HADOOP] hadoop을위한 클래스 패스 설정 (0) | 2019.07.26 |