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
}
}