说来惭愧,从学习到完成wordCount这个程序,差不多用了三天的时间。一方面是在学习的过程中总是遇见这样那样要处理的事情,二是自己的学习知识和解决问题的能力需要提高。我是跟着吴超老师的视频学的,但是应用的环境不一样,我是在hadoop2.4.0环境中应用的。hadoop2.x和hadoop1.x还是有许多差别的。
在遇到问题的时候我总是绕老绕去,但最终还是要面对。在以后的学习过程中一定要暗示自己遇到问题时少绕圈子,直面问题。言归正传,谈一下这几天我在学习的过程中遇到的问题吧。
1. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
在hadoop2.4.0中确实没有winutils.exe 这个文件,我就疯狂的百度,找到了一个解决方法,就是在程序中添加几行代码:
伪造出winutils.exe出这个文件,确实,错误没有了。但是真的解决了吗?(刚刚验证了一下,在其他地方都配置好的前提下,把真实存在的winutils.exe删掉,用这行代码代替,程序也是可以完成 的,那
winutils.exe的作用是什么呢?)
2. hadoop Cannot run program "cygpath": CreateProcess error=2, ?????????
这是一个搞笑的问题,为什么这么说呢?吴超老师的视频上因为出现文件权限问题,导入了一个程序包,我也跟着导入了。这是搞笑之一,因为我的程序并没有出现权限问题,那我为什么还要导入这个程序包呢,怪我墨守成规。导入之后就一直提示这个问题,然后我就百度,百度上也有一些类似的问题,给出的答案是安装一个cygwin,配置下环境,然后问题就解决了。这是搞笑之二,出现这个问题,我没有思考就直接百度,纠结了太长时间,就想找个最佳答案,网上有步骤,比如装个cygwin,我也没有试试。最后我终于安装了cygwin,配置好环境,然而问题并没有解决,网上说这些做好就成功了额。饶了这么久,我终于想起要看问题提示的代码了,问题代码的核心竟是之前导入的那个程序包中的,这还有什么好说的。我把导入的程序包删除了,果然没了这个提示,但是,又出现了新的问题。
3. java.lang.ClassCastException: org.apache.hadoop.conf.Configuration cannot be cast to org.apache.hadoop.mapred.JobConf
前面的问题算是环境问题,这个问题是代码问题,而且正是解决我这些谜团的引子。
因为在编写wordCount这个程序时有 文件输入这个过程,而且是必须的过程。老师所讲的视频中是通过这行代码实现的 FileInputFormat.setInputPaths(job, IN_PATH)。而我敲出了这样的代码FileInputFormat.setInputPaths((JobConf)conf, IN_PATH); 这两行代码看起来就只有第一个参数不一样,我就认为是hadoop2.x和hadoop1.x中源码的差别,就这样敲了下去,大错特错额。
解决这个问题,我就把 FileInputFormat.setInputPaths((JobConf)conf, IN_PATH)改成了FileInputFormat.setInputPaths(new JobConf(conf), IN_PATH);接着第四个问题出来了
4. java.io.IOException: No input paths specified in job
这明明就是文件输入的代码,为什么提示没有输入呢。这时我想到了是不是我导入的类不对,便抓紧看了视频核对一样,果然,我导入的包不对。正确的应该导入入org.apache.hadoop.mapreduce.lib.input.FileInputFormat这个类,而我却导入了org.apache.hadoop.mapred.FileInputFormat这个类。这两个类的方法名一样误导了我,参数的不同我凭“经验”误认为是版本差异,哎,这是有多坑。
5. org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
出现了这个问题,还是百度,有几篇博客上说的 把hadoop.dll和winutils.exe放入到windows下hadoop的bin目录下,配置下环境变量便成功了 。 我便下载了hadoop2.2版本中的这两个文件,重启eclipse,可是并没有成功,又试了几次,还是失败。这时候我在咒怨这些博客,说的啥啊,准都不准。纠结了一会,又下载了个hadoop2.6版本的,重启eclipse,程序竟然运行了,我真是太棒了。
6.将文件中一行中的每个单词分开
运行结果出来后我脸瞬间黑了,并没有实现统计每个单词个数的功能,而是把每一行当做一个单词来处理。我检查了好多遍,越检查越着急。到底为什么呢。原来是分割问题。这是所写的分割单词的代码:String[] split = value.toString().split("\t");但在用vi编辑文件时,两个单词之间的间隔是空格,并不是敲的tab键。将代码改为 String[] split = value.toString().split(" ") ;运行,单词统计数目出来了。
将所敲的代码记录下来,方面以后的学习。
MyMapper.java
MyReaducer.java
WordCount.java
在遇到问题的时候我总是绕老绕去,但最终还是要面对。在以后的学习过程中一定要暗示自己遇到问题时少绕圈子,直面问题。言归正传,谈一下这几天我在学习的过程中遇到的问题吧。
1. Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
在hadoop2.4.0中确实没有winutils.exe 这个文件,我就疯狂的百度,找到了一个解决方法,就是在程序中添加几行代码:
点击(此处)折叠或打开
- File workaround = new File(".");
- System.getProperties().put("hadoop.home.dir", workaround.getAbsolutePath());
- new File("./bin").mkdirs();
- new File("./bin/winutils.exe").createNewFile();
2. hadoop Cannot run program "cygpath": CreateProcess error=2, ?????????
这是一个搞笑的问题,为什么这么说呢?吴超老师的视频上因为出现文件权限问题,导入了一个程序包,我也跟着导入了。这是搞笑之一,因为我的程序并没有出现权限问题,那我为什么还要导入这个程序包呢,怪我墨守成规。导入之后就一直提示这个问题,然后我就百度,百度上也有一些类似的问题,给出的答案是安装一个cygwin,配置下环境,然后问题就解决了。这是搞笑之二,出现这个问题,我没有思考就直接百度,纠结了太长时间,就想找个最佳答案,网上有步骤,比如装个cygwin,我也没有试试。最后我终于安装了cygwin,配置好环境,然而问题并没有解决,网上说这些做好就成功了额。饶了这么久,我终于想起要看问题提示的代码了,问题代码的核心竟是之前导入的那个程序包中的,这还有什么好说的。我把导入的程序包删除了,果然没了这个提示,但是,又出现了新的问题。
3. java.lang.ClassCastException: org.apache.hadoop.conf.Configuration cannot be cast to org.apache.hadoop.mapred.JobConf
前面的问题算是环境问题,这个问题是代码问题,而且正是解决我这些谜团的引子。
因为在编写wordCount这个程序时有 文件输入这个过程,而且是必须的过程。老师所讲的视频中是通过这行代码实现的 FileInputFormat.setInputPaths(job, IN_PATH)。而我敲出了这样的代码FileInputFormat.setInputPaths((JobConf)conf, IN_PATH); 这两行代码看起来就只有第一个参数不一样,我就认为是hadoop2.x和hadoop1.x中源码的差别,就这样敲了下去,大错特错额。
解决这个问题,我就把 FileInputFormat.setInputPaths((JobConf)conf, IN_PATH)改成了FileInputFormat.setInputPaths(new JobConf(conf), IN_PATH);接着第四个问题出来了
4. java.io.IOException: No input paths specified in job
这明明就是文件输入的代码,为什么提示没有输入呢。这时我想到了是不是我导入的类不对,便抓紧看了视频核对一样,果然,我导入的包不对。正确的应该导入入org.apache.hadoop.mapreduce.lib.input.FileInputFormat这个类,而我却导入了org.apache.hadoop.mapred.FileInputFormat这个类。这两个类的方法名一样误导了我,参数的不同我凭“经验”误认为是版本差异,哎,这是有多坑。
5. org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
出现了这个问题,还是百度,有几篇博客上说的 把hadoop.dll和winutils.exe放入到windows下hadoop的bin目录下,配置下环境变量便成功了 。 我便下载了hadoop2.2版本中的这两个文件,重启eclipse,可是并没有成功,又试了几次,还是失败。这时候我在咒怨这些博客,说的啥啊,准都不准。纠结了一会,又下载了个hadoop2.6版本的,重启eclipse,程序竟然运行了,我真是太棒了。
6.将文件中一行中的每个单词分开
运行结果出来后我脸瞬间黑了,并没有实现统计每个单词个数的功能,而是把每一行当做一个单词来处理。我检查了好多遍,越检查越着急。到底为什么呢。原来是分割问题。这是所写的分割单词的代码:String[] split = value.toString().split("\t");但在用vi编辑文件时,两个单词之间的间隔是空格,并不是敲的tab键。将代码改为 String[] split = value.toString().split(" ") ;运行,单词统计数目出来了。
将所敲的代码记录下来,方面以后的学习。
MyMapper.java
点击(此处)折叠或打开
- public class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
- protected void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
- String[] split = value.toString().split(" ");
- System.out.println("the splist size is "+split.length );
- for (String word : split) {
- System.out.println("the word is "+word);
- context.write(new Text(word), new LongWritable(1L));
- }
-
- }
-
- }
点击(此处)折叠或打开
- public class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
- protected void reduce(Text k2, Iterable<LongWritable> v2s, Context context)
- throws IOException, InterruptedException {
- Long sum = 0L;
- for (LongWritable v2 : v2s) {
- sum+=v2.get();
- }
- context.write( k2, new LongWritable(sum));
- }
-
- }
点击(此处)折叠或打开
- public class WordCount {
-
- static String IN_PATH = "hdfs://192.168.15.100:9000/test";
- static String OUT_PATH = "hdfs://192.168.15.100:9000/test1";
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
-
- /*File workaround = new File(".");
- System.getProperties().put("hadoop.home.dir", workaround.getAbsolutePath());
- new File("./bin").mkdirs();
- new File("./bin/winutils.exe").createNewFile();*/
- Configuration conf = new Configuration();
- /*JobConf jobConf = new JobConf(conf);*/
- Job job = new Job(conf,WordCount.class.getSimpleName());
-
- //文件输入
- org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPaths(job, IN_PATH);
- // FileInputFormat.setInputPaths(new JobConf(conf), IN_PATH);
- //指定对输入数据进行格式化管理的类
- job.setInputFormatClass(TextInputFormat.class);
-
- //指定自定义的Maper类
- job.setMapperClass(MyMapper.class);
-
- //指定map的key、value输出类型
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(LongWritable.class);
-
- //分区
- job.setPartitionerClass(org.apache.hadoop.mapreduce.lib.partition.HashPartitioner.class);
- job.setNumReduceTasks(1);
-
- //指定自定义的reducer类
- job.setReducerClass(MyReducer.class);
-
- //指定reducer的输出类型
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(LongWritable.class);
-
- //指定输出的路径
- FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
- //指定输出的格式化类
- job.setOutputFormatClass(TextOutputFormat.class);
-
- //提交任务
- job.waitForCompletion(true);
- // System.exit(job.waitForCompletion(true) ? 0:1);
-
-
- }
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29876573/viewspace-1814318/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29876573/viewspace-1814318/