Hadoopの共通操作の概要

Hadoopのストリーミングサンプルプログラム(WORDCOUNT)

run_hadoop_word_counter.sh

$HADOOP_BIN streaming \
    -input "${INPUT}" \
    -output "${OUT_DIR}" \
    -cacheArchive "${TOOL_DIR}/python2.7.2.tgz""#." \
    -file "mapper_word_counter.py" \                                                                                                                                         
    -file "reducer_word_counter.py" \
    -file "filter_word_counter.py" \
    -mapper "./python2.7.2/bin/python mapper_word_counter.py" \
    -combiner "./python2.7.2/bin/python reducer_word_counter.py" \
    -reducer "./python2.7.2/bin/python reducer_word_counter.py" \
    -jobconf abaci.job.base.environment="centos6u3_hadoop" \
    -jobconf mapred.job.priority="NORMAL" \
    -jobconf mapred.job.name="${TASK_NAME}" \
    -jobconf mapred.map.tasks="${MAP_NUM}" \
    -jobconf mapred.reduce.tasks="${REDUCE_NUM}" \
    -jobconf mapred.map.memory.limit="1000" \
    -jobconf mapred.reduce.memory.limit="1000" \
    -jobconf mapred.job.map.capacity="3000" \
    -jobconf mapred.job.reduce.capacity="2500" \
    -jobconf mapred.job.keep.files.hours=12 \
    -jobconf mapred.max.map.failures.percent=1 \
    -jobconf mapred.reduce.tasks.speculative.execution="false"

mapper_word_counter.py

import sys 

for line in sys.stdin:
    fields = line.strip().split('\t')
    try:
        cnt = 1                                                                                                                                                              
        dateval = fields[1]
        sys.stdout.write('%s\t%d\n' %(dateval, cnt))
    except Exception as exp:
        sys.stderr.write("exp:%s, %s" %(str(exp), line))

reducer_word_counter.py

import sys 

word_pre = None
counter_pre = 0 

for line in sys.stdin:
    try:
        word, cnt  = line.strip().split('\t')                                                                                                                                
        cnt = int(cnt)
    except Exception as exp:
        sys.stderr.write('Exp:%s,line:%s' %(str(exp), line.strip()))
        continue

    if word == word_pre:
        counter_pre += cnt 
    else:
        if word_pre:
            print('%s\t%d' %(word_pre, counter_pre))
        word_pre = word
        counter_pre = cnt 

if word_pre:
    print('%s\t%d' %(word_pre, counter_pre))

プレーンテキスト入力フォーマット

  • 各マッパーは、いくつかの行を入力して
    「org.apache.hadoop.mapred.TextInputFormat」-inputformat
  • 入力マッパあたりの行の数を指定する
    「org.apache.hadoop.mapred.lib.NLineInputFormat」-jobconf mapred.line.input.format.linespermap =「-inputformat 5」

ファイルの配布方法:

次いで、コンピューティングノードに配布クライアントのローカルファイルアップロード標識されたジャーパッケージHDFS -file;
-cacheFileはHDFSにファイルを分散コンピューティングノードと、
HDFSに分配-cacheArchive圧縮ファイルをコンピューティングノードを抽出します。

分ソートバケツ&

出力ラインが区切り、鍵のように行全体、値がない場合のHadoopデフォルトマップは、後者の値としてフロントキーの一部として出力セパレータ(デフォルトの\ T)で遭遇する最初の行を、意志これは、空の文字列に設定されています。別のパーティションに配布してキーマッパー出力は内部の削減します。

  • アプリケーション例
${HADOOP_BIN} streaming \
    -input "${INPUT}" \
    -output "${OUT_DIR}" \
    -mapper cat \
    -reducer cat \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
    -jobconf mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
    -jobconf stream.num.map.output.key.fields=4 \
    -jobconf stream.map.output.field.separator=. \
    -jobconf map.output.key.field.separator=. \
    -jobconf mapred.text.key.partitioner.options=-k1,2 \
    -jobconf mapred.text.key.comparator.options="-k3,3 -k4nr" \
    -jobconf stream.reduce.output.field.separator=. \
    -jobconf stream.num.reduce.output.key.fields=4 \
    -jobconf mapred.reduce.tasks=5

説明:

  • キー設定マッパー出力
    マップ出力フィールドセパレータ設定stream.map.output.field.separatorを
    stream.num.map.output.key.fieldsマップ出力が最初の数でキーフィールドとして提供
  • キーバレル設定ルール分割
    org.apache.hadoop.mapred.lib.KeyFieldBasedPartitionerパーティションタイプ
    map.output.key.field.separatorキー内に配置されたフィールドセパレータ(KeyFieldBasedPartitionerとKeyFieldBasedComparator特定)
    num.key.fieldsをキー・フィールド内に配置され.for.partitionは、最初のいくつかのパーティションに使用される
    num.keyと共に使用mapred.text.key.partitioner.optionsの別のパーティションを実行するフィールドを指定するためのキー、及びnum.key.fields.for.partition勝つ.fields.for.partition
  • 設定ソートキールールに従って
    テキストベースの-nによって辞書順やデジタルコンパレータに基づいて、デフォルトの高度なKeyFieldBasedComparatorコンパレータを柔軟に設定することができ、
    キーフィールドまたはワードで提供mapred.text.key.comparator.optionsを比較しますセクションの範囲
  • 出力設定キー減速
    stream.reduce.output.field.separator出力フィールドセパレータ減らす配置
    stream.num.reduce.output.key.fieldsは、最初の数でキーフィールドとして提供される出力を減少させます

マルチ出力

Hadoopのは、複数の出力をサポートし、処理のMapReduce部-XXXXX-Xファイルの複数の出力データ(X AZが1である26文字の合計)。プログラムはmaper、<キー、値>となり<キー、値#X>でプログラム出力の形で/減速(タスクの減速が含ま)(マッパーのみタスクMRに対向する)必要がある拡張子を持つ特定のファイルを出力しますインチ 唯一の出力ファイルの接尾辞を指定するために使用#Xは、出力内容には表示されません。
スタートアップスクリプトは、指定する必要が
org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat -outputformat
または
-outputformat org.apache.hadoop.mapred.lib.SuffixMultipleSequenceFileOutputFormat

  • アプリケーション例
    run_hadoop.sh
${HADOOP_BIN} streaming \
    -input "${INPUT}" \
    -output "${OUT_DIR}" \
    -cacheArchive "${TOOL_DIR}/python2.7.2.tgz""#." \
    -file "mapper_worker.sh" \
    -file "reducer_worker.py" \
    -mapper "sh mapper_worker.sh" \
    -reducer "python2.7.2/bin/python reducer_worker.py" \
    -inputformat "org.apache.hadoop.mapred.TextInputFormat" \
    -outputformat "org.apache.hadoop.mapred.lib.SuffixMultipleTextOutputFormat" \
    -jobconf mapred.job.priority="NORMAL" \
    -jobconf mapred.job.name="${TASK_NAME}" \
    -jobconf mapred.map.tasks="${MAP_NUM}" \
    -jobconf mapred.reduce.tasks="${REDUCE_NUM}" \
    -jobconf mapred.max.split.size=134217728 \
    -jobconf mapred.map.memory.limit="800" \
    -jobconf mapred.reduce.memory.limit="500" \
    -jobconf mapred.job.map.capacity="3500" \
    -jobconf mapred.job.reduce.capacity="2000" \
    -jobconf mapred.job.keep.files.hours=12 \
    -jobconf mapred.max.map.failures.percent=1 \
    -jobconf mapred.reduce.tasks.speculative.execution="false"

reducer_worder.py

for line in sys.stdin:
    record = line.strip()
    fields = record.split('\t')
    if len(fields) != 7:
        continue
    vcpurl, playurl, title, poster, duration, pubtime, accept = fields
    duration = int(duration)
    pubtime = int(pubtime)
    accept = int(accept)
    if duration < 60:
        sys.stdout.write('%s#A\n' %(record))
    elif duration < 300:
        sys.stdout.write('%s#B\n' %(record))
    else:
        sys.stdout.write('%s#C\n' %(record))

ローカルデバッグ

プログラムのバグを開始する前にMRタスクでの発見を避けるために、地元のアナログMRの過程で先に最高のランニング、それは結果が予想と一致している確認します

cat inputfile | ./mapper_task.sh | sort -t$'\t' -k1,1 | ./reducer.sh

圧縮出力

Hadoopのデフォルトサポートのgzip圧縮は、ストリーミングの動作は、出力GZIP圧縮形式で、次のパラメータを指定することができます。

-D mapreduce.output.fileoutputformat.compress=true
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec

Hadoopがデータ圧縮された読み込み可能な自己GZIP、特別な入力が指定されていないGzip圧縮です。Gzip圧縮は、欠点は非常に高い圧縮効率ではありません、圧縮率と効率の両方を持つことはできません、あなたは他の圧縮方法を検討する必要があり、比較的高い、Hadoopをネイティブにサポートすることを特徴とします。

Hadoopの一般的な設定項目

コンフィギュレーション名 説明
abaci.job.base.environment システムは環境をアップグレードする必要がある場合、あなたはglibcのそれ以降のバージョンをサポートするcentos6u3_hadoop指定することができますcentos6u3_hadoop
stream.memory.limit シングルマップ/最大ワーキングメモリを減らし、デフォルトの800M
mapred.map.memory.limit 単一のメモリ・マップを使用することは、最も高い優先度はstream.memory.limitよりも高く、
mapred.reduce.memory.limit 単一のメモリ、stream.memory.limitよりも高い優先度の最大使用量を削減
mapred.map.capacity.per.tasktracker 同時に、マップの数を開始する各マシンのセットアップ
mapred.reduce.capacity.per.tasktracker 同時に開始する各マシンのセットアップは、数を減らします
mapred.job.map.capacity 同時マップの数
mapred.job.reduce.capacity 同時の数を減らします
abaci.job.map.max.capacity マップの同時実行の制限、デフォルトの10000
abaci.job.reduce.max.capacity 同時実行の制限、デフォルトの3000を減らします
mapred.map.tasks マップの数
mapred.reduce.tasks 数を減らします
mapred.job.reuse.jvm.num.tasks 1 -1、全く再利用がないことを意味無制限の再利用を示し、他の値の数は、各JVM再利用することを示しています。再利用、それはマップの最後にメモリを解放しません。
mapred.compress.map.output マップの出力を圧縮するかどうかを指定します。慎重に圧縮アルゴリズムを選択する必要が、減圧をioを、圧縮と解凍は、CPUコストを持って、データの量を減らすのに役立ちます
mapred.map.output.compression.codec 圧縮アルゴリズムマップ出力
mapred.output.compress 出力を削減することは圧縮されています
mapred.output.compression.codec 圧縮はmapredの出力を制御され、
io.compression.codecs 圧縮アルゴリズム
mapred.max.map.failures.percent デフォルトは0であるマップのエラー率を、容認
mapred.max.reduce.failures.percent 許容誤差の割合を減らし、デフォルトは0です
stream.map.output.field.separator マップ出力セパレータ、デフォルトのタブ
stream.reduce.output.field.separator 出力セパレータ、デフォルトのタブを減らします
mapred.textoutputformat.separator キーTextOutputFormatの出力を設定し、値の区切り、デフォルトのタブ
mapred.textoutputformat.ignoreseparator trueに設定した後、タブを埋める自動的に削除されます何のキー値が存在しない場合にのみ、
mapred.min.split.size マップを指定する処理データの最小量、単位B
mapred.max.split.size 設定中地図データは、指定された量、ユニットBまでの処理のInputFormat = org.apache.hadoop.mapred.CombineTextInputFormat
mapred.combine.input.format.local.only 現在のノードの合併は、デフォルト真は、falseに設定されているノード間でデータをマージすることができます
abaci.job.map.cpu.percent 会計消費CPUマップ、40のデフォルト値(40%、すなわち0.4 CPU、CPUを示します)
abaci.job.reduce.cpu.percent 低減消費は、CPUを占め、40のデフォルト値(40%のCPU、すなわちCPU 0.4を示します)
mapred.map.capacity.per.tasktracker 各ノードは、(パラメータメモリによれば、デフォルトは8で適宜増減)ジョブマップタスクの並列実行の最大数を表します。
mapred.reduce.capacity.per.tasktracker 各ノードは、(適切パラメータメモリに応じて増減、デフォルトは8参照)ジョブの最大ランいくつかの平行減らすタスクを表します
mapred.map.tasks.speculative.execution 真のオープンマップ投機的実行、デフォルト
mapred.reduce.tasks.speculative.execution 开启reduce预测执行,默认true

Hadoop环境下系统变量

  • 变量名列表
变量名 变量说明
HADOOP_HOME 计算节点上配置的Hadoop路径
LD_LIBRARY_PATH 计算节点上加载库文件的路径列表
PWD 当前工作目录
dfs_block_size 当前设置的HDFS文件块大小
map_input_file mapper正在处理的输入文件路径
mapred_job_id 作业ID
mapred_job_name 作业名
mapred_tip_id 当前任务的第几次重试
mapred_task_id 任务ID
mapred_task_is_map 当前任务是否为map
mapred_output_dir 计算输出路径
mapred_map_tasks 计算的map任务数
mapred_reduce_tasks 计算的reduce任务数

https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html#Configured+Parameters

  • 应用示例:
    Shell版
#!/bin/bash

set -o pipefail
HOST="localhost"
PORT=$((1000 + ${mapred_task_partition}))

awk '{print $2}' \
    | ./access_remote_data ${HOST} ${PORT} outdata.gz
                                                                                                                                                     
hdfs_outfile=${mapred_work_output_dir}/${mapred_task_partition}.pack
cat outdata.gz \
    | gzip -d \
    | python ../postprocess.py
    | ${HADOOP_HOME}/bin/hadoop fs -D hadoop.job.ugi="username,pwd" -copyFromLocal - ${hdfs_outfile}

Python版

import os

input_file = os.environ['mapreduce_map_input_file']
#do something else

References

Hadoop Streaming相关官方文档:https://hadoop.apache.org/docs/r3.1.2/hadoop-streaming/HadoopStreaming.html
Hadoop Streaming入门:http://icejoywoo.github.io/2015/09/28/introduction-to-hadoop-streaming.html
Hadoop排序工具用法小结:http://www.dreamingfish123.info/?p=1102
Hadoop压缩选项权衡:https://www.slideshare.net/Hadoop_Summit/singh-kamat-june27425pmroom210c

おすすめ

転載: www.cnblogs.com/jeromeblog/p/11464693.html