hadoop 初体验

0,HDFS -> 分布式文件系统 -> 数据存储

    MapReduce -> 分布式计算环境 -> 计算编程


1,刚开始,除了 hadoop fs 的一套命令之外,可能哈需要知道 hadoop job -list/-kill 这两个命令,看看你的程序对槽的使用情况,以及必要的时候杀死你的job.


2,hadoop jar *streaming* -....这个命令的参数有不少,如果是多个组、团队在同一个hadoop集群上使用,那么你可能需要注意 -jobconf mapred.job.queue.name 这个参数的设置,如果对于不同的组、团队,集群的管理有划分的话。当然,如果是一个人自己折腾着玩,应该不需要关心这里了。该开始写MapReduce的时候,因为不知道这里的参数需要被设置,结果自己没少瞎折腾,map一直卡在0%,真是让初学者觉得很蛋疼。

当然,-D 这样的genericCommand参数,其位置是要先于-file这样的commandOptions的。


3,hadoop streaming 会对存储在HDFS上的文件进行处理,处理的过程中会产生一个临时的工作目录,job结束后,清楚临时目录,结果也被存储在HDFS上。所以,如果除了待处理的存在HDFS上的文件外,你所需要的一些文件都应该用-file命令上传。这些文件包括你的map脚本/程序,reduce脚本/程序,你在map、reduce脚本中引用的所有非标准库文件,包括普通的文本文件,自己编写的其他脚本/程序文件,可能的第三方库文件。


4,一个常规的线下测试,可能是这样的:

    cat input_file | ./mapper.py | sort | ./reducer.py > output_file

    你应该注意到了,这里写的是./mapper.py以及./reducer.py,所以你的脚本最好具有可执行属性。并且脚本的第一行应该写明所使用的脚本解释器,默认是#!/bin/bash,所以如果是.py文件的话,最好是#!/usr/bin/python2.x (或者3.x)。

    并且这里也说明了map和reduce程序是以标准输入输出作为输入输出的,所以应该养成良好的本地测试习惯。

    

5,如果在常规线下测试中出错了,或者说脚本/程序跑的慢的令人发指,那么你应该注意你的程序的健壮性了,当然也包括调整你的程序,利用合理的数据结构和逻辑处理流程让它变得快一些。

程序的健壮性很重要!当你的程序遇到了:从标准输入读到EOF,标准输入异常,写标准输出异常,写标准错误异常,pipe broken异常时应主动退出。

使用python的话,养成使用try/except的习惯还是挺好的。

之前自学的时候使用的是python2.7,现在在公司用2.6,我没有具体查证过差异,但感觉用2.6的时候,有时候except Exception, e: print e的话,很少打印出错误类型,但又懒于把ValueError, keyError之类的挨个打一遍,所以就用了print e, e.__class__,感觉还算好用。


6,上面所说的合理的数据结构和逻辑处理流程,其实也是体现编程习惯的一方面。之前有一次,实在是因为有些烦躁了,也不愿意动脑了,所以程序写的有些糙了,写出了三层循环(第一层是for line in sys.stdin),其结果就是程序在内存方面出了问题。向hadoop提交后,卡在 Map 100% Reduce 100% 然后就没有反应了,只能kill掉。

说到这里,也说一些后来发现的小技巧,当然如果你真的进行了很好的思考,也许也用不到社么小技巧,合理的数据结构和处理布局足以应付了:

    6.1 目前只用过两层字典,例如{main_key : {secondary_key : count}},有时候觉得不够使了,想用三层,但不知道合不合理,没敢用,所以干脆在第一层字典的key上做了点手脚,利用字符串拼接,将一层字典的key和第二层字典的key拼接在一起,当做第一层字典的使用,当第二层字典的key可以当做哑元时,可以这样用。在最后输出数据的时候,只要split就可以取回两个key。

    6.2 hashlib的作用,我没有查证过具体原因,但确实多次出现过对字典的key进行hashlib.md5(..).hexdigest()处理后,程序的执行速度变快了。如果各位看官对hashlib这个库没怎么用过,不妨一试。有经验的看官也不妨指点在下一二。

    6.3 字典中设置特殊键值。有时候你可能不仅要记录{key : count}这样的数据,也可能需要记录例如有多少key,这些key有多少组合等问题。这个时候,与其在利用别的地方的资源来存储或处理,不如直接设置一个特殊的键,例如current_dict['num_keys']来统计当前有多少个key,current_dict['key_combine']来统计当前key的组合等等。一边对{key : count}做统计记录,一边处理一些其他记录,会比你之后在做这些处理容易得多。

    6.4 当然有时候,也会有捉襟见肘,感觉不够用的情况,别吝啬,在开一个字典吧。

以上,就是刚开始学习hadoop时的一些觉得值得说的体会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值