Hadoop-Streaming实战经验及问题解决方法总结
目录 1. ? Join操作分清join的类型很重要 2. ?启动程序中key字段和partition字段的设定 3. ?控制hadoop程序内存的方法 4. ? 对于数字key的排序问题 5. ? 在mapper中获取map_input_file环境变量的方法 6. ? 运行过程中记录数据的方法 7. ?多次运行Hadoop之是
目录
1. ? Join操作分清join的类型很重要…
2. ?启动程序中key字段和partition字段的设定…
3. ?控制hadoop程序内存的方法…
4. ? 对于数字key的排序问题…
5. ? 在mapper中获取map_input_file环境变量的方法…
6. ? 运行过程中记录数据的方法…
7. ?多次运行Hadoop之是否成功的判断…
8. ?对stdin读取的 line的预处理…
9. ?Python字符串的连接方法…
10. ?怎样查看mapper程序的输出…
11. ?SHELL脚本中变量名的命名方法…
12. ?提前设计好流程能简化很多重复工作…
13. ?其他一些实用经验…
1. Join操作分清join的类型很重要
Join操作是hadoop计算中非常常见的需求,它要求将两个不同数据源的数据根据一个或多个key字段连接成一个合并数据输出,由于key字段数据的特殊性,导致join分成三种类型,处理方法各有不同,如果一个key在数据中可以重复,则记该数据源为N类型,如果只能出现一次,则记为1类型。
1) ?类型1-1的join
比如(学号,姓名)和(学号,班级)两个数据集根据学号字段进行join,因为同一个学号只能指向单个名字和单个班级,所以为1-1类型,处理方法是map阶段加上标记后,reduce阶段接收到的数据是每两个一个分组,这样的话只需要读取第一行,将非key字段连到第二行后面即可。
每个学号输出数据:1*1=1个
2) ?类型1-N或者N-1的join
比如(学号,姓名)和(学号,选修的课程)两个数据集根据学号字段的join,由于第二个数据源的数据中每个学号会对应很多的课程,所以为1-N类型join,处理方法是map阶段给第一个数据源(类型1)加上标记为1,第二个数据源加上标记为2。这样的话reduce阶段收到的数据以标记为1的行分组,同时每组行数会大于2,join方法是先读取标记1的行,记录其非key字段Field Value 1,然后往下遍历,每次遇到标记2的行都将Field Value 1添加到该行的末尾并输出。
每个学号输出数据:1*N=N*1=N个
3) ?类型M-N的join
比如(学号,选修的课程)和(学号,喜欢的水果)根据学号字段做join,由于每个数据源的单个学号都会对应多个相应数据,所以为M*N类型。处理方法是map阶段给数据源小的加上标记1(目的是reduce阶段的节省内存),给数据源大的加上标记2,reduce阶段每个分组会有M*N行,并且标记1的全部在标记2的前面。Join方法是先初始化一个空数组,遇到标记1的行时,将非key数据都记录在数组中,然后遇到标记2的行时,将数组中的数据添加在该行之后输出。
每个学号输出数据:M*N个
2. 启动程序中key字段和partition字段的设定
在join计算过程中,有两个字段非常的重要并需要对其理解,就是排序字段key和分区字段partition的指定。
字段 | 字段说明 |
num.key.fields.for.partition |
用于分区,只影响数据被分发到哪个reduce机器,但不影响排序 |
stream.num.map.output.key.fields |
Key的意思就是主键,这个主键会影响到数据根据前几列的排序 |
org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner | 如果需要对字段排序、分区,默认都得加上此设置 |
上面三个配置尤其会影响到join计算时的配置:
1) ?如果是单key的join,因为要加上标记字段排序,所以设定key=2,同时设定partition=1对第一个字段分区来保证同Key的数据都在同一台机器上;
2) ?如果是N个联合key的join,首先需要加上标记字段,所以设定key=N+1,用来对其进行排序,然后需要partition为N来对其按key分区。
3. 控制hadoop程序内存的方法
Hadoop程序是针对海量数据的,因此任何一个保存变量的操作都会在内存中造成N倍的存储,如果尝试用一个数组记录每一行或某些行的单个字段,用不到程序运行结束,hadoop平台就会爆出137内存超出的错误而被kill掉。
控制内存的方法就是少用变量、尤其数组来记录数据,最终实现当前行的处理与数据总规模的无关,汇总、M*N的join等处理不得不记录历史数据,对这种处理要做到用后及时释放,同时尽量记录在单变量而不是数组中,比如汇总计算可以每次记录累加值,而不是先记录所有的元素最后才汇总。
4. 对于数字key的排序问题
如果不加以处理,排序处理过程中数字1会排在10之后,处理方法是需要在数字前面补0,比如如果全部有2位,就将个位数补1个零,让01和10比较,最终reduce输出的时候,再转回来,需要先预测数字的位数。
在mapper.py中:
Print ‘%010d\t%s’%(int(key),value)
其中key既然是数字,就需要用数字的格式化输出%010d表示将输出10位的字符串,如果不够10位,前面补0。
在reducer.py中,最终输出时,使用转int的方法去掉前面的0:
Print ‘%d\t%s’%(int(key),value)
5. 在mapper中获取map_input_file环境变量的方法
在mapper中,有时候为了区分不同的数据文件来源,这时候可以用map_input_file变量来记录当前正在处理的脚本的文件路径。以下是两种判别方法:
a)??????? 用文件名判断
Import os
filepath = os.environ["map_input_file"]
filename = os.path.split(filepath)[-1]
if filename==”filename1”:
#process 1
elif filename==”filename2”:
#process2
b)??????? 用文件路径是否包含确定字符串判断
filepath = os.environ["map_input_file"]
if filepath.find(sys.argv[2])!=-1:
#process
6. 运行过程中记录数据的方法
Hadoop程序不同于本地程序的调试方法,可以使用错误日志来查看错误信息,提交任务前也可以在本地用cat input | mapper.py | sort | reducer.py > output这种方法来先过滤基本的错误,在运行过程中也可以通过以下方法记录信息:
1) ?可以直接将信息输出到std output,程序运行结束后,需要手工筛选记录的数据,或者用awk直接查看,但是会污染结果数据
2) ?大多采用的是用错误输出的方法,这样运行后可以在stderr日志里面查看自己输出的数据:sys.stderr.write(‘filename:%s\t’%(filename))
7. ?多次运行Hadoop之是否成功的判断
如果要运行多次的hadoop计算,并且前一次的计算结果是下一次计算的输入,那么如果上一次计算失败了,下一次很明显不需要启动计算。因此在shell文件中可以通过$?来判断上一次是否运行成功,示例代码:
if [ $? -ne 0 ];then
?? exit 1
fi
8. 对stdin读取的 line的预处理
Mapper和reducer程序都是从标准输入读取数据的,然而如果直接进行split会发现最后一个字段后面跟了个’\n’,解决方法有两种:
1) ?datas = line[:-1].split(‘\t’)
2) ?datas=line.strip().split(‘\t’)
第一种方法直接去除最后一个字符\n,然后split,第二种方法是去除行两边的空格 (包括换行),然后split。个人喜欢用第二种,因为我不确定是否所有行都是\n结尾的,但是有些数据两边会有空格,如果strip掉的话就会伤害数据,所以可以根据情景选用。
9. Python字符串的连接方法
Mapper和reducer的输出或者中间的处理经常需要将不同类型的字符串结合在一起,python中实现字符串连接的方法有格式化输出、字符串连接(加号)和join操作(需要将每个字段转化成字符类型)。
使用格式化输出:’%d\t%s’%(inti,str)
使用字符串的+号进行连接:’%d\t’%i+’\t’.join(list)
写成元祖的\t的Join:’\t’.join((‘%d’%i, ‘\t’.join(list)))
10. 怎样查看mapper程序的输出
一般来说,mapper程序经过处理后,会经过排序然后partition给不同的reducer来做下一步的处理,然而在开发过程中常常需要查看当前的mapper输出是否是预期的结果,对其输出的查看有两种需求。
需求一,查看mapper的直接输出:
在运行脚本中,不设定-reducer参数,也就是没有reducer程序,然后把-D mapred.reduce.tasks=0,即不需要任何reduce的处理,但是同时要设定-output选项,这样的话,在output的目录中会看到每个mapper机器输出的一个文件,就是mapper程序的直接输出。
需求二,查看mapper的输出被partition并排序后的内容,即reducer的输入是什么样子:在运行脚本中,不设定-reducer参数,也就是没有自己的reducer程序,然后把-D mapred.reduce.tasks=1或者更大的值,即有reduce机器,但是没有reducer程序,hadoop会认为有reducer是存在的,因此会继续对mapper的输出调用shuffle打乱和sort操作,这样的话就在output目录下面看到了reducer的输入文件,并且数目等于reducer设定的tasks个数。
11. SHELL脚本中变量名的命名方法
如果遇到很多的输入数据源和很多输出的中间结果,每个hadoop的输出都会用到下一步的输入,并且该人物也用到了其他的输出,这样的话最好在一个统一的shell配置文件中配置所有的文件路径名字,同时一定避免InputDir1、InputDir2这样的命名方法,变量命名是一种功力,一定要多练直观并且显而易见,这样随着程序规模的增加不会变的越来越乱。
12. 提前设计好流程能简化很多重复工作
近期自己接到一个较为复杂的hadoop数据处理流程,大大小小的处理估算的话得十几个hadoop任务才能完成,不过幸好没有直接开始写代码,而是把这些任务统一整理了一下,最后竟然发现很多个问题可以直接合并成一类代码处理,过程中同时将整个任务拆分成了很多小任务并列了个顺序,然后挨个解决小任务非常的快。Hadoop处理流程中如果任务之间错综复杂并相互依赖对方的处理结果,都需要事先设计好处理流程再开始事先。
13. 其他一些实用经验
1) ?Mapper和reducer脚本写在同一个Python程序,便于对比和查看;
2) ?独立编写数据源的字段信息和位置映射字典,不容易混淆;
3) ?抽取常用的如输出数据、读入数据模块为独立函数;
4) ?测试脚本及数据、run脚本、map-reduce程序分目录放置;
原文地址:Hadoop-Streaming实战经验及问题解决方法总结, 感谢原作者分享。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Win11 システムに中国語言語パックをインストールできない問題の解決策 Windows 11 システムの発売に伴い、多くのユーザーは新しい機能やインターフェイスを体験するためにオペレーティング システムをアップグレードし始めました。ただし、一部のユーザーは、アップグレード後に中国語の言語パックをインストールできず、エクスペリエンスに問題が発生したことに気づきました。この記事では、Win11 システムに中国語言語パックをインストールできない理由について説明し、ユーザーがこの問題を解決するのに役立ついくつかの解決策を提供します。原因分析 まず、Win11 システムの機能不全を分析しましょう。

スマートフォン技術が発展し続けるにつれて、携帯電話は私たちの日常生活においてますます重要な役割を果たしています。 Black Shark フォンは、ゲーム パフォーマンスに重点を置いたフラッグシップ フォンとして、プレイヤーから高い支持を得ています。ただし、場合によっては、Black Shark 携帯電話の電源が入らないという状況にも直面するため、この問題を解決するために何らかの措置を講じる必要があります。次に、Black Shark 携帯電話の電源が入らない問題を解決する方法を説明する 5 つのヒントを共有しましょう: ステップ 1: バッテリー残量を確認する まず、Black Shark 携帯電話に十分な電力があることを確認します。携帯電話のバッテリーが消耗している可能性があります

ソーシャルメディアの継続的な発展に伴い、Xiaohongshu はますます多くの若者が自分たちの生活を共有し、美しいものを発見するためのプラットフォームとなっています。多くのユーザーは、画像を投稿する際の自動保存の問題に悩まされています。では、この問題をどうやって解決すればよいでしょうか? 1.小紅書で公開するときに写真が自動的に保存される問題を解決するにはどうすればよいですか? 1. キャッシュをクリアする まず、Xiaohongshu のキャッシュ データをクリアしてみます。手順は次のとおりです: (1) 小紅書を開いて右下隅の「マイ」ボタンをクリックします。 (2) 個人センター ページで「設定」を見つけてクリックします。 (3) 下にスクロールして「」を見つけます。 「キャッシュをクリア」オプションを選択し、「OK」をクリックします。キャッシュをクリアした後、Xiaohongshu を再起動し、写真を投稿して、自動保存の問題が解決されるかどうかを確認します。 2. 小紅書バージョンを更新して、小紅書が正しく動作することを確認します。

コンピューターがドライバーを読み込めない場合、デバイスが正しく動作しないか、コンピューターと正しく対話できない可能性があることは誰もが知っています。では、このデバイスにドライバーをロードできないことを示すプロンプト ボックスがコンピューターに表示された場合、問題を解決するにはどうすればよいでしょうか?以下のエディタでは、問題を簡単に解決する 2 つの方法を説明します。このデバイスにドライバーをロードできません 解決策 1. スタート メニューで「カーネル分離」を検索します。 2. メモリの整合性をオフにします。上記のメッセージには、「メモリの整合性がオフになっています。デバイスは脆弱である可能性があります。」というメッセージが表示されます。戻るボタンをクリックして無視してください。使用には影響しません。 3. マシンを再起動すると、問題が解決することがあります。

Apple の携帯電話で音が小さい問題はさまざまな理由で発生する可能性があり、音量設定の調整、サイレント モードの確認、スピーカーとイヤホンの接続を解除、電話の再起動、ヘッドフォン ジャックの確認などによって問題の解決を試みることができます。 Apple 携帯電話の音が小さい問題を解決する方法 1. 音量設定を調整する まず、携帯電話の音量設定が正しいことを確認します。音量ボタン (通常は電話機の側面にあります) を押すと、音量を上げることができます。また、設定の「サウンドとハプティクス」または「サウンドとハプティックフィードバック」で音量を調整することもできます。 2. サイレント モードをチェックして、電話機がサイレント モードになっていないことを確認します。側面の音量ボタンの横にミュート スイッチがあります。ミュートスイッチをオンにすると音は消えます。 3. スピーカーと受話口を掃除する スピーカーや受話器にホコリが付着している場合があります。

WordPress は非常に人気のあるオープンソースのコンテンツ管理システムであり、多くの個人ユーザーや企業が独自の Web サイトを構築および管理するために WordPress を使用することを選択しています。ただし、WordPress のインストール中に、データベース接続エラーやファイル権限の問題など、いくつかの問題が発生することがあります。この記事では、WordPress のインストールに関する一般的な問題を解決するためのガイドを提供し、特定のコード例を通じてユーザーが問題を迅速に解決できるように支援します。問題 1: WordPress インストール時のデータベース接続エラー

タイトル: 中国語データを Oracle にインポートする際の文字化けの問題を解決する方法とコード例。中国語データを Oracle データベースにインポートすると、文字化けが頻繁に発生します。これは、データベースの文字セット設定が間違っているか、インポート中のエンコード変換の問題が原因である可能性があります。プロセス。 。この問題を解決するには、インポートされた中国語データが正しく表示されるようにするためのいくつかの方法を講じることができます。以下に、いくつかの解決策と具体的なコード例を示します。 1. データベースの文字セット設定を確認します。 Oracle データベースでは、文字セット設定は次のとおりです。

WordPress バックエンドのコードの文字化けが心配ですか?これらの解決策を試してください。具体的なコード例が必要です。Web サイト構築で WordPress が広く使用されるようになったことで、多くのユーザーが WordPress バックエンドでコードが文字化けする問題に遭遇する可能性があります。このような問題が発生すると、バックグラウンドの管理インターフェースが文字化けして表示され、ユーザーに多大な迷惑をかけてしまいます。この記事では、WordPress バックエンドでの文字化けのトラブルを解決するための一般的な解決策をいくつか紹介します。 wp-config.php ファイルを変更し、wp-config を開きます。
