本人开发用的电脑操作系统是ubuntu14.04 64位,因此本文讲述的是Hadoop在ubuntu14.0464bit系统下的安装,实际上Hadoop目前也只支持Linux系统。有人号称在Windows下成功安装了Hadoop,我是没有见过。
首先要为Hadoop的安装创建一个新用户:
sudouseradd -d /home/hadoop -m hadoop
sudopasswd hadoop
输入hadoop用户的密码,两次
为hadoop用户增加管理员权限,方便部署:
sudoadduser hadoop sudo
Hadoop的伪分布模式启动时需要SSH登录本机,因此我们先设置SSH登录本机免密码:
cd~/.ssh/
如果hadoop用户的家目录下没有.ssh/目录,则先执行一次sshlocalhost
ssh-keygen-t rsa
所有提示都按回车
cat./id_rsa.pub >> ./authorized_keys
Hadoop需要Java环境,至少需要JDK1.7,Java环境的安装和配置请自行百度。
Hadoop2 可以在http://mirror.bit.edu.cn/apache/hadoop/common/或者http://mirrors.cnnic.cn/apache/hadoop/common/下载,一般下载 “stable”下的 hadoop-2.x.y.tar.gz这个文件,这是Hadoop的稳定版本。
下载Hadoop后解压到/usr/local目录下:
sudotar -zvxf hadoop-2.6.0.tar.gz -C /usr/local
cd/usr/local/sudo mv ./hadoop-2.6.0/ ./hadoop #将文件夹名改为hadoop
sudochown -R hadoop ./hadoop # 修改文件权限
开发用的Hadoop需要配置成单机模式或伪分布模式,为了开发和调试方便,我们将Hadoop配置成伪分布模式:
修改配置文件 core-site.xml
修改配置文件 hdfs-site.xml
配置完成后,执行 NameNode的格式化:
./bin/hdfsnamenode -format
开启 NameNode和 DataNode守护进程:
./sbin/start-dfs.sh
如果这一步出现localhost:Error: JAVA_HOME is not set错误,则打开/usr/local/hadoop/etc/hadoop目录下的hadoop-env.sh文件,将其中
exportJAVA_HOME=${JAVA_HOME}
改为
exportJAVA_HOME=/usr/local/java/jdk1.7.0_79
启动完成后,可以通过命令 jps
来判断是否成功启动,若成功启动则会列出如下进程:“NameNode”、”DataNode”和 “SecondaryNameNode”
运行 sbin/stop-dfs.sh可以关闭Hadoop守护进程。
将以下jar包拷贝到Java项目的lib目录下:
hadoop-2.x.x\share\hadoop\common 所有jar,
hadoop-2.x.x\share\hadoop\common\lib 所有jar,
hadoop-2.x.x\share\hadoop\hdfs 所有jar
hadoop-2.x.x\share\hadoop\mapreduce 所有jar
hadoop-2.x.x\share\hadoop\yarn 所有jar
importjava.io.IOException;
importjava.util.Iterator;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.conf.Configured;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.mapred.FileInputFormat;
importorg.apache.hadoop.mapred.FileOutputFormat;
importorg.apache.hadoop.mapred.JobClient;
importorg.apache.hadoop.mapred.JobConf;
importorg.apache.hadoop.mapred.KeyValueTextInputFormat;
importorg.apache.hadoop.mapred.MapReduceBase;
importorg.apache.hadoop.mapred.Mapper;
importorg.apache.hadoop.mapred.OutputCollector;
importorg.apache.hadoop.mapred.Reducer;
importorg.apache.hadoop.mapred.Reporter;
importorg.apache.hadoop.mapred.TextOutputFormat;
importorg.apache.hadoop.util.Tool;
importorg.apache.hadoop.util.ToolRunner;
/**
*典型的Hadoop的job继承org.apache.hadoop.conf.Configured类,实现
*org.apache.hadoop.util.Tool接口
*@author zyl
*@date 2016年4月30日上午10:45:53
*@version
*@since
*/
publicclass SampleJob extends Configured implements Tool {
publicstatic class MapClass extends MapReduceBase implements Mapper
@Override
publicvoid map(Text key, Text value, OutputCollector
throwsIOException {
//Map过程很简单,将文件的key和value调换后输出
output.collect(value,key);
}
}
publicstatic class Reduce extends MapReduceBase implements Reducer
@Override
publicvoid reduce(Text key, Iterator
throwsIOException {
//将同一key的所有value的列表转换成用逗号分隔的一行字符串
Stringcsv = "";
while(values.hasNext()) {
if(csv.length() > 0) {
csv+= ",";
}
csv+= values.next().toString();
}
output.collect(key,new Text(csv));
}
}
/*
* (non-Javadoc)
*
* @see org.apache.hadoop.util.Tool#run(java.lang.String[])
*/
@Override
publicint run(String[] arg0) throws Exception {
Configurationconf = getConf();
JobConfjob = new JobConf(conf, SampleJob.class);
//第一个参数是输入文件在Hadoop中存储的路径
Pathin = new Path(arg0[0]);
//第二个参数是输出参数将在Hadoop中存储的目录,注意:这里指定的是目录,不是文件名
Pathout = new Path(arg0[1]);
FileInputFormat.setInputPaths(job,in);
FileOutputFormat.setOutputPath(job,out);
//指定Hadoop要执行的任务名称,用于处理Map和Reduce的类
job.setJobName("SampleJob");
job.setMapperClass(MapClass.class);
job.setReducerClass(Reduce.class);
job.setInputFormat(KeyValueTextInputFormat.class);
job.setOutputFormat(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//指定输入文件的分隔符,如不指定,默认的分隔符是制表符(tab)
job.set("key.value.separator.in.input.line",",");
JobClient.runJob(job);
return0;
}
/**
* @param args
*/
publicstatic void main(String[] args) {
intres = -1;
try{
res= ToolRunner.run(new Configuration(), new SampleJob(), args);
}catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(res);
}
}
将本地文件系统中的文件拷贝到Hadoop的分布式文件系统(HDFS)下:
./bin/hadoopfs -put cite75_99.txt input/cite75_99.txt
其中input目录位于HDFS的默认路径/user/hadoop下,/user/hadoop目录开始是不存在的,要用Hadoop命令来创建:
./bin/hadoopfs -mkdir /user
./bin/hadoopfs -mkdir /user/hadoop
/user/hadoop一经创建就成为HDFS的默认路径,凡未指明全路径(hdfs://localhost:9000/user/chuck这种形式的URI)的路径默认都是相对于/user/hadoop目录。
执行Hadoop程序:
./bin/hadoopjar ./ubin/hadoop-sample.jar SampleClass input/cite75_99.txtoutput/cite_out
其中 hadoop-sample.jar是把Hadoop程序打包成jar文件。