本文不生产内容,只是以下内容的搬运工
http://www.cnblogs.com/kinglau/p/3794433.html
http://www.powerxing.com/install-hadoop/
http://www.powerxing.com/hadoop-build-project-using-eclipse/
环境#
本文基于Ubuntu 14.04 64bit, Hadoop2.7
Hadoop伪分布式安装配置#
创建Hadoop用户##
首先创建Hadoop用户组
sudo addgroup hadoop
然后创建Hadoop用户
sudo adduser -ingroup hadoop hadoop
这会提示输入hadoop用户的密码。
接下来为hadoop用户添加权限
sudo gedit /etc/sudoers
hadoop-user-priviledge.png
用新创建的Hadoop用户登录##
安装SSH##
sudo apt-get install openssh-server
安装完成后,启动服务
sudo /etc/init.d/ssh start
设置免登陆密码,生成私钥和公钥
ssh-keygen -t rsa -P ""
此时会再/home/hadoop/.ssh下生成两个文件,id_rsa和id_rsa.pub,前者为私钥,后者为公钥。
下面我们将公钥追加到authorized_keys中,它用户保存所有允许以当前用户身份登录到ssh客户端用户的公钥内容。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
登录ssh
ssh localhost
退出
exit
安装JAVA环境##
从官网http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,选择Linux x64下载到本地jdk-8u73-linux-x64.gz
然后解压
tar -zxvf jdk-8u73-linux-x64.gz
我们这里想把JAVA安装到/usr/local/java,因此把解压出的文件移动到这里
sudo mv jdk1.8.0_71 /usr/local/jdk1.8.0_71
安装Hadoop##
首先,从官网下载Hadoop 2.7
http://mirror.bit.edu.cn/apache/hadoop/common/
然后加压
tar -zxvf hadoop-2.7.0.tar.gz
本实验中我们想把hadoop安装在/usr/local下面,因此把解压出来的文件夹移动到/usr/local/hadoop
sudo mv hadoop-2.7.0 /usr/local/hadoop
配置##
配置环境变量###
首先我们需要知道上一步中JAVA的安装路径,上一步我们安装到了/usr/local/jdk1.8.0_71。
打开 ~/.bashrc
sudo gedit ~/.bashrc
该命令会打开该文件的编辑窗口,在文件末尾追加下面内容,然后保存,关闭编辑窗口。
#HADOOP VARIABLES START
export JAVA_HOME=/usr/local/jdk1.8.0_71
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP VARIABLES END
执行下面命,使添加的环境变量生效:
source ~/.bashrc
配置hadoop-env###
打开hadoop-env.sh
sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh
找到JAVA_HOME变量,修改此变量如下
export JAVA_HOME=/usr/local/jdk1.8.0_71
WordCount单机模式测试#
至此,我们的单机模式已经安装完成。通过hadoop自带的WordCount实例验证是否安装成功。
cd /usr/local/hadoop
mkdir input
cp README.txt input
bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.4.0-sources.jar org.apache.hadoop.examples.WordCount input output
然后查看结果
cat output/*
伪分布式环境配置##
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml
),将当中的
<configuration>
</configuration>
修改为
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for 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>
配置完成后,执行 NameNode 的格式化
./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0″ 的提示,若为 “Exitting with status 1″ 则是出错。
接着开启 NameNode 和 DataNode 守护进程。
./sbin/start-dfs.sh
启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。
启动完成后,可以通过命令 jps来判断是否成功启动,若成功启动则会列出如下进程:“NameNode”、”DataNode” 和 “SecondaryNameNode”
(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。
如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
install-hadoop-16-jps.png
一般情况下,若是 DataNode 没有启动,可尝试如下的
./sbin/stop-dfs.sh # 关闭
rm -r ./tmp 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format 重新格式化 NameNode
./sbin/start-dfs.sh # 重启
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
运行Hadoop伪分布式实例##
上面的单机模式,WordCount读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
复制完成后,可以通过如下命令查看文件列表:
./bin/hdfs dfs -ls input
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar input output
安装配置Eclipse#
安装Hadoop Eclipse Plugin##
下载地址 hadoop2x-eclipse-plugin
(备用下载地址:http://pan.baidu.com/s/1i4ikIoP)
下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar复制到 Eclipse 安装目录的 plugins 文件夹中,重启 Eclipse。
配置Hadoop Eclipse Plugin##
在继续配置前请确保已经开启了 Hadoop。即通过jps可以看到NameNode,DataNode,SecondaryNameNode都已在运行。
启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations
hadoop-build-project-using-eclipse-03.png插件需要进一步的配置。
第一步:选择 Window 菜单下的 Preference。
此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。
hadoop-build-project-using-eclipse-05.png
第二步:切换 Map/Reduce 开发视图
选择 Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。
第三步:建立与 Hadoop 集群的连接
点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location
在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可。
设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。
最后的设置如下图所示:
hadoop-build-project-using-eclipse-08.png
在 Eclipse 中创建 MapReduce 项目##
点击 File 菜单,选择 New -> Project…:
选择 Map/Reduce Project,点击 Next。
填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。
接着右键点击刚创建的 WordCount 项目,选择 New -> Class
需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。
创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件
package org.apache.hadoop.examples;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
通过 Eclipse 运行 MapReduce##
在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:
cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src
复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示
hadoop-build-project-using-eclipse-17.png选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。这里的input即为之前创建在hadoop上的input路径。
hadoop-build-project-using-eclipse-17.png至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。
网友评论