web-dev-qa-db-ja.com

外部jarをhadoopクラスパスに設定する

私は外部jarをhadoopクラスパスに設定しようとしていますが、今のところうまくいきません。

次の設定があります

$ hadoopバージョン
Hadoop 2.0.6-alpha Subversion https://git-wip-us.Apache.org/repos/asf/bigtop.git -r ca4c88898f95aaab3fd85b5e9c194ffd647c2109 2013-10にjenkinsによりコンパイル-31T07:55Zチェックサム付きのソースから95e88b2a9589fa69d6d5c1dbd48d4eこのコマンドは、/ usr/lib/hadoop/hadoop-common-2.0.6-alpha.jarを使用して実行されました

クラスパス

$エコー$ HADOOP_CLASSPATH
/home/tom/workspace/libs/opencsv-2.3.jar

上記のHADOOP_CLASSPATHがhadoopによって取得されたことがわかります

$ hadoopクラスパス
/etc/hadoop/conf:/ usr/lib/hadoop/lib /:/ usr/lib/hadoop /.//:/ home/tom/workspace/libs/opencsv-2.3.jar:/ usr/lib/hadoop-hdfs /./:/ usr/lib/hadoop-hdfs/lib /:/usr/lib/hadoop-hdfs/.//:/usr/lib/hadoop-yarn/lib/:/usr/lib /hadoop-yarn/.//:/usr/lib/hadoop-mapreduce/lib/:/usr/lib/hadoop-mapreduce/.//

コマンド

$Sudo hadoop jarFlightByCarrier.jar FlightByCarrier /user/root/1987.csv/user/root/result

-libjarsオプションも試してみました

$Sudo hadoop jarFlightByCarrier.jar FlightByCarrier /user/root/1987.csv/user/root/result- libjars/home/tom/workspace/libs/opencsv-2.3.jar

スタックトレース

14/11/04 16:43:23 INFO mapreduce.Job:Running job:job_1415115532989_0001 14/11/04 16:43:55 INFO mapreduce.Job:Job job_1415115532989_0001 running in uber mode:false 14/11/04 16:43 :56 INFO mapreduce.Job:map 0%reduce 0%14/11/04 16:45:27 INFO mapreduce.Job:map 50%reduce 0%14/11/04 16:45:27 INFO mapreduce.Job:Task Id:attempt_1415115532989_0001_m_000001_0、ステータス:FAILEDエラー:Java.lang。ClassNotFoundException:au.com.bytecode.opencsv。 CSVParserat Java.net.URLClassLoader $ 1.run(URLClassLoader.Java:366)at Java.net.URLClassLoader $ 1.run(URLClassLoader.Java:355)at Java.security.AccessController.doPrivileged (ネイティブメソッド)at Java.net.URLClassLoader.findClass(URLClassLoader.Java:354)at Java.lang.ClassLoader.loadClass(ClassLoader.Java:425)at Sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.Java:308 )Java.lang.ClassLoader.loadClass(ClassLoader.Java:358)at FlightByCarrierMapper.map(FlightsByCarrierMapper.Java:19)at FlightByCarrierMapper map(FlightsByCarrierMapper.Java:10)at org.Apache.hadoop.mapreduce.Mapper.run(Mapper.Java:144)at org.Apache.hadoop.mapred.MapTask.runNewMapper(MapTask.Java:757)at org.Apache .hadoop.mapred.MapTask.run(MapTask.Java:339)at org.Apache.hadoop.mapred.YarnChild $ 2.run(YarnChild.Java:158)at Java.security.AccessController.doPrivileged(Native Method)at javax。 security.auth.Subject.doAs(Subject.Java:415)at org.Apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.Java:1478)at org.Apache.hadoop.mapred.YarnChild.main(YarnChild.Java: 153)

どんな助けでも大歓迎です。

8
mnm

マップを実行しているノードに外部jarがありません。それを使用可能にするには、キャッシュに追加する必要があります。試してください:

DistributedCache.addFileToClassPath(new Path("pathToJar"), conf);

DistributedCacheが廃止されたバージョンはわかりませんが、Hadoop 2.2.0以降では次のように使用できます。

job.addFileToClassPath(new Path("pathToJar")); 
3
blackSmith

Opencsv jarをhadoopクラスパスに設定しようとしましたが、機能しませんでした。これを機能させるには、クラスパスにjarを明示的にコピーする必要があります。以下は私が従ったステップです:

私はこれをHDP CLusterで行いました.jarを実行する前に、opencsv jarをhbase libsにコピーしてエクスポートしました

ExternalJarsをHDP LIBSにコピー:

Open CSV Jarを実行するには:1.opencsv jarをディレクトリ/usr/hdp/2.2.9.1-11/hbase/lib/および/ usrにコピーします/hdp/2.2.9.1-11/hadoop-yarn/lib

**Sudo cp  /home/sshuser/Amedisys/lib/opencsv-3.7.jar /usr/hdp/2.2.9.1-11/hbase/lib/**

2. Sudo chmod 777 opencsv-3.7.jarを使用してファイルのアクセス許可を付与します。3.ファイルのリストls -lrt

4 .exporthadoop classpathhbase classpath

5.Jarを実行します。opencsvjarが取得され、正しく実行されます。

2
nitinm

外部JARをHadoopクラスパスに追加する場合は、hadoopが参照している既存のディレクトリの1つにJARをコピーすることをお勧めします。コマンドラインでコマンド「hadoop classpath」を実行し、適切なフォルダーを見つけてjarファイルをその場所にコピーすると、hadoopはそこから依存関係を取得します。これはCloudEraなどでは機能しません。ファイルをhadoopクラスパスフォルダーにコピーするための読み取り/書き込み権限がない可能性があるためです。

LIBJARsオプションも試したようですが、ドライバークラスを編集してTOOLインターフェイスを実装しましたか?まず、次のようにドライバークラスを編集してください。

_    public class myDriverClass extends Configured implements Tool {

      public static void main(String[] args) throws Exception {
         int res = ToolRunner.run(new Configuration(), new myDriverClass(), args);
         System.exit(res);
      }

      public int run(String[] args) throws Exception
      {

        // Configuration processed by ToolRunner 
        Configuration conf = getConf();
        Job job = new Job(conf, "My Job");

        ...
        ...

        return job.waitForCompletion(true) ? 0 : 1;
      }
    }
_

次に示すように、「hadoop jar」コマンドを編集します。

_hadoop jar YourApplication.jar [myDriverClass] args -libjars path/to/jar/file
_

ここで、下で何が起こるかを理解しましょう。基本的に、 TOOL Interface を実装することにより、新しいコマンドライン引数を処理しています。 ToolRunnerは、Toolインターフェースを実装するクラスを実行するために使用されます。 GenericOptionsParser と連携して機能し、汎用のhadoopコマンドライン引数を解析して、ツールの構成を変更します。

Main()内でToolRunner.run(new Configuration(), new myDriverClass(), args)を呼び出しています。これは、Tool.run(String [])によって指定されたツールを実行します指定された一般的な引数で解析した後。指定された構成を使用するか、nullの場合は構成を構築し、ツールの構成を、変更された可能性のあるconfのバージョンで設定します。

Runメソッド内で、getConf()を呼び出すと、Configurationの変更されたバージョンが取得されます。 コードに次の行があることを確認してください。他のすべてを実装し、それでもConfiguration conf = new Configuration()を使用する場合、何も機能しません。

_Configuration conf = getConf();
_
1
Isaiah4110

以下のようにToolRunnerを実装することで別の回避策を見つけました。このアプローチでは、hadoopはコマンドラインオプションを受け入れます。 DistributedCacheにファイルを追加するハードコーディングを回避できます。

 public class FlightsByCarrier extends Configured implements Tool {

       public int run(String[] args) throws Exception {
         // Configuration processed by ToolRunner
         Configuration conf = getConf();

         // Create a JobConf using the processed conf
         JobConf job = new JobConf(conf, FlightsByCarrier.class);

         // Process custom command-line options
         Path in = new Path(args[1]);
         Path out = new Path(args[2]);

         // Specify various job-specific parameters     
         job.setJobName("my-app");
         job.setInputPath(in);
         job.setOutputPath(out);
         job.setMapperClass(MyMapper.class);
         job.setReducerClass(MyReducer.class);

         // Submit the job, then poll for progress until the job is complete
         JobClient.runJob(job);
         return 0;
       }

       public static void main(String[] args) throws Exception {
         // Let ToolRunner handle generic command-line options 
         int res = ToolRunner.run(new Configuration(), new FlightsByCarrier(), args);

         System.exit(res);
       }
     }
0
mnm

私は問題の非常に簡単な解決策を見つけました:rootとしてログイン:

cd/usr/lib find。 -name "opencsv.jar"

ファイルの場所を取得します。私の場合> /usr/lib/Hive/lib/opencsv*.jarに見つかりました

コマンドを送信します

hadoopクラスパス

結果は、hadoopがjarファイルを検索するディレクトリを示しています。 1つのディレクトリを選択し、opencsv * jarをそのディレクトリにコピーします。

私の場合、それはうまくいきました。

0
user5856557