hadoop初级班(一),hadoop初级班(


hadoop的部署 1.Linux安装 (1)如果你的电脑操作系统是Windows7或Windows8的话,请先安装一个Ubuntu系统。安装办法:下载自己可以快速下载的Ubuntu的镜像,我的用的是Ubuntu12.04,来源于中科大自己的http://mirrors.ustc.edu.cn/,下载下来后建个文件夹,将下载的ISO文件拖入,然后解压,解压完成后如图所示 双击wubi.exe,进入安装页面,
目标驱动器尽量不要选择C盘,此处选择D盘,安装大小就是你给Ubuntu的空间,默认18G,口令就是你登录Ubuntu的密码,随便设置。然后点击安装即可,然后提示你重启,重启等待Ubuntu自动安装完成即可。 在重启之后可能会出现联网下载100多个文件,这个步骤可以跳过,进行这一步的时候你可以点击一下展开的箭头,然后选择跳过即可。这一步很慢很慢。 到这里,Ubuntu安装完成

你可以点击左上角的第一个图标,在search里面寻找terminal,然后把terminal的图标拖拽到桌面上即可。
2.JDK的安装 下载http://pan.baidu.com/s/1bncVBmn这里的JDK7。之前在官网上下载JDK8速度挺慢的,在网上百度云盘里找到JDK7的资源,Linux 64位的,下载速度很快。下载下来后我将它解压到了/usr/local/lib目录下。这里注意要使用root权限,也就是sudo tar -zxvf   *******(待解压文件)    /usr/local/lib/ 。 然后修改/etc/profile文件,可以用sudo vim /etc/profile打开,编辑,当然要先安装vim,用apt-get install vim即可。 profile文件必须是root权限才能更改,更改如下:
在最后加入:
export JAVA_HOME=/usr/local/lib/jdk1.7.0_67 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
然后source /etc/profile(使修改的环境变量生效),java -version,就可以看到安装成功了!
3.安装rsync和ssh sudo apt-get install ssh rsync安装ssh和rsync 配置ssh免登录 ssh-keygen -t dsa -f ~/.ssh/authorized_keys

ssh localhost 第一次执行本命令,会出现一个提示,输入yes,回车即可

4.安装hadoop
下载hadoop,参考http://jingyan.baidu.com/article/d621e8da0a08192865913fac.html,注意我们最后下载的是stable2里的1.2.1版本,现在hadoop有1.X和2.X版本,2.X在配置上与1.X有出入,很多书上讲的还是1.X的安装情况,这里我们也下载1.X,建一个hadoop文件夹,然后下载好的hadoop放进去,解压即可 hadoop的部署模式有三种,单机模式、伪分布式模式和分布式模式。这里我们用伪分布式模式,就是一台电脑模拟集群 修改hadoop1.2.1/conf文件夹下的core-site.xml   ,mapred-site.xml和hdfs-site.xml三个文件 core-site.xml修改如下:在<configuration></configuration>之间加入 <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property>
mapred-site.xml修改如下:在<configuration></configuration>之间加入 <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> hdfs-site.xml修改如下:在<configuration></configuration>之间加入 <property> <name>dfs.replication</name> <value>1</value> </property>
在hadoop-env.sh里加入 export JAVA_HOME=/usr/local/lib/jdk1.7.0_67
启动hadoop: 我们可以在hadoop文件夹下的bin文件夹下启动hadoop,也可以将bin文件加入到环境变量里,这样在什么目录下都能用,还是在profile里面 把之前的export PATH改为=$PATH:$JAVA_HOME/bin:/home/ustc/hadoop/hadoop-1.2.1/bin, 然后命令窗 hadoop namenode -format
这是格式化namenode start-all.sh 这是启动所有节点 输入jps 可以看到六个进程 OK!
使用自带的例程进行测试(引用自最短路径之从零开始学习hadoop)
5.为了能用IDE进行java的编辑,我们下载并安装了eclipse,安装过程不多讲了
6.下载maven,用来帮助在eclipse里编辑mapreduce程序 下载安装maven:http://my.oschina.net/mingpeng/blog/219961
然后再自己的一个文件夹内,比方说eclipse的workspace里,创建一个wordcount 先mvn archetype:generate,这是在生成maven项目框架
要求输入groupID ,artifactID等等,这个自己按意愿输入,详细参考maven相关书籍
mvn eclipse:eclipse生成eclipse可识别的工程,然后启动eclipse,import maven项目,然后编辑POM.xml,在里面的dependencies加入 dependency <dependency> <groupId>org.apache.hadoop</hadoop> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency>
加入这个是为了让maven自动下载hadoop相关的包,使mapreduce正确运行,否则找不到这些包
然后mvn clean install,先清空jar包,然后编译打包生成jar包
最后hadoop jar ./target/wordcount-1.0-SNAPSHOT.jar ustc/hilab/WordCount a tt  上面这句的意思是在hadoop下调用wordcount jar包,ustc/hilab/WordCount这个是调用的类,ustc.hilab包下的WordCount类   a是我自己建的一个文件,里面有几行字母(当然先得按照之前讲的把本地的a put进hdfs里面)   tt是输出文件夹, 如果想看tt,输入 hadoop fs -ls即可,这就是看hadoop的fs






下面是wordcount 代码,引用自http://blog.csdn.net/xw13106209/article/details/6116323
package ustc.hilab;  
import java.io.IOException;  
import java.util.Iterator;  
import java.util.StringTokenizer;  
import org.apache.hadoop.fs.Path;  
import org.apache.hadoop.io.IntWritable;  
import org.apache.hadoop.io.LongWritable;  
import org.apache.hadoop.io.Text;  
import org.apache.hadoop.mapred.FileInputFormat;  
import org.apache.hadoop.mapred.FileOutputFormat;  
import org.apache.hadoop.mapred.JobClient;  
import org.apache.hadoop.mapred.JobConf;  
import org.apache.hadoop.mapred.MapReduceBase;  
import org.apache.hadoop.mapred.Mapper;  
import org.apache.hadoop.mapred.OutputCollector;  
import org.apache.hadoop.mapred.Reducer;  
import org.apache.hadoop.mapred.Reporter;  
import org.apache.hadoop.mapred.TextInputFormat;  
import org.apache.hadoop.mapred.TextOutputFormat;  
/** 
 *  
 * 描述:WordCount explains by Felix 
 * @author Hadoop Dev Group 
 */  
public class WordCount  
{  
    /** 
     * MapReduceBase类:实现了Mapper和Reducer接口的基类(其中的方法只是实现接口,而未作任何事情) 
     * Mapper接口: 
     * WritableComparable接口:实现WritableComparable的类可以相互比较。所有被用作key的类应该实现此接口。 
     * Reporter 则可用于报告整个应用的运行进度,本例中未使用。  
     *  
     */  
    public static class Map extends MapReduceBase implements  
            Mapper<LongWritable, Text, Text, IntWritable>  
    {  
        /** 
         * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口, 
         * 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为long,int,String 的替代品。 
         */  
        private final static IntWritable one = new IntWritable(1);  
        private Text word = new Text();  
          
        /** 
         * Mapper接口中的map方法: 
         * void map(K1 key, V1 value, OutputCollector<K2,V2> output, Reporter reporter) 
         * 映射一个单个的输入k/v对到一个中间的k/v对 
         * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。 
         * OutputCollector接口:收集Mapper和Reducer输出的<k,v>对。 
         * OutputCollector接口的collect(k, v)方法:增加一个(k,v)对到output 
         */  
        public void map(LongWritable key, Text value,  
                OutputCollector<Text, IntWritable> output, Reporter reporter)  
                throws IOException  
        {  
            String line = value.toString();  
            StringTokenizer tokenizer = new StringTokenizer(line);  
            while (tokenizer.hasMoreTokens())  
            {  
                word.set(tokenizer.nextToken());  
                output.collect(word, one);  
            }  
        }  
    }  
    public static class Reduce extends MapReduceBase implements  
            Reducer<Text, IntWritable, Text, IntWritable>  
    {  
        public void reduce(Text key, Iterator<IntWritable> values,  
                OutputCollector<Text, IntWritable> output, Reporter reporter)  
                throws IOException  
        {  
            int sum = 0;  
            while (values.hasNext())  
            {  
                sum += values.next().get();  
            }  
            output.collect(key, new IntWritable(sum));  
        }  
    }  
    public static void main(String[] args) throws Exception  
    {  
        /** 
         * JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作 
         * 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等 
         */  
        JobConf conf = new JobConf(WordCount.class);  
        conf.setJobName("wordcount");           //设置一个用户定义的job名称  
        conf.setOutputKeyClass(Text.class);    //为job的输出数据设置Key类  
        conf.setOutputValueClass(IntWritable.class);   //为job输出设置value类  
        conf.setMapperClass(Map.class);         //为job设置Mapper类  
        conf.setCombinerClass(Reduce.class);      //为job设置Combiner类  
        conf.setReducerClass(Reduce.class);        //为job设置Reduce类  
        conf.setInputFormat(TextInputFormat.class);    //为map-reduce任务设置InputFormat实现类  
        conf.setOutputFormat(TextOutputFormat.class);  //为map-reduce任务设置OutputFormat实现类  
        /** 
         * InputFormat描述map-reduce中对job的输入定义 
         * setInputPaths():为map-reduce job设置路径数组作为输入列表 
         * setInputPath():为map-reduce job设置路径数组作为输出列表 
         */  
        FileInputFormat.setInputPaths(conf, new Path(args[0]));  
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));  
        JobClient.runJob(conf);         //运行一个job  
    }  
}  










相关内容