一 : 空城吟:空城吟-空城吟简介,空城吟-空城吟成员
空城吟,原创音乐团队,于2011年6月20日初步建立,简称空城,是以网络为平台的汇聚五湖四海喜欢音乐的朋友们的团队。团队非商业,内设词、曲、声、宣、策划、后期技术部六部,以古风、中国风为主,其余风格亦愿兼顾。
空城原唱_空城吟 -空城吟简单介绍
(www.61k.com]品浮生醉意,叹人世踟蹰,回忆成空,追念成城,空城吟,似是旧人来。
空城空城,似是旧人。
长期欢迎有志之士加入我们共同努力。
空城原唱_空城吟 -空城吟成员
空城吟正式成员如下(部分成员身兼数职,此处只列归属部,排名不分先后)——
=词部=
夏染鳕玥
清天歌
霁霏
月舞韶华
=曲部=
小七
天南
凌阁十三
心梦琴韵
秘密电台
ankins
尚音文化
=声部=
J、H
桜
霖竺
钊(商人)
霜穗(篦曜)
钦云
杳杳
夏七
寒烟
=策划=
慕容凌溪
小爷(末念)
慕玥晴
=后期(音频、视频)=
滚滚圆
豆沙包
=宣传(美宣、文宣)=
粢饭团
折扇
恋雪
衔紫之护
总团:夏染鳕玥
声部部长:J、H
词部部长:夏染鳕玥
(更新至2012年4月)
空城原唱_空城吟 -空城吟作品
广播剧·浮生未歇剧本:爪子々
编辑:夏染鳕玥
秦敛:几度清明(闲潭落花)【友情出演】
淼儿:爪子々
翻唱:J、H
翻唱曲目:桜色舞うころ
词:恨醉(墨)
美工:湖蓝(饱和)
结尾笛奏:白白
文案:
######################第一幕####################
【萧淼儿】这是为什么呢?画来画去,这牡丹总感觉少了什么。
【萧淼儿】有些不解地说道:“咦,是笛声?”
【萧淼儿】微微地问:“是你的笛声?”
【秦潋】 “恩,是我。”
【萧淼儿】:“你,是谁?天这么黑了,怎么会1个人在此吹笛?”
【秦潋】:“打扰到姑娘了。我叫秦潋,出外游玩,为了这里的夕颜而来,你呢?”
【萧淼儿】继续问道:“你叫什么名字,在这里做什么呢?”
【萧淼儿】:我?我叫萧淼儿,住在这里的木屋,爹爹住在城里。我执拗要来这里的——为了,牡丹而来。”
时光仿若定格在此刻,2个少年从各自的世界踏山涉水而来,一者为夕颜,一者为牡丹,仿佛注定了要在尘世中与对方相遇。
######################第二幕####################
【秦潋】终于忍不住好奇问:“喂,又在想你的牡丹?”
【萧淼儿】回过神来,眼中透着掩不住的失望,无不失落地说道:“为什么,总是,找不到想要的牡丹呢?”
【秦潋】:“跟我来,淼儿。”
【萧淼儿】边跑边急促地问:“去哪里啊?,去哪里啊秦潋”
【秦潋】:“你去了就知道了。”扬了扬嘴角,语气中暗藏着神秘。
【秦潋】:“到了。”秦潋说。
【秦潋】用长笛指向一边“淼儿,你看!”
【萧淼儿】抬头,倏地呆住——是牡丹!
【萧淼儿】走进牡丹丛中,快乐得手舞足蹈起来,无数的蝴蝶环绕着她,她的笑声如铃:“好漂亮啊。”(笑声飘荡)
【萧淼儿】转身对秦潋笑着:“在这里我一定能找到的,对吧,秦潋?”
【秦潋】赞同地一笑:“恩。”
【萧淼儿】:好多蝴蝶,哎,你看那边那只蝴蝶,好漂亮!”
######################第三幕####################
【萧淼儿】:“呵,回头我要把它们全部画下来。”
【秦潋】低头望着眼前成片的牡丹苦笑道:“全画下来?”
【萧淼儿】重重地点头:“恩,一定会!”
【萧淼儿】起身,拍了拍身上的尘土,有些俏皮地说:“秦潋,等我画完了,第1个给你看。”【秦潋】“我~我一定会第1个看的”
【秦潋】,叫住她:“淼儿。”
【萧淼儿】转过头看他,好奇地说:“恩?”
【秦潋】:“淼儿,你知道我的夕颜是什么吗?”(语气稍慢)
【萧淼儿】眨了眨眼睛,没有多想便回答:“夕颜?夕颜不就是夕颜花吗?
【秦潋】却似乎不再执着于此,一笑而过,不置可否:“呵呵……”
######################第四幕####################
萧淼儿从如同昨日一样开满牡丹花的梦中醒来,擦着额上的虚汗,四周静悄悄,听不到
些许往日熟悉的笛声,仿佛预感到了什么不好的事情般,十分慌张地要找秦潋:
【萧淼儿】“秦潋?秦潋!你在哪儿啊?秦潋!”
【萧淼儿】的手按在桌子边缘上,另一只握着信的手不住有些颤抖:这……
【秦潋独白】:
{淼儿,第一次见到你,从竹林里钻出来的你是那么的狼狈,我忍不住的就笑了,当你问我来意之际,我真的不知道该怎么回答你,你的眼神是那么的清澈,我不忍心欺骗你,所以我回答了你,为了夕颜而来,淼儿,你知道么,夕颜花代表了复仇,我没有骗你 我为了复仇而来 ,我从小生活在1个收留我的叔父那里,他教我功夫,教我书法,教我吹笛。后来他死了,死前对我说,要我为他杀1个人,那个人就是现在的天子,我一定会完成他的期愿。这次,我得到消息说,他会带人马来这滁州附近狩猎,我便来到了这里,遇见了你,淼儿。 对不起,如果,我还活着我一定会回来,回来找你,相信我好么?
如果我还活着……}
【萧淼儿】“秦潋!秦潋!你在哪儿啊,秦潋!别让我找不到你,好吗?!”
######################第五幕####################
时过境迁,已是数年:
竹林溪边
曹孟德·曹操主题
作曲/编曲:续薪小墨
作词/文案:夏染鳕玥
演唱:小麦
美工:粢饭团
【文案】
以梦之名——曹孟德
曹操,生于155年,卒于220年。
我和你,只是一次擦肩而过,却不料已是隔了一千八百年。
【歌词】
魏武挥鞭 铜雀遗篇
突然忘却 沉吟沦陷
官渡点将 才冠九天
笑煮淡酒 绝逸人间
十年征伐 是真是幻
留下了哪些 追忆联翩
我手中这剑 交与谁系佩?
一生风流无懈 可有人敛?
赤壁折戟 乌桓梦断
铁甲湮灭 鸿雁去远
日月飞驰 流转若电
老龟虽寿 终埋花间
可曾幻想 梦回洛阳?
我愿意化作 尘土飞扬
譬如放歌青崖 或是斜阳纵马
俯看一十三州 皆乃我乡
乱世纷繁 白衣丞相
文治武功 举世无双
感时溅泪 无限惆怅
纵然隔了千年 难把君忘
————End————
=========================================================================
祭酒君·郭嘉主题
原曲:《かごめ》
填词:月舞韶华
演唱:桜
后期:滚滚圆
【歌词】
黄沙漠漠 雁孤泣
冰雪英姿 如沙逝
此生遗计开到荼蘼
谁怜青史 仅一笔
乱世 刍狗随流离
白骨炼狱只似儿戏
寒眸 看透战时事
低语呢喃也莫如醉去
江山不过是局 拂袖执棋
苍生终究蝼蚁 谁与博弈
可叹天生鬼才 颍州星聚
将军点灯犹论今昔
江山不过是局 七语玄机
苍生终究蝼蚁 算不透生死
只叹天妒鬼才 柳城悲寂
谁点灯暗火却独熄
(music)
黄沙漠漠 雁孤泣
冰雪英姿 如沙逝
此生遗计 开到荼蘼
谁怜青史 仅一笔
百年 往事堪回忆
衰草寒蝉伴青冢戚
千秋 不复君容仪
弹指蹉跎何处觅君迹
(music)
犹忆少年青衣 放荡不羁
时逢明君相惜 策马又同席
连天烽火放肆 奇谋无滞
轻拂拭染红的锦衣
一世昙花歌罢 未酬壮志
为何命中劫数 君颜陌路于赤壁
当初傲骨依稀 轻狂意气
终究不过纸上墨迹
哀哉痛哉杯酒为君祭
————End————
=========================================================================
班定远·班超主题
原曲:森英治《百鬼夜行抄》
填词:霁霏
后期:夏染鳕玥
演唱:寒烟
【歌词】
风西来
雾推开
两千载尘埃
班家定远日边来
都护府
黄沙漫
西域路行宽
三十六骑使塞外
意风发
代司马
立名蒲类海
投笔从戎自此开
合卷去
使鄯善
酒酣死生裁
虎穴夜火匈奴败
君可知壮士志?
封侯当万里外
书生意气不再
汉天下
无敢犯
守
疆场喝破敌胆
诸国归附止战
臣于阗
平疏勒
吾在
世何难?
奉旨还
自刎挽
马头毅然转
返身入阵愿未满
三十载
家未返
扬名远瀚海
无人不识汉使班
此生愿
从未变
男儿功勋戴
孝忠义仁无亏减
风中诵
班超传
荣光耀两汉
落叶他乡可曾哀?
魂归来
——End——
=========================================================================
叔夜琴·嵇康主题
原曲:《回忆的沙漏》
填词:清天歌
演唱:夏七
后期:夏染鳕玥
【歌词】
紫檀成瑶琴,参差玉 渐生烟
长衫漆纹,微风轻拂五弦
复叠复攒仄,成绝响 动紫鸢
目远归鸿,自醉俯仰游心于太玄。
阮啸曾相伴,阮咸曾相和
刻商转羽,郢人歌
游兴于高原,垂钓乎一壑
浮云惹奇霞,圃外摇曳 竹影横斜(xia)
喜煅灶尚暖,青石尤凉,流莺戏蒹葭。
薄暮引归燕,观金溶 映长空无瑕
好乐道闲居,养神气晏如,采仙茗、品芳茶
素琴张《长清》,薄暮动,星如雨
长短双弄,伴浊醪,香满狱
慢抹慢拂慢迭奏,轻挑轻绰轻进复
纷纶翕响,怅惘一生潇洒化风舞
任此心自然,薄周孔汤武
千秋浩然一纸书
广陵散止,洁质映珊瑚
晓雾映奇霞,圃外摇曳 竹影横斜
渐秋日萧萦,修夜不晹,芜院生蒹葭。
薄暮引归燕,悲金溶 映长空无瑕
嗟风景仍是,叹年华不再,愁仙茗、愁芳茶
乍听鸣笛慷慨,停车驾徘徊,妙声绝难寻。悲夫将迈
麦秀殷墟 写心难援翰。
晓雾映奇霞,圃外摇曳 竹影横斜。
渐秋日萧萦,修夜不晹,芜院生蒹葭。
粉云退 归燕,三径荒,暗柳渐藏鸦。
嗟风景仍是,年华不再,丘陇平,唯黄沙。
—————————End—————————
=========================================================================
倾世一笑·褒姒主题
原曲:《情书》
填词:黄湛夕
文案:夏染鳕月
文案/策划/古筝独奏/笛子独奏/后期混缩:夏染鳕玥
念白:商人
海报:粢饭团
=========================================================================
风雪初晴 记古剑奇谭--百里屠苏
原曲:《泉水》
词:夏染鳕玥
唱:殇·魂
CV:韩云溪/楚蝉-爪子々、百里屠苏-无戒、陵越-白白、芙蕖-戚虞、风晴雪-末末
酱油后期:爪子々
海报:饱和
韩云溪(百里屠苏):我娘是我娘,我是我,我有名字的,不叫“休宁大人的儿子”! CV:爪子々【空城吟】
楚蝉:云溪哥哥,云溪哥哥,等等我!
乌蒙灵谷 听雨飘落 旧事已尘封
翻云山寨 仗剑凌杀 人时不堪凭
追雾灵溪涧 日影飞去 多舛的宿命
怅惘琴川 风雪后天初晴
百里屠苏:2个愿望,分晴雪1个。
龙渊之水 太古之火 淬炼出焚寂
铁柱观内 刀光血影 劫焰除妖帝
她一路相随 默然无语 生死皆不离
半盏浮灯 抹不去的回忆
陵越:我这不肖师弟,素来被视为离经叛道、行止逆乱,今次听师兄一回又如何?
寒阶孤星邀天 对月无眠 何解一字缘
空山斜阳正远 去留自闲 何物君留恋
数倦星辰倾杯 魂游众巅 逝去了荒年
若不是 前生难寻 知己难求 踪似流水痕似飞羽燕
御剑驰骋
芙蕖:屠苏师兄,师妹好不容易才找到你,跟我回山上去好不好?
幻世凛冽 腾翔青龙 勾起往昔梦
江城细影 倒映颜容 恩怨尽乘风
望昆仑天墉 韶华偏移 永恒的错过
拈花飘零 时光一泻万里
风晴雪:苏苏,我不会丢下你走的。
百里屠苏:我的魂魄快要散了,化作荒魂之后,望能在你身边多留一会儿,哪怕只是片刻也好。
寒阶孤星邀天 对月无眠 何解一字缘
空山斜阳正远 去留自闲 何物君留恋
数倦星辰倾杯 魂游众巅 逝去了荒年
若不是 前生难寻 知己难求 踪似流水痕似飞羽燕
御剑驰骋
蓬莱醉歌遨游 东海奔流 立剑问情愁
青玉坛下筹谋 相濡以沫 不顾世情薄
断鸿声外晓霜 朝霞遍布 苍茫误此生
又怎妨 探月沐辉奕剑轮回
花开花落共把沧桑俯
同归江湖
风晴雪:对生死毫无执念的人,只是因为还没有经历过真正绝望的别离…我连他的转世也无法寻找,因为——他根本入不了轮回。这一世死去,我也将化为荒魂,可是——永远、永远不会后悔,像他一定也不曾后悔。
———————————————————————End———————————————————————
=========================================================================
一将功成
原曲:樱花樱花
词:末念【空城吟】
唱:杳杳 【空城吟】
千山雪 一蓑烟岚浓
陪晚照对晴空
万径 人无踪 逝风
冰天封 江川河溪冻
两鬓霜 背如弓
独钓寒江雪 孤翁
念白:江浩浩,日融融。
佩剑弯弓,半溪流水绿。千树落花红。
颜巷陋阮途穷 平生志 言我疯
左持蟹 右执杯毕卓心 与吾同
乱世起 烽烟弥 火未熄 人未寂
弃蓑衣 钓竿遗 天下谁人敌
念白:男儿自当志争天下,剑挑八方,九州傲立。怎可龟缩山隅!
虑萦心 懒抚琴 七弦绮 非吾意
纵神仙 有伴侣 素志一片心
挽长戈 踏铁蹄 交羽檄 鼓动地
书生意气 挥斥方遒 欲将干戈戢
寥廓 问苍茫大地 主沉浮谁第一
骑马渡长堤 破夷
星拱北 立马剑指西 贪狼破七杀意
宫门天床闭 璇玑
念白:为了明哲保身,文韬武略满腹才华的青年扮成1个不问政事、
不爱权势的山间野人。
恨对野山鸡,恨对涧与溪
沙场腾战气 看吾挥师向披靡
鹤长唳 待无衣锦归故里
会有娇妻 玉钗髻 雪肤花貌云堕地
怎料 一朝罢还朝 青梅消竹马绕
青灯 古佛庙 已了
水云遥 烛灭冷香消 关河隔雨潇潇
春泛杨桥 令我徒寂寥
念白:谁知,功成名就,她却不在身旁了。
纵坐拥江山如画,无她共享,又有何趣?
—————————End—————————
=========================================================================
七夜雪落
原曲:镇命歌
词:小爷(末念)
唱:寒烟
混音/海报:夏染鳕玥
【歌词】
似水无涯落天地如飞花
千错万差注定命运无华
=========================================================================
念·花月满楼
原曲:百恋歌
填词:潮岚
-----------------------
翻唱:天策:桜,万花:篦曜 七秀:杳杳
策划:桜
后期: 小七
美工:慕容凌溪
天策:
走北邙 忠魂独守雁门执缨枪
过玉关 少年怒马衣鲜染血霜
剑眉敛 雕弓挽 白帝城外骖龙翔
望帝乡 西风孤垒曷荒凉
万花:
晓仁术 精岐黄 悬壶济世天下康
拾珠尘杏林春满带青囊
六合曲 花旋复 妙手仁心坐芝堂
觅星芒 王不留行上池橘井香
七秀:
倚栏杆 掩红窗 菱花镜前试梅妆
张紫皇 为君弦动绿绮翻飞徵羽商
远山浅 画眉长 浣裙晚归坐思量
愿与君 执手共相将
念白:
天策:
天地不仁,以万物为刍狗。
待我学艺有成,投之天策府李将军麾下,
破阵杀敌,救百姓于水火,拯万民于倒悬!
万花:
破阵杀敌,不免又是一番生灵涂炭。
不若以我万花谷之医术,
妙手回春,悬壶济世,方能拯救苍生。
阿秀,你说呢?
万花:
雾空濛 月转廊 东风袅袅泛崇光
一曲响 胡旋水袖舞动 惊四方
盏茶香 杯酒欢 燃尽银灯水沉香
夜未央 几载少年意气曾轻狂
天策:
金戈起 旌旗扬 折剑残残尽锋芒
战渔阳 怒跨青葱多少英雄醉沙场
倒金荷 洗残阳 十年纵横白鬓妆
羽林郎 青丝覆雪霜
七秀:(笑)我只愿得一同心人,
举案齐眉,执手偕老,此生足矣。
七秀:
旧诗行 宣纸黄 轻抚琴弦低声唱
前世帐 为君落笔成痴赏罢明月光
雁字长 夜来霜 卧听南宫清漏长
胭脂烫结缘万年长
合:
梧叶黄 满汀州 曾记相逢若耶上
少年游 而今空叹碧云望断满惆怅
二 : MapReduce 计数器简介
1、计数器简介
在许多情况下,一个用户需要了解待分析的数据,尽管这并非所要执行的分析任务 的核心内容。(www.61k.com]以统计数据集中无效记录数目的任务为例,如果发现无效记录的比例 相当高,那么就需要认真思考为何存在如此多无效记录。是所采用的检测程序存在 缺陷,还是数据集质量确实很低,包含大量无效记录?如果确定是数据集的质量问 题,则可能需要扩大数据集的规模,以增大有效记录的比例,从而进行有意义的 分析。2、内置计数器
Hadoop为每个作业维护若干内置计数器, 以描述该作业的各项指标。例如,某些计数器记录已处理的字节数和记录数,使用户可监控已处理的输入数据量和已产生的输出数据量,并以此对 job 做适当的优化。
14/06/08 15:13:35 INFO mapreduce.Job: Counters: 46File System CountersFILE: Number of bytes read=159FILE: Number of bytes written=159447FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=198HDFS: Number of bytes written=35HDFS: Number of read operations=6HDFS: Number of large read operations=0HDFS: Number of write operations=2Job Counters Launched map tasks=1Launched reduce tasks=1Rack-local map tasks=1Total time spent by all maps in occupied slots (ms)=3896Total time spent by all reduces in occupied slots (ms)=9006Map-Reduce FrameworkMap input records=3Map output records=12Map output bytes=129Map output materialized bytes=159Input split bytes=117Combine input records=0Combine output records=0Reduce input groups=4Reduce shuffle bytes=159Reduce input records=12Reduce output records=4Spilled Records=24Shuffled Maps =1Failed Shuffles=0Merged Map outputs=1GC time elapsed (ms)=13CPU time spent (ms)=3830Physical memory (bytes) snapshot=537718784Virtual memory (bytes) snapshot=7365263360Total committed heap usage (bytes)=2022309888Shuffle ErrorsBAD_ID=0CONNECTION=0IO_ERROR=0WRONG_LENGTH=0WRONG_MAP=0WRONG_REDUCE=0File Input Format Counters Bytes Read=81File Output Format Counters Bytes Written=35计数器由其关联任务维护,并定期传到tasktracker,再由tasktracker传给 jobtracker.因此,计数器能够被全局地聚集。详见第 hadoop 权威指南第170页的“进度和状态的更新”小节。与其他计数器(包括用户定义的计数器)不同,内置的作业计数器实际上 由jobtracker维护,不必在整个网络中发送。
3、用户定义的Java计数器
MapReduce允许用户编写程序来定义计数器,计数器的值可在mapper或reducer 中增加。多个计数器由一个Java枚举(enum)类型来定义,以便对计数器分组。一 个作业可以定义的枚举类型数量不限,各个枚举类型所包含的字段数量也不限。枚 举类型的名称即为组的名称,枚举类型的字段就是计数器名称。计数器是全局的。 换言之,MapReduce框架将跨所有map和reduce聚集这些计数器,并在作业结束 时产生一个最终结果。Note1:需要说明的是,不同的 hadoop 版本定义的方式会有些许差异。
(1)在0.20.x版本中使用counter很简单,直接定义即可,如无此counter,hadoop会自动添加此counter.
Counter ct = context.getCounter("INPUT_WORDS", "count");
ct.increment(1);
(2)在0.19.x版本中,需要定义enum
enum MyCounter {INPUT_WORDS };
reporter.incrCounter(MyCounter.INPUT_WORDS, 1);
RunningJob job = JobClient.runJob(conf);
Counters c = job.getCounters();
long cnt = c.getCounter(MyCounter.INPUT_WORDS);
Notice2:使用计数器需要清楚的是它们都存储在jobTracker的内存里。Mapper/Reducer 任务序列化它们,连同更新状态被发送。为了运行正常且jobTracker不会出问题,计数器的数量应该在10-100个,计数器不仅仅只用来聚合MapReduce job的统计值。新版本的hadoop限制了计数器的数量,以防给jobTracker带来损害。你最不想看到的事情就是由于定义上百个计数器而使jobTracker宕机。
下面咱们来看一个计数器的实例(以下代码请运行在 0.20.1 版本以上):
3.1 测试数据:
hello world 2013 mapreducehello world 2013 mapreducehello world 2013 mapreduce
3.2 代码:
/** * Project Name:CDHJobs * File Name:MapredCounter.java * Package Name:tmp * Date:2014-6-8下午2:12:48 * Copyright (c) 2014, decli#qq.com All Rights Reserved. * */package tmp;import java.io.IOException;import java.util.StringTokenizer;import org.apache.commons.lang3.StringUtils;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Counter;import org.apache.hadoop.mapreduce.CounterGroup;import org.apache.hadoop.mapreduce.Counters;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCountWithCounter {static enum WordsNature {STARTS_WITH_DIGIT, STARTS_WITH_LETTER, ALL}/** * The map class of WordCount. */public static class TokenCounterMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}/** * The reducer class of WordCount */public static class TokenCounterReducer extends Reducer<Text, IntWritable, Text, IntWritable> {public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,InterruptedException {int sum = 0;String token = key.toString();if (StringUtils.isNumeric(token)) {context.getCounter(WordsNature.STARTS_WITH_DIGIT).increment(1);} else if (StringUtils.isAlpha(token)) {context.getCounter(WordsNature.STARTS_WITH_LETTER).increment(1);}context.getCounter(WordsNature.ALL).increment(1);for (IntWritable value : values) {sum += value.get();}context.write(key, new IntWritable(sum));}}/** * The main entry point. */public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = new Job(conf, "WordCountWithCounter");job.setJarByClass(WordCountWithCounter.class);job.setMapperClass(TokenCounterMapper.class);job.setReducerClass(TokenCounterReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path("/tmp/dsap/rawdata/june/a.txt"));FileOutputFormat.setOutputPath(job, new Path("/tmp/dsap/rawdata/june/a_result"));int exitCode = job.waitForCompletion(true) ? 0 : 1;Counters counters = job.getCounters();Counter c1 = counters.findCounter(WordsNature.STARTS_WITH_DIGIT);System.out.println("-------------->>>>: " + c1.getDisplayName() + ": " + c1.getValue());// The below example shows how to get built-in counter groups that Hadoop provides basically.for (CounterGroup group : counters) {System.out.println("==========================================================");System.out.println("* Counter Group: " + group.getDisplayName() + " (" + group.getName() + ")");System.out.println(" number of counters in this group: " + group.size());for (Counter counter : group) {System.out.println(" ++++ " + counter.getDisplayName() + ": " + counter.getName() + ": "+ counter.getValue());}}System.exit(exitCode);}}
3.3 结果与计数器详解
运行结果下面会一并给出。Counter有"组group"的概念,用于表示逻辑上相同范围的所有数值。MapReduce job提供的默认Counter分为7个组,下面逐一介绍。这里也拿上面的测试数据来做详细比对,我将会针对具体的计数器,挑选一些主要的简述一下。
... 前面省略 job 运行信息 xx 字 ...ALL=4STARTS_WITH_DIGIT=1STARTS_WITH_LETTER=3-------------->>>>: STARTS_WITH_DIGIT: 1==========================================================#MapReduce job执行所依赖的数据来自于不同的文件系统,这个group表示job与文件系统交互的读写统计 * Counter Group: File System Counters (org.apache.hadoop.mapreduce.FileSystemCounter) number of counters in this group: 10 #job读取本地文件系统的文件字节数。假定我们当前map的输入数据都来自于HDFS,那么在map阶段,这个数据应该是0。但reduce在执行前,它 的输入数据是经过shuffle的merge后存储在reduce端本地磁盘中,所以这个数据就是所有reduce的总输入字节数。 ++++ FILE: Number of bytes read: FILE_BYTES_READ: 159 #map的中间结果都会spill到本地磁盘中,在map执行完后,形成最终的spill文件。所以map端这里的数据就表示map task往本地磁盘中总共写了多少字节。与map端相对应的是,reduce端在shuffle时,会不断地拉取map端的中间结果,然后做merge并 不断spill到自己的本地磁盘中。最终形成一个单独文件,这个文件就是reduce的输入文件。 ++++ FILE: Number of bytes written: FILE_BYTES_WRITTEN: 159447 ++++ FILE: Number of read operations: FILE_READ_OPS: 0 ++++ FILE: Number of large read operations: FILE_LARGE_READ_OPS: 0 ++++ FILE: Number of write operations: FILE_WRITE_OPS: 0 # 整个job执行过程中,只有map端运行时,才从HDFS读取数据,这些数据不限于源文件内容,还包括所有map的split元数据。所以这个值应该比FileInputFormatCounters.BYTES_READ 要略大些。 ++++ HDFS: Number of bytes read: HDFS_BYTES_READ: 198 #Reduce的最终结果都会写入HDFS,就是一个job执行结果的总量。 ++++ HDFS: Number of bytes written: HDFS_BYTES_WRITTEN: 35 ++++ HDFS: Number of read operations: HDFS_READ_OPS: 6 ++++ HDFS: Number of large read operations: HDFS_LARGE_READ_OPS: 0 ++++ HDFS: Number of write operations: HDFS_WRITE_OPS: 2==========================================================#这个group描述与job调度相关的统计 * Counter Group: Job Counters (org.apache.hadoop.mapreduce.JobCounter) number of counters in this group: 5 #Job在被调度时,如果启动了一个data-local(源文件的幅本在执行map task的taskTracker本地) ++++ Data-local map tasks #当前job为某些map task的执行保留了slot,总共保留的时间是多少 ++++ FALLOW_SLOTS_MILLIS_MAPS/REDUCES #所有map task占用slot的总时间,包含执行时间和创建/销毁子JVM的时间 ++++ SLOTS_MILLIS_MAPS/REDUCES # 此job启动了多少个map task ++++ Launched map tasks: TOTAL_LAUNCHED_MAPS: 1 # 此job启动了多少个reduce task ++++ Launched reduce tasks: TOTAL_LAUNCHED_REDUCES: 1 ++++ Rack-local map tasks: RACK_LOCAL_MAPS: 1 ++++ Total time spent by all maps in occupied slots (ms): SLOTS_MILLIS_MAPS: 3896 ++++ Total time spent by all reduces in occupied slots (ms): SLOTS_MILLIS_REDUCES: 9006==========================================================#这个Counter group包含了相当多地job执行细节数据。这里需要有个概念认识是:一般情况下,record就表示一行数据,而相对地byte表示这行数据的大小是 多少,这里的group表示经过reduce merge后像这样的输入形式{"aaa", [5, 8, 2, …]}。 * Counter Group: Map-Reduce Framework (org.apache.hadoop.mapreduce.TaskCounter) number of counters in this group: 20 #所有map task从HDFS读取的文件总行数 ++++ Map input records: MAP_INPUT_RECORDS: 3 #map task的直接输出record是多少,就是在map方法中调用context.write的次数,也就是未经过Combine时的原生输出条数 ++++ Map output records: MAP_OUTPUT_RECORDS: 12 # Map的输出结果key/value都会被序列化到内存缓冲区中,所以这里的bytes指序列化后的最终字节之和 ++++ Map output bytes: MAP_OUTPUT_BYTES: 129 ++++ Map output materialized bytes: MAP_OUTPUT_MATERIALIZED_BYTES: 159 # #与map task 的split相关的数据都会保存于HDFS中,而在保存时元数据也相应地存储着数据是以怎样的压缩方式放入的,它的具体类型是什么,这些额外的数据是 MapReduce框架加入的,与job无关,这里记录的大小就是表示额外信息的字节大小 ++++ Input split bytes: SPLIT_RAW_BYTES: 117 #Combiner是为了减少尽量减少需要拉取和移动的数据,所以combine输入条数与map的输出条数是一致的。 ++++ Combine input records: COMBINE_INPUT_RECORDS: 0 # 经过Combiner后,相同key的数据经过压缩,在map端自己解决了很多重复数据,表示最终在map端中间文件中的所有条目数 ++++ Combine output records: COMBINE_OUTPUT_RECORDS: 0 #Reduce总共读取了多少个这样的groups ++++ Reduce input groups: REDUCE_INPUT_GROUPS: 4 #Reduce端的copy线程总共从map端抓取了多少的中间数据,表示各个map task最终的中间文件总和 ++++ Reduce shuffle bytes: REDUCE_SHUFFLE_BYTES: 159 #如果有Combiner的话,那么这里的数值就等于map端Combiner运算后的最后条数,如果没有,那么就应该等于map的输出条数 ++++ Reduce input records: REDUCE_INPUT_RECORDS: 12 #所有reduce执行后输出的总条目数 ++++ Reduce output records: REDUCE_OUTPUT_RECORDS: 4 #spill过程在map和reduce端都会发生,这里统计在总共从内存往磁盘中spill了多少条数据 ++++ Spilled Records: SPILLED_RECORDS: 24 #每个reduce几乎都得从所有map端拉取数据,每个copy线程拉取成功一个map的数据,那么增1,所以它的总数基本等于 reduce number * map number ++++ Shuffled Maps : SHUFFLED_MAPS: 1 # copy线程在抓取map端中间数据时,如果因为网络连接异常或是IO异常,所引起的shuffle错误次数 ++++ Failed Shuffles: FAILED_SHUFFLE: 0 #记录着shuffle过程中总共经历了多少次merge动作 ++++ Merged Map outputs: MERGED_MAP_OUTPUTS: 1 #通过JMX获取到执行map与reduce的子JVM总共的GC时间消耗 ++++ GC time elapsed (ms): GC_TIME_MILLIS: 13 ++++ CPU time spent (ms): CPU_MILLISECONDS: 3830 ++++ Physical memory (bytes) snapshot: PHYSICAL_MEMORY_BYTES: 537718784 ++++ Virtual memory (bytes) snapshot: VIRTUAL_MEMORY_BYTES: 7365263360 ++++ Total committed heap usage (bytes): COMMITTED_HEAP_BYTES: 2022309888==========================================================#这组内描述Shuffle过程中的各种错误情况发生次数,基本定位于Shuffle阶段copy线程抓取map端中间数据时的各种错误。* Counter Group: Shuffle Errors (Shuffle Errors) number of counters in this group: 6 #每个map都有一个ID,如attempt_201109020150_0254_m_000000_0,如果reduce的copy线程抓取过来的元数据中这个ID不是标准格式,那么此Counter增加 ++++ BAD_ID: BAD_ID: 0 #表示copy线程建立到map端的连接有误 ++++ CONNECTION: CONNECTION: 0 #Reduce的copy线程如果在抓取map端数据时出现IOException,那么这个值相应增加 ++++ IO_ERROR: IO_ERROR: 0 #map端的那个中间结果是有压缩好的有格式数据,所有它有两个length信息:源数据大小与压缩后数据大小。如果这两个length信息传输的有误(负值),那么此Counter增加 ++++ WRONG_LENGTH: WRONG_LENGTH: 0 #每个copy线程当然是有目的:为某个reduce抓取某些map的中间结果,如果当前抓取的map数据不是copy线程之前定义好的map,那么就表示把数据拉错了 ++++ WRONG_MAP: WRONG_MAP: 0 #与上面描述一致,如果抓取的数据表示它不是为此reduce而准备的,那还是拉错数据了。 ++++ WRONG_REDUCE: WRONG_REDUCE: 0==========================================================#这个group表示map task读取文件内容(总输入数据)的统计 * Counter Group: File Input Format Counters (org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter) number of counters in this group: 1# Map task的所有输入数据(字节),等于各个map task的map方法传入的所有value值字节之和。 ++++ Bytes Read: BYTES_READ: 81==========================================================##这个group表示reduce task输出文件内容(总输出数据)的统计 * Counter Group: File Output Format Counters (org.apache.hadoop.mapreduce.lib.output.FileOutputFormatCounter) number of counters in this group: 1 ++++ Bytes Written: BYTES_WRITTEN: 35==========================================================# 自定义计数器的统计* Counter Group: tmp.WordCountWithCounter$WordsNature (tmp.WordCountWithCounter$WordsNature) number of counters in this group: 3 ++++ ALL: ALL: 4 ++++ STARTS_WITH_DIGIT: STARTS_WITH_DIGIT: 1 ++++ STARTS_WITH_LETTER: STARTS_WITH_LETTER: 3
4、最后的问题:
如果想要在 MapReduce 中实现一个类似计数器的“全局变量”,可以在 map、reduce 中以任意数据类型、任意修改变量值,并在 main 函数中回调获取该怎么办呢?
5、Refer:
(1)An Example of Hadoop MapReduce Counter
http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/
(2)Hadoop Tutorial Series, Issue #3: Counters In Action
http://www.philippeadjiman.com/blog/2010/01/07/hadoop-tutorial-series-issue-3-counters-in-action/
(3)Controlling Hadoop MapReduce Job recursion
(4)MapReduce Design Patterns(chapter 2 (part 3))(四)
本文标题:空城计简介-空城吟:空城吟-空城吟简介,空城吟-空城吟成员61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1