Hadoop安装及开发



Hadoop安装

安装环境

本人开发用的电脑操作系统是ubuntu14.04 64位,因此本文讲述的是Hadoopubuntu14.0464bit系统下的安装,实际上Hadoop目前也只支持Linux系统。有人号称在Windows下成功安装了Hadoop,我是没有见过。

新建用户

首先要为Hadoop的安装创建一个新用户:

sudouseradd -d /home/hadoop -m hadoop

sudopasswd hadoop

输入hadoop用户的密码,两次

hadoop用户增加管理员权限,方便部署:

sudoadduser hadoop sudo

配置SSH免密码登录

Hadoop的伪分布模式启动时需要SSH登录本机,因此我们先设置SSH登录本机免密码:

cd~/.ssh/

如果hadoop用户的家目录下没有.ssh/目录,则先执行一次sshlocalhost

ssh-keygen-t rsa

所有提示都按回车

cat./id_rsa.pub >> ./authorized_keys

安装Java环境

Hadoop需要Java环境,至少需要JDK1.7,Java环境的安装和配置请自行百度。

Hadoop下载和安装

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需要配置成单机模式或伪分布模式,为了开发和调试方便,我们将Hadoop配置成伪分布模式:

修改配置文件 core-site.xml

hadoop.tmp.dir

file:/usr/local/hadoop/tmp

Abasefor other temporary directories.

fs.defaultFS

hdfs://localhost:9000

修改配置文件 hdfs-site.xml

dfs.replication

1

dfs.namenode.name.dir

file:/usr/local/hadoop/tmp/dfs/name

dfs.datanode.data.dir

file:/usr/local/hadoop/tmp/dfs/data

Hadoop启动和停止

配置完成后,执行 NameNode的格式化:

./bin/hdfsnamenode -format

开启 NameNodeDataNode守护进程:

./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守护进程。

Hadoop开发

Hadoop开发所需的jar

将以下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

一段典型的Hadoop程序

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;



/**

*典型的Hadoopjob继承org.apache.hadoop.conf.Configured类,实现

*org.apache.hadoop.util.Tool接口

*@author zyl

*@date 2016430日上午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, OutputCollectoroutput, Reporter reporter)

throwsIOException {

//Map过程很简单,将文件的keyvalue调换后输出

output.collect(value,key);

}



}



publicstatic class Reduce extends MapReduceBase implements Reducer {



@Override

publicvoid reduce(Text key, Iterator values,OutputCollector output, Reporter reproter)

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要执行的任务名称,用于处理MapReduce的类

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程序

将本地文件系统中的文件拷贝到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文件。

















你可能感兴趣的:(hadoop,hadoop安装,hadoop开发)