0

「hadoop in Action」ブックの簡単なプログラムを試して、ローカル ファイル システムの一連のファイルを hdfs の 1 つのファイルにマージしようとしています。コード スニペットは、書籍で提供されているものと同じです。

import java.lang.*;
import java.util.*;
import java.io.*;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.Path;

public class PutMerge {

    public static void main(String[] args) throws IOException{
        Configuration conf = new Configuration();
        FileSystem hdfs = FileSystem.get(conf);
        FileSystem local = FileSystem.getLocal(conf);

        Path inputDir = new Path(args[0]); // First argument has the input directory 
        Path hdfsFile = new Path(args[1]); // Concatenated hdfs file name

        try {
            FileStatus[] inputFiles = local.listStatus(inputDir); // list of Local Files

            FSDataOutputStream out = hdfs.create(hdfsFile); // target file creation

            for (int i = 0; i<inputFiles.size; i++ {

                FSDataInputStream in = local.open(inputFiles[i].getPath());

                int bytesRead = 0;
                byte[] buff = new byte[256];

                while (bytesRead = (in.read(buff))>0) {
                    out.write(buff,0,bytesRead);
                }
                in.close();
            }
            out.close();

        } 
        catch(Exception e) {
            e.printStackTrace();
        }

    }
}

プログラムは正常にコンパイルされ、実行しようとすると次の例外が発生します

スレッド「メイン」での例外 java.lang.NoClassDefFoundError: org/apache/commons/configuration/Configuration at org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.(DefaultMetricsSystem.java:37) at org.apache.hadoop.metrics2. lib.DefaultMetricsSystem.(DefaultMetricsSystem.java:34) で org.apache.hadoop.security.UgiInstrumentation.create(UgiInstrumentation.java:51) で org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:217) でorg.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:185) org.apache.hadoop.security.UserGroupInformation.isSecurityEnabled(UserGroupInformation.java:237) org.apache.hadoop.security.KerberosName.(KerberosName) .java:79) org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:210) org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:185) org.apache.hadoop.security.UserGroupInformation.isSecurityEnabled(UserGroupInformation.java:237) .apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:482) org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:468) org.apache.hadoop.fs.FileSystem$Cache$Key .(FileSystem.java:1519) org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1420) org.apache.hadoop.fs.FileSystem.get(FileSystem.java:254) org PutMerge.main(PutMerge.java:16) での .apache.hadoop.fs.FileSystem.get(FileSystem.java:123) 原因: java.lang.ClassNotFoundException: org.apache.commons.configuration.Configuration at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController. doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 17 詳細doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 17 詳細doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 17 詳細

いくつかの投稿からの入力に基づいて、commons パッケージを追加しました。私のクラスパスの定義は

/usr/java/jdk1.7.0_21:/data/commons-logging-1.1.2/commons-logging-1.1.2.jar:/data/hadoop-1.1.2/hadoop-core-1.1.2.jar:/data/commons-logging-1.1.2/commons-logging-adapters-1.1.2.jar:/data/commons-logging-1.1.2/commons-logging-api-1.1.2.jar:.

これが機能しない理由の手がかりはありますか?

4

1 に答える 1

1

クラスパス にApache構成を含めませんでした。

実際には、hadoop 自体以外に多くを含める必要はありません。Hadoop 自体で jar を実行していることを確認してください。

> hadoop -jar myJar.jar

于 2013-05-14T22:56:32.920 に答える