本文描述在ubuntu上安装Hadoop,并在Pseudo-Distributed Operation模式下运行一个WordCount的Demo。
Step1
安装必要的软件:jdk,ssh。
在ubuntu下可以使用apt安装。
sudo apt-get install openjdk-6-jdk
sudo apt-get install ssh
ssh安装完成后需要做一个特殊的设置。Hadoop使用ssh对集群的机器进行控制,需要让ssh无密码的登录远程机器,本文使用单击模拟分布环境,只要能无密码登录到localhost即可。
首先使用 ssh-keygen 命令按提示生成ssh密钥对。
在使用ssh-copy-id user@localhost,把公钥复制到authorized_keys中。
最后验证一下能否ssh localhost无密码登录。
Step2
下载hadoop-0.20.2.tar.gz ,解压。并把bin目录添加到PATH中。
配置hadoop/conf/hadoop-env.sh,添加JAVA_HOME环境变量
export JAVA_HOME="/usr/lib/jvm/java-6-openjdk"
分别配置conf/core-site.xml,conf/hdfs-site.xml,conf/mapred-site.xml三个hadoop主要的配置文件。
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
以上配置告诉hadoop在本机同时启动jobtracker,tasktracker,namenode,datanode,在本机模拟分布式的计算环境。
Step3
格式化一个新的分布式文件系统
hadoop namenode -format
启动所有的服务
start-all.sh
通过web UI查看namenode,jobtracker的状态。页面打开后表示hadoop启动完毕。
NameNode - http://localhost:50070/
JobTracker - http://localhost:50030/
Step4
编写简单WordCount Demo。需要把hadoop-0.20.2-core.jar api添加到classpath下。如果使用maven构建项目,可以添加以下依赖。
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>0.20.2</version>
</dependency>
代码如下。
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while(tokenizer.hasMoreTokens()){
context.write(new Text(tokenizer.nextToken()), new IntWritable(1));
}
}
}
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (IntWritable value : values) {
count++;
}
context.write(key, new IntWritable(count));
}
}
public class WordCountJobConf {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
if (args.length != 2) {
System.err.println("Usage: NewMaxTemperature <input path> <output path>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(WordCountJobConf.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
编译项目打包为jar wordcount.jar(不需要包含依赖)
Step5
准备wordcount的输入文本stuff.txt,并复杂到hdfs上。
创建input目录。
hadoop dfs -mkdir input
hadoop dfs -put stufff.txt input
最后运行wordcount,注意output目录,不应该存在。
hadoop jar wordcount.jar WordCountJobConf input output
map和reduce都运行完成可以,可以到output查看计算结果。
hadoop dfs -ls output
hadoop dfs -cat output/part-r-00000
wordcount程序简单分析
map方法使用hadoop默认的TextInputFormat从input目录读取文件,并把每一行作为一个输入,key为行号,value为该行文本内容。map方法,从数据中提取所有的token,并以该token为key,1为value作为输出。hadoop收集所有的map输出,并通过shuffle过程,归并所有相同的key。reduce过程的数据即为归并的结果,key为token,value为map中该token对应的所有value的集合。reduce方法简单计算value集合的大小,输出结果。key为token,value为数量。最后hadoop使用默认TextOutputFormat输出结果。
vast 1
version 3
very 4
via 36
view 4
viewed 1
views 1
virtual 1
void 8
walk 1
watch 1
wave 1
way 2
we 5
what 1
when 6
where 7
本文详细介绍了如何在Ubuntu系统中逐步安装Hadoop,并在Pseudo-Distributed Operation模式下执行WordCount示例。包括安装JDK和SSH,配置Hadoop环境,格式化NameNode,启动服务,编写和运行WordCount程序,最后分析了WordCount的工作原理。
855

被折叠的 条评论
为什么被折叠?



