您的位置:首页 > 其它

如何在Amazon Elastic MapReduce(EMR)上运行MapReduce程序

2011-12-09 04:22 190 查看
这个问题其实是挺简单的,但是网上真的很不好找教程,尤其对于一些细节,就没人说过。估计大家可能也会一次次试验,我试了好多次终于成功,权当初学者一点帮助吧。

第一步自然是去Amazon注册账号。这里给的是EC2的地址,不过一样。 http://aws.amazon.com/ec2/ 现在Amazon提供了很多不同种类的云服务,存储的有S3,就和DropBox一个原理,不过没那么方便易用,主要用途还是在于作为其他计算服务的输入输出数据仓库一样;数据库有SimpleDB,是非关系型的数据库,貌似是BigTable类似结构的,还有关系型数据库,不过不免费。大部分服务都是有免费时间或存储容量的,EMR就没有,虽然很便宜,但是跑EMR必须要用到EC2,虽然用EC2跑其他一些东西是免费的,但用EC2跑EMR则不是免费的,所以跑一次价格大致是0.085*2(EC2)加 0.015*2(EMR),0.2美元。我每次都是跑至少两个机子的,一个是Master,必须有一个;另外一个是Core
Instance,我也选了一个。

第二步就是在S3创建Bucket。Bucket相当你个人的一个文件夹,在所有S3bucket名字中必须是唯一的。

第三步,测试程序。建议各位先在本地的机子上把你的Hadoop文件打包成可执行Jar,跑一遍MapReduce后再准备修改。如果这一步都成功不了那在EMR上几乎肯定会失败的。命令格式 [hadoop -jar jar文件路径 参数]。EMR好像只支持0.18和0.20的Hadoop,编译记得用正确的Hadoop库版本。

第四步,上传输入输出文件,创建文件夹。在你之前创建的Bucket里面新建两个文件夹,一个是输入文件夹,一个是输出文件夹。这里的规则和本地是完全一样的,输入文件夹里面的所有文件都会被搬到HDFS里面作为输入,输出文件夹也必须是空的(这点教训惨重啊)。

第四步,修改程序。很简单,只有几步。把你程序原本的输入文件夹路径和输出文件夹路径都修改成S3里面的路径。格式为s3://bucket名称/文件夹名称/ 。你可以通过http方式访问文件的路径是http://数据中心名称/bucket名称/文件夹/文件名,只要拿来中间两部分再加上s3://作为前缀就好了。还有一点非常重要,如果你在程序中有对于其他文件的读取操作,比如

FileSystem fs = FileSystem.get( new Configuration());

FSDataInputStream fsi = fs.open(xxx);

之类的,记得要把 FileSystem.get( new Configuration()); 全都改成 FileSystem.get( URI.create("s3://bucket名称"), new Configuration()); ,否则会出错。

第五步,上传程序。把Jar打包,上传到S3里面,然后记下这个文件的s3路径。接下来去Elastic MapReduce,选create new jobflow, 填入这个文件的地址。程序里面我没用参数,所以第一个参数就是主类的名字。然后选择机器数量,core instance group里面选了1,没试过0.....然后选择enable debug,定义文件夹地址,再选择run.!

OK,接下来就是缓慢的等待了。等到调度到程序开始运行一般需要3-10分钟左右。不过不要对Amazon有太大期望,每一台“机器”不过是一个虚拟机进程罢了,性能一般。我的笔记本i5-2410(双核四线程)跑一个程序用20分钟,相同的程序在Amazon里面用了1个master和5个core机器,竟然用了40分钟!

就是这样了,希望没什么遗漏……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: