MapReduceのカウンターとは何ですか?
カウンターは、ジョブの状態の進捗状況や実行を記録するために使用されます。その役割は、ログとして理解することができます。私たちは、データや進行中のプログラムカウンタのどこかで、レコードの変更を挿入することができます。
MapReduceはカウンター何をしますか?
詳細なデータのさまざまな、私たちのためにウィンドウを提供するために、MapReduceのカウンタ(カウンタ)のMapReduceジョブの動作期間を観察しました。MapReduceはMapReduceのパフォーマンス最適化の評価は、主にこれらのカウンターの実証された値に基づいており、パフォーマンスチューニングのために有用です。
MapReduceは何をして、内蔵されているカウンタ?
MapReduceのは、デフォルトのカウンタの数が付属して、今、私たちは、これらのカウンターの意味を分析するために、ジョブ結果の観察を容易にするために、そのような入力のバイト数、出力としてバイトとピースの数、バイト数、地図エンド入力/出力、削減持っています/バイト入力及び個数等の出力端。今、私たちは、これらは内蔵のカウンタ、カウンタは、グループ(グループ名)とカウンタ名(counterName)の名前を知って、カウンタを使用した後、グループ名とcounterNameが可能になります知っている必要があります。
カウンタータスク
タスクの実行中に、各ジョブのすべてのタスクの結果のジョブカウンタに関する情報を収集する作業が収集されます。例えば、MAP_INPUT_RECORDSカウンタ各マップタスクの入力レコードの合計数をカウントし、コレクトマップ上の最終的な数は、全体の仕事のためにすべての入力レコードの和であるので、そのジョブのすべてのタスク、。タスクは、それに関連するメンテナンスタスクに対抗し、定期的にTaskTrackerに送られ、その後、TaskTrackerによってJobTrackerに送信されました。したがって、カウンタは、グローバルに集約することができます。我々の下にはカウンターさまざまなタスクを理解しています。
- MapReduceのタスクカウンタ
- GroupNameのMapReduceのタスクカウンタはorg.apache.hadoop.mapreduce.TaskCounter、次の表を含んカウンターです。
- GroupNameのMapReduceのタスクカウンタはorg.apache.hadoop.mapreduce.TaskCounter、次の表を含んカウンターです。
- ファイルシステムのカウンター**
- グループ名のファイル・システム・カウンタorg.apache.hadoop.mapreduce.FileSystemCounter、次の表を含んカウンターです。
- FileInputFormat(入力ファイルタスク)カウンタ
- GroupNameのFileInputFormatカウンタは、以下の表にカウンタを含んorg.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter、括弧内のカラムカウンタ名は、()コンテンツcounterNameです。
- GroupNameのFileInputFormatカウンタは、以下の表にカウンタを含んorg.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter、括弧内のカラムカウンタ名は、()コンテンツcounterNameです。
- FileOutputFormat(出力ファイルタスク)カウンタ
- :GroupNameのFileOutputFormatカウンタは、以下の表にカウンターが含まれているorg.apache.hadoop.mapreduce.lib.input.FileOutputFormatCounter、ある
ジョブのカウンター
- :GroupNameのFileOutputFormatカウンタは、以下の表にカウンターが含まれているorg.apache.hadoop.mapreduce.lib.input.FileOutputFormatCounter、ある
- カウンタはJobTrackerジョブ(又はヤーン)によって維持される、異なる含む他のカウンタ「ユーザー定義カウンタ」を含むネットワークを横切って送信データの必要がありません。これらのカウンタは、ジョブ・レベルの統計です、その値は、実行するタスクに変更されることはありません。
- グループ名のジョブカウンタカウンタorg.apache.hadoop.mapreduce.JobCounter、次の表を含んカウンターです。
- グループ名のジョブカウンタカウンタorg.apache.hadoop.mapreduce.JobCounter、次の表を含んカウンターです。
使用に対抗するには?カウンタを使用する方法のレビューしてみましょう。
- カスタムカウンタ
- 列挙型の宣言カウンター
// 自定义枚举变量Enum
Counter counter = context.getCounter(Enum enum)
- カスタムカウンタ
// 自己命名groupName和counterName
Counter counter = context.getCounter(String groupName,String counterName)
- カウンター割り当てへ
- カウンタを初期化します
counter.setValue(long value);// 设置初始值
- 计数器自增
counter.increment(long incr);// 增加计数
- カウンタの値を取得します。
- 列挙カウンタの値を取得します。
Configuration conf = new Configuration();
Job job = new Job(conf, "MyCounter");
job.waitForCompletion(true);
Counters counters=job.getCounters();
Counter counter=counters.findCounter(LOG_PROCESSOR_COUNTER.BAD_RECORDS_LONG);// 查找枚举计数器,假如Enum的变量为BAD_RECORDS_LONG long value=counter.getValue();//获取计数值
- カスタムカウンタの値を取得します。
Configuration conf = new Configuration();
Job job = new Job(conf, "MyCounter");
job.waitForCompletion(true);
Counters counters = job.getCounters();
Counter counter=counters.findCounter("ErrorCounter","toolong");// 假如groupName为ErrorCounter,counterName为toolong long value = counter.getValue();// 获取计数值
- 内蔵のカウンタの値を取得します
Configuration conf = new Configuration();
Job job = new Job(conf, "MyCounter");
job.waitForCompletion(true);
Counters counters=job.getCounters(); // 查找作业运行启动的reduce个数的计数器,groupName和counterName可以从内置计数器表格查询(前面已经列举有)
Counter counter=counters.findCounter("org.apache.hadoop.mapreduce.JobCounter","TOTAL_LAUNCHED_REDUCES");// 假如groupName为org.apache.hadoop.mapreduce.JobCounter,counterName为TOTAL_LAUNCHED_REDUCES long value=counter.getValue();// 获取计数值
- すべてのカウンタの値を取得します。
Configuration conf = new Configuration();
Job job = new Job(conf, "MyCounter");
Counters counters = job.getCounters();
for (CounterGroup group : counters) {
for (Counter counter : group) {
System.out.println(counter.getDisplayName() + ": " + counter.getName() + ": "+ counter.getValue());
}
}
カスタムカウンタ
カスタムカウンタは、特に無効な統計データの数に、我々はエラーログの数を記録するためにカウンタを使用する、広く使われています。ここではカスタムカウンタ、統計無効な入力。
データセットは、
ファイル指定形式はセパレータとして三つのフィールド、「\ T」は、2つの異常なデータである場合、データフィールドは、4つのデータフィールドを持つ2つだけの一つです。次のようの内容は以下のとおりです。
実現
public class MyCounter {
// \t键
private static String TAB_SEPARATOR = "\t";
public static class MyCounterMap extends Mapper<LongWritable, Text, Text, Text> {
// 定义枚举对象
public static enum LOG_PROCESSOR_COUNTER {
BAD_RECORDS_LONG, BAD_RECORDS_SHORT
};
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String arr_value[] = value.toString().split(TAB_SEPARATOR);
if (arr_value.length > 3) {
/* 自定义计数器 */
context.getCounter("ErrorCounter", "toolong").increment(1);
/* 枚举计数器 */ context.getCounter(LOG_PROCESSOR_COUNTER.BAD_RECORDS_LONG).increment(1);
} else if (arr_value.length < 3) {
// 自定义计数器
context.getCounter("ErrorCounter", "tooshort").increment(1);
// 枚举计数器 context.getCounter(LOG_PROCESSOR_COUNTER.BAD_RECORDS_SHORT).increment(1);
}
}
}
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
String[] args0 = {
"hdfs://hadoop2:9000/buaa/counter/counter.txt",
"hdfs://hadoop2:9000/buaa/counter/out/"
};
// 读取配置文件
Configuration conf = new Configuration();
// 如果输出目录存在,则删除
Path mypath = new Path(args0[1]);
FileSystem hdfs = mypath.getFileSystem(conf);
if (hdfs.isDirectory(mypath)) {
hdfs.delete(mypath, true);
}
// 新建一个任务
Job job = new Job(conf, "MyCounter");
// 主类
job.setJarByClass(MyCounter.class);
// Mapper
job.setMapperClass(MyCounterMap.class);
// 输入目录
FileInputFormat.addInputPath(job, new Path(args0[0]));
// 输出目录
FileOutputFormat.setOutputPath(job, new Path(args0[1]));
// 提交任务,并退出
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
出力ログでの演算結果は、カウンタビューの値は
、ログから見ることができ、そして2つの方法で列挙型のカスタムカウンタを通じて、データの統計は同じ不規則です。