私は外部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)
どんな助けでも大歓迎です。
マップを実行しているノードに外部jarがありません。それを使用可能にするには、キャッシュに追加する必要があります。試してください:
DistributedCache.addFileToClassPath(new Path("pathToJar"), conf);
DistributedCache
が廃止されたバージョンはわかりませんが、Hadoop 2.2.0以降では次のように使用できます。
job.addFileToClassPath(new Path("pathToJar"));
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 classpath
:hbase classpath
5.Jarを実行します。opencsvjarが取得され、正しく実行されます。
外部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();
_
以下のように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);
}
}
私は問題の非常に簡単な解決策を見つけました:rootとしてログイン:
cd/usr/lib find。 -name "opencsv.jar"
ファイルの場所を取得します。私の場合> /usr/lib/Hive/lib/opencsv*.jarに見つかりました
コマンドを送信します
hadoopクラスパス
結果は、hadoopがjarファイルを検索するディレクトリを示しています。 1つのディレクトリを選択し、opencsv * jarをそのディレクトリにコピーします。
私の場合、それはうまくいきました。