第一个hadoop程序

1:安装ubuntu并在ubuntu中安装hadoop
参考链接:http://www.powerxing.com/install-hadoop/

hadoop /etc/hadoop中常用配置文件的解释

hadoop-env.sh

  右上角的hadoop-env.sh之前我们已经用到过了,在里面配置了JAVA_HOME环境变量。并且由env这个缩写也可以大概猜到是environment,所以这个文件主要是做环境变量的配置的。

core-site.xml

  hadoop core的配置项,该文件主要用来配置全局性的参数具体的配置模版可参考【官方core-site.xml模版】 。hadoop core提供了一套分布式文件系统以及支持Map-Reduce的计算框架。HBase、Pig等都是在hadoop core之上搭建的。

hdfs-site.xml

  hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等。里面设置了诸如namenode的地址、datanode的地址等参数。配置模版可参考【官方hdfs-site.xml模版】

mapred-site.xml

  mapreduce守护进程的配置项,包括jobtracker和tasktracker。具体参数及释义可参看【官方mapred-site.xml模版】。

log4j.properties

  用来记录系统日志。log4j是apache旗下的一个日志记录项目。【log4j项目地址】

2:安装eclispe并且在eclipse中安装hadoop插件
参考链接:https://my.oschina.net/muou/blog/408543
我用的版本是hadoop2.6 ,eclispe是kepper的,用ant编译hadoop2x-eclipse-plugin-master后生成的插件还是不可以用最后换了个eclispe改用neon版本的问题就解决了,这个插件我建议自己编译,因为试过很多次网上的都不好用。

其中遇到的问题:

  • ubuntu中eclipse找不到jdk
    解决方法:
在eclipse.ini开始处添加
-vm  
/opt/jdk1.8.0_121/jre/bin/java    
  • ./bin/hdfs namenode -format 出现错误 java.net.UnknownHostException: bogon: bogon: Name or service not known
运行以下命令:
echo "127.0.0.1 $HOSTNAME" | sudo tee -a /etc/hosts

3:编码,运行
MyMapper


import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{

    /**
     * 重写map方法单词切分
     */
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)
            throws IOException, InterruptedException {
        String[] spilted = value.toString().split(" ");
        for (String word : spilted) {
            context.write(new Text(word), new LongWritable(1L));
        } 
    }
}

MyReducer

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{

    @Override
    protected void reduce(Text key, Iterable<LongWritable> values,
            Reducer<Text, LongWritable, Text, LongWritable>.Context context)
            throws IOException, InterruptedException {
        long count = 0L;
        for (LongWritable value : values) {
            count += value.get();
        }
        context.write(key, new LongWritable(count)); 

    }



}

MyWordCountJob

package com.sl.mapreduceTest.mapper;



import java.net.URI;



import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;





public class MyWordCountJob {



    // 输入文件路径

    public static final String INPUT_PATH = "hdfs://localhost:9000/testdir/input/words.txt";

    // 输出文件路径

    public static final String OUTPUT_PATH = "hdfs://localhost:9000/testdir/output";







    public static void main(String[] args) throws Exception{

            Configuration conf = new Configuration();

            //conf.set("fs.hdfs.impl",DistributedFileSystem.class.getName());  

            // 0.0:首先删除输出路径的已有生成文件

            FileSystem fs = FileSystem

                    .get(new URI(INPUT_PATH), conf);

            Path outPath = new Path(OUTPUT_PATH);

            if (fs.exists(outPath)) {

                fs.delete(outPath, true);

            }



            @SuppressWarnings("deprecation")

            Job job = new Job(conf, "WordCount");

            job.setJarByClass(MyWordCountJob.class);



            // 1.0:指定输入目录

            FileInputFormat.setInputPaths(job, new Path(INPUT_PATH));

            // 1.1:指定对输入数据进行格式化处理的类(可以省略)

            job.setInputFormatClass(TextInputFormat.class);

            // 1.2:指定自定义的Mapper类

            job.setMapperClass(MyMapper.class);

            // 1.3:指定map输出的<K,V>类型(如果<k3,v3>的类型与<k2,v2>的类型一致则可以省略)

            job.setMapOutputKeyClass(Text.class);

            job.setMapOutputValueClass(LongWritable.class);

            // 1.4:分区(可以省略)

            job.setPartitionerClass(HashPartitioner.class);

            // 1.5:设置要运行的Reducer的数量(可以省略)

            job.setNumReduceTasks(1);

            // 1.6:指定自定义的Reducer类

            job.setReducerClass(MyReducer.class);

            // 1.7:指定reduce输出的<K,V>类型

            job.setOutputKeyClass(Text.class);

            job.setOutputValueClass(LongWritable.class);

            // 1.8:指定输出目录

            FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));

            // 1.9:指定对输出数据进行格式化处理的类(可以省略)

            job.setOutputFormatClass(TextOutputFormat.class);

            // 2.0:提交作业

            boolean success = job.waitForCompletion(true);

            if (success) {

                System.out.println("Success");

                System.exit(0);

            } else {

                System.out.println("Failed");

                System.exit(1);

            }

    }

}

需要用到的jar(全部都可以在你下的hadoop中找到)
这里写图片描述

其中遇到最大的问题就是找不到输入输出文件。但是按了eclipse的hadoop插件,hdfs路径自然就找到了。

输入:
word.txt

Hello Edison Chou
Hello Hadoop RPC
Hello Wncud Chou
Hello Hadoop MapReduce
Hello Dick Gu

输出

Chou    2
Dick    1
Edison  1
Gu  1
Hadoop  2
Hello   5
MapReduce   1
RPC 1
Wncud   1

eclispe运行结果
这里写图片描述

可运行的代码下载:http://download.csdn.net/detail/iuie_sl/9773075

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值