第一个贴上XMT标签的Hadoop程序
- 距离老板留给我并行化做属性约简的任务开始到今天,已是一周有余,期间经历过各种呕心沥血,通宵达旦,终于运行出了一个结果。其中在配置过程中,浪费了爷大量的时间,有时回想自己上个周干的事情,会觉得分明的本末倒置。
一会就要开组会了,有时特么的我做报告,把几个周以来整理的RS Review又看了一遍,希望过会不要再出什么幺蛾子,小爷我真是伤不起了啊!!周五晚上只睡了不到两个钟头,关键是还没有觉得很困,果然,,人如果心里有什么事情压身的话,是寝食难安的哟!
一直觉得,磨刀不误砍柴工,所以一直在配置配置配置,希望配置出最好的Eclipse工具,以后可以简便的运行自己的Hadoop程序。人生道路上总是充满了艰辛曲折,配置了几天,重装了N次系统,终于算是配置成功,对MapReduce有了进一步了解,但是对一些Configure等还是一头雾水。
说说我的吐血过程中遇到的问题吧:
- Hadoop到底该放在哪里?
之前一直是放在/usr/local中,也就是根目录下,但是用过Linux系统的人都知道,进入根目录是需要用户权限的,把它放进去配置一下用"sudo"命令就可以解决了。但是才程序运行中如果需要访问根目录下的东西,就会有些棘手。于是有朋友跟我说,最好把hadoop放在用户目录下,这样就不会出现什么问题,自己配置时也会方便一些。于是我听从建议,将hadoop放在了~/Documents下。很easy的配置完成,兴高采烈的打开Terminal,启动hdfs时却怎么也启动不了。一是说JVM无法启动,二是说找不到相关文件,那个让人上火哟。无奈只好删掉,重新在根目录中解压配置,算是解决了这个问题。所以,到底该把Hadoop放在哪里,我认为还是放在根目录下为妙,防止自己误改,,后面在配置好Eclipse,妥妥哒~
- hadoop怎么更改键值对类型?
翻看书上和网络上WordCount或者倒排索引的例子,都是用的改写的map(Object key, Text value, Context context)这个方法,相应的最后的输出键值对则是context.write(Text, IntWritable)。那么如果我想把输出键值对更改成其他类型呢,如都是字符串该怎么弄?查了好多博文和API终于明白了,原来在map()方法集成的接口是Mapper(KeyIn, ValueIn, KeyOut, ValueOut)接口,它有四个参数,指定了输入输出键值对的类型,我们可以为它们赋值为各种map中的基本类型,如Text,IntWritable,LongWritable等等,这样,输入输出时就可以自己掌控了。
- Hadoop的输入输出格式是什么?
现在还没太搞懂FileInputFormat与TextInputFormat等的关系。大概是这样,我们用的是FileInputFormat,它默认使用的是TextInoputFormat,这种方式,一个文件生成一个Mapper。而默认的TextIF的输入格式是(key,value),key代表该文件某一行相对于开头的偏移量,value代表一行的内容,我们可以从context中获取文件名信息。一个Mapper处理一个文件,它的函数map()则只会读入并处理一行数据。不想把文件分得这么散的话可就要注意了。自己就是在如何一次处理一个文件这里犯了愁,想啊想啊想,想到了明代王重阳对着竹子格物致知的样子。。
- Mapper类中map()函数之后不能再有东西了麽?
是的。这里也是纠结了好久,该开始不知为什么,在map()函数后加入for循环等,老是提示出错,以为是eclipse又出了问题,结果多次实验证明,是map()函数后不能在有内容。map直接写入context,然后传递给reducer处理。
- 怎么调用含有静态公共变量的类中的函数?
这个问题不止是在Hadoop程序中,一般的java程序也会遇到。简单来说,就是,要保证被调用类中的全局静态变量被赋值,否则会出现空指针错误。
可以抽象出来的问题暂时就这么些了,以后有问题继续补充。。