JRubyでJobTrackerにアクセスする方法

JRubyからJobTrackerにアクセスする方法を紹介します。


JRubyなので、JavaクラスのJobClinet経由でJobTrakcerにアクセスして、
情報を取得することが出来ます。


今回の例はCDH3u0の環境で動かしています。
また、実行時にHadoopの設定ファイルにクラスパスを通す必要があります。


以下は、動いているジョブのJobIDを出力する例です。

include Java

..必要なjarをrequire(省略)

client = org.apache.hadoop.mapred.JobClient.new(org.apache.hadoop.mapred.JobConf.new)

job_statuses = client.all_jobs

job_statuses.each do |job_status|
  puts job_status.job_id if not job_status.job_complete?
end


次は、動いているジョブの各タスクの進捗を表示する例です。

include Java

..必要なjarをrequire(省略)

client = org.apache.hadoop.mapred.JobClient.new(org.apache.hadoop.mapred.JobConf.new)

job_statuses = client.all_jobs

job_statuses.each do |job_status|
  if not job_status.job_complete?
    puts job_status.job_id

    # map task
    task_reports = client.get_map_task_reports(job_status.job_id)
    task_reports.each do |task_report|
      puts "\t#{task_report.task_id} : #{task_report.progress}"
    end

    # reduce task
    task_reports = client.get_reduce_task_reports(job_status.job_id)
    task_reports.each do |task_report|
      puts "\t#{task_report.task_id} : #{task_report.progress}"
    end
  end
end


最後に動いてるジョブのカウンター情報を表示する例。

include Java

..必要なjarをrequire(省略)

client = org.apache.hadoop.mapred.JobClient.new(org.apache.hadoop.mapred.JobConf.new)

job_statuses = client.all_jobs
job_statuses.each do |job_status|
  if not job_status.job_complete?
    puts job_status.job_id
    job = client.get_job(job_status.job_id)
    puts job.counters
  end
end

単に、JRubyでJobClinetクラスにアクセスしてるだけの話ですが、
jirbを使って対話的に情報を取得したり、
手軽にスクリプトを組んで監視スクリプトなど
色々書けるので便利だと思いました。