您的位置:首页 > 运维架构

Hadoop安装及开发

2016-05-06 20:35 501 查看

Hadoop安装

安装环境

本人开发用的电脑操作系统是ubuntu14.04 64位,因此本文讲述的是Hadoop在ubuntu14.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
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abasefor other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
修改配置文件 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>

Hadoop启动和停止

配置完成后,执行 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守护进程。

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;

/**

*典型的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<Text,Text, Text, Text> {

@Override

publicvoid map(Text key, Text value, OutputCollector<Text, Text>output, Reporter reporter)

throwsIOException {

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

output.collect(value,key);

}

}

publicstatic class Reduce extends MapReduceBase implements Reducer<Text,Text, Text, Text> {

@Override

publicvoid reduce(Text key, Iterator<Text> values,OutputCollector<Text, Text> 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要执行的任务名称,用于处理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程序

将本地文件系统中的文件拷贝到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文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: