Hadoop、-libjarsによるサードパーティのjarの導入方法



Hadoop How Introduce Third Party Jar Libjars



「hadoojar」コマンドを使用して、ジョブ開始「libjars」オプションパラメーターに送信し、ToolRunnerツールと組み合わせて引数を解析し、ジョブを実行できます。このアプローチは、簡単に実現できるため、推奨される使用法の1つです。ジョブのhadoopクラスパスの依存関係とデカップリングには、各ジョブのlibjars個別パラメーターを指定できます。これらのjarは、ジョブがhadoopの「共有ファイルシステム」(hdfs、/ tmpフォルダー)に送信された後にコピーされ、次にtaskTrackerが読み込まれ、ローカルタスクの子プロセスに読み込まれます。

libjarは、指定されたすべてのジョブjarフルパスに依存する必要があり、これらのjarは、現在のローカルファイルシステムで(クラスターがこのjarを持つ必要はありません)、hdfsでまだサポートされていません。すでに含まれているHADOOP_CLASSPATHmapred.child.envまたはjarの場合、パラメーター-libjarsを再度指定する必要はありません。 libjarはjarのフルパス名を指定する必要があるため、特にjarの場合は非常に多くのことが行われるため、操作は非常に不便です。通常、HADOOP_CLASSPATH jarまたはmapred.child.endで共有される複数のジョブを構成します。これは、 -libjarsオプションで指定されたjar(少量)に依存します。



1. ToolRunner開発ツールでない場合は、次のコードをプロセスに追加できますmappreduce解像度パラメーター

public static void main(String[] args) throws Exception { Properties properties = System.getProperties() properties.setProperty('HADOOP_USER_NAME', 'hadoop') Configuration configuration = new Configuration() configuration.set('fs.defaultFS', 'hdfs://hadoop000:8020') configuration.set('dfs.client.use.datanode.hostname', 'true') configuration.set('mapred.jar', 'D:\ruoze_g7\ruoze\hadoop-project\target\hadoop-project-1.0-customer-dependencies.jar') configuration.set('mapreduce.framework.name', 'yarn') configuration.set('yarn.resourcemanager.hostname', 'hadoop000') configuration.set('mapreduce.app-submission.cross-platform', 'true') CommandLine commandLine = new GenericOptionsParser(configuration, args).getCommandLine() String[] tmpArgs = commandLine.getArgs() Job job = Job.getInstance(configuration, 'ETLApp') job.setJarByClass(ETLApp.class) job.setMapperClass(MyMapper.class) job.setMapOutputKeyClass(Text.class) job.setMapOutputValueClass(NullWritable.class) // String input = args[1] String input = 'hdfs://hadoop000:8020/hadoop/project/input/access/day=' // on the server, the date is the second parameter value args array String date = args[2] if (StringUtils.isNotEmpty(date)) { input = input + date } // String output = args[2] String output = 'hdfs://hadoop000:8020/hadoop/project/wide/access/day=' if (StringUtils.isNotEmpty(date)) { output = output + date } FileUtils.deleteTarget(output, configuration) // String cacheFilePath = args[3] String cacheFilePath = 'hdfs://hadoop000:8020/hadoop/project/input/base/ip.txt' // load data into the distributed cache job.addCacheFile(new URI(cacheFilePath)) FileInputFormat.setInputPaths(job, new Path(input)) FileOutputFormat.setOutputPath(job, new Path(output)) boolean result = job.waitForCompletion(true) CounterGroup etl = job.getCounters().getGroup('etl') Iterator iterator = etl.iterator() while (iterator.hasNext()){ Counter next = iterator.next() System.out.println('----------' + next.getName() + ' : ' + next.getValue()) } System.exit(result ? 0:1) } hadoop jar hadoop-project-1.0.jar com.wxx.bigdata.mr.ETLApp -libjars /home/hadoop/lib/thirdjar/hadoop/fastjson-1.2.51.jar 20190921

コードに代わってサーバーに配置されたパッケージ、および依存関係は、次の行の適切なパスにコピーされます。プログラムは引数を介して「20190921」をフェッチします[2]



CommandLine commandLine = new GenericOptionsParser(configuration, args).getCommandLine() String[] tmpArgs = commandLine.getArgs() Specific code as follows 

コマンドを実行します。例外は報告されません。サードパーティの依存関係を見つけることができません。
2. ToolRunnerを開発し、runメソッドを実現します
特定の参照: http://grepalex.com/2013/02/25/hadoop-libjars/
http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/util/ToolRunner.html