Hadoop 0.20.2 安装配置说明
作者:独孤酒间 编辑日期:2012年8月20日
关键字:hadoop 0.20.2 集群配置 ubuntu
描述:本人参考了书籍《Hadoop 实战》及网络上一些资源,经过多次尝试搭建成功后编写的此文档。文档中使用 Ubuntu Server 12.04 x64 + JDK 1.7.0 u5 + Hadoop 0.20.2 及 5 台虚拟机做为演示测试环境。希望能对大家带来帮助。本文档适合初学者,指引初学者或初次接触 Hadoop 的人成功安装 Hadoop ,使用代码执行简单的 HDFS 操作,并利用 MapReduce 执行分布式计算示例代码。其中 MapReduce 示例代码为 Hadoop 官方带的 hadoop-0.20.2-examples.jar 。
一、 环境说明
1.1、运行环境
虚拟机 × 5:
系统:Ubuntu Server 12.04 x64
JAVA:JDK 1.7.0 u5 linux x64
ssh:OpenSSH_5.9p1
Hadoop:Hadoop 0.20.2
1.2、网络环境配置
主机名 | IP 地址 | Hadoop 角色 |
ubuntu00 | 192.168.1.130 | NameNode |
ubuntu01 | 192.168.1.131 | SecondaryNameNode |
ubuntu02 | 192.168.1.132 | DataNode |
ubuntu03 | 192.168.1.133 | DataNode |
ubuntu04 | 192.168.1.134 | DataNode |
1.2.1、配置主机名
sudo vi /etc/hostname
将里面内容改为你的主机名即可。如下图,我其中一台机器的主机名叫ubuntu01
1.2.2、配置网络
sudo vi /etc/network/interfaces
文件内容如下:
# This file describes the network interfaces available on your system
# and how to actiate them. For more information. see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0 # eth0 是网卡设备名称
iface eth0 inet static # 设置 IP 为静态
address 192.168.1.130 # 你的 IP 地址
netmask 255.255.255.0 # 你的子网掩码
network 192.168.1.0 # 此行可省略删除
broadcast 192.168.1.255 # 此行可省略删除
gateway 192.168.1.1 # 网关
dns-nameservers 202.97.224.68 202.97.224.69 # DNS服务器,以空格分隔
dns-search fireteam.org # 此行和省略删除
# 以上红字部分为需要根据你的网络环境更改。
1.2.3、配置 IP 与主机名的映射
sudo vi /etc/hosts
1、注释 127.0.1.1 所在行,否则DataNode连不上。
2、将你的集群机器ip 主机名对应方式加上。如192.168.1.130 ubuntu00,每机器一行,本机也要写上。
二、 软件安装
2.1、JDK
2.1.1、安装 JDK
tar -zxvf /ftp/jdk-7u5-linux-x64.tar.gz -C /tools/
其中“/ftp/jdk-7u5-linux-x64.tar.gz”是你的安装包完整路径,-C(-C必须大写)后面的“/tools/”是你要解压到的路径。
2.1.2、配置环境变量
sudo vi /etc/profile
在文件结尾处添加如下内容:
# Set JVM 1.7.0_05
export JAVA_HOME="/tools/jdk1.7.0_05" # 红字部分需要改为你的 JDK 安装路径。
export JRE_HOME="${JAVA_HOME}/jre"
export CLASSPATH=".:${JAVA_HOME}/lib:${JRE_HOME}/lib"
# Set Path
export PATH="${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}
配置完成后执行 sudo source /etc/profile ,使环境变量设置生效。
2.1.3、测试 JDK
java -version
显示 java version "1.7.0_05" 即为成功。
javac -version
显示 javac 1.7.0_05 即为成功。
2.2、SSH
2.2.1、安装 SSH
sudo apt-get install openssh-server openssh-client
2.2.2、查看 SSH 状态
service ssh status
显示 ssh start/running, process 810 即为成功,其中810为进程 ID 。
2.2.3、启动或重启 SSH
sudo service ssh start
或者
sudo /etc/init.d/ssh restart
2.2.4、配置 SSH 免密码登录
1) 为每台机器生成公钥和加密文件
在每台机器上执行命令 ssh-keygen -t rsa 之后一路回车。
2) 把每台机器的公钥文件复制到其它所有机器
scp ~/.ssh/id_rsa.pub 192.168.1.131:~/id_rsa_130.pub
scp ~/.ssh/id_rsa.pub 192.168.1.132:~/id_rsa_130.pub
以上两句中的 ~/.ssh/id_rsa.pub 是你执行 1) 后生成的公钥文件路径,192.168.1.131 和 192.168.1.132 是其它机器的 IP 地址,IP 后面的 ~/id_rsa_130.pub 是目标路径及文件名,这里我为了区分各机器的公钥文件,执行了重命名,将每台机器的 id_rsa.pub 拷贝至目标机器的 id_rsa_130.pub (其中 130 为所属机器的 IP )。然后输入yes,最后输入slave机器的密码
3) 确保 ssh 配置文件中存在如下内容
执行命令:sudo vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如需修改,则在修改后参照2.2.3执行重启SSH服务使其生效。
4) 将 id_rsa_*.pub 追加到授权的 key 里面
追加本机的授权: cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
追加其它机的授权: cat ~/id_rsa_130.pub >> ~/.ssh/authorized_keys
其中 id_rsa_130.pub 要替换为你的其他机公钥文件名,有几个就替换并执行几遍。
在每台机器上重复执行 4) 内容。
5) 验证 SSH
在每台机器中执行 ssh 192.168.1.130 (替换为你的目标机器的 IP 地址),然后输入 yes (首次连接确认)。如果主机名由本机名变成目标主机名即为成功。每台机器都要执行一遍对所有机器的连接。
6) 移除公钥文件
删除所有机器上刚生成的 .pub 文件
rm ~/.ssh/id_rsa.pub
rm ~/id_rsa*.pub
2.3、Hadoop
2.3.1、安装 Hadoop
tar -zxvf /ftp/hadoop-0.20.2.tar.gz -C /tools/
其中“/ftp/hadoop-0.20.2.tar.gz”是你的安装包完整路径,-C(-C必须大写)后面的“/tools/”是你要解压到的路径。
2.3.2、配置环境变量
sudo vi /etc/profile
在文件结尾处添加如下内容:
# Set Hadoop 0.20.2
export HADOOP_HOME="/tools/hadoop-0.20.2" # 红字部分需要改为你的 Hadoop 安装路径。
export HADOOP_DEV_HOME="${HADOOP_HOME}"
export HADOOP_CONF_DIR="${HADOOP_HOME}/conf"
# Set Path
export PATH="${JAVA_HOME}/bin:${JRE_HOME}/bin:${HADOOP_HOME}/bin:${PATH}
# 在 2.1.2 JDK 环境变量的配置基础上加上红字部分。
配置完成后执行 sudo source /etc/profile ,使环境变量设置生效。
三、 Hadoop 配置
3.1、默认端口信息
50030 mapred.job.tracker.http.address
描述:JobTracker administrative web GUI JOBTRACKER的HTTP 服务器和端口
50070 dfs.http.address
描述:NameNode administrative web GUI NAMENODE的HTTP服务器和端口
50010 dfs.datanode.address
描述:DataNode control port (each DataNode listens on this port and registers it with the NameNode on startup) DATANODE控制端口,主要用于DATANODE初始化时向NAMENODE提出注册和应答请求
50020 dfs.datanode.ipc.address
描述:DataNode IPC port, used for block transfer DATANODE的RPC服务器地址和端口
50060 mapred.task.tracker.http.address
描述:Per TaskTracker web interface TASKTRACKER的HTTP服务器和端口
50075 dfs.datanode.http.address
描述:Per DataNode web interface DATANODE的HTTP服务器和端口
50090 dfs.secondary.http.address
描述:Per secondary NameNode web interface 辅助DATANODE的HTTP服务器和端口
3.2、建立相关文件夹
我的 Hadoop 根目录:/tools/hadoop/workspace/
mkdir /tools/hadoop/workspace/temp
mkdir /tools/hadoop/workspace/dfs
mkdir /tools/hadoop/workspace/dfs/name
mkdir /tools/hadoop/workspace/dfs/data
mkdir /tools/hadoop/workspace/mapred
mkdir /tools/hadoop/workspace/mapred/local
mkdir /tools/hadoop/workspace/mapred/system
java 程序使用的文件夹:
mkdir /tools/hadoop/workspace/java
3.3、修改配置文件
3.3.1、hadoop-env.sh
cd /tools/hadoop/hadoop-0.20.2/conf
vi hadoop-env.sh
最后一行加入:export JAVA_HOME=/tools/jdk1.7.0_05
# 红字部分替换为你的jdk安装路径。
3.3.2、core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://ubuntu00:9000</value>
<description>NameNode 的主机名:端口号。</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tools/hadoop/workspace/temp</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/tools/hadoop/workspace/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/tools/hadoop/workspace/dfs/data</value>
</property>
</configuration>
3.3.3、hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.http.address</name>
<value>ubuntu00:50070</value>
</property>
</configuration>
3.3.4、mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>ubuntu00:9001</value>
</property>
<property>
<name>mapred.job.tracker.http.address</name>
<value>ubuntu00:50030</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/tools/hadoop/workspace/mapred/local</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>/tools/hadoop/workspace/mapred/system</value>
</property>
</configuration>
3.4、运行及测试页面
start-all.sh:启动所有的Hadoop 守护进程,包括NameNode、DataNode、SecondaryNameNode、JobTracker和Tasktrack。
或
start-dfs.sh:启动Hadoop DFS守护进程,包括NameNode、DataNode和SecondaryNameNode。
start-mapred.sh:启动Hadoop Map/Reduce守护进程,包括JobTracker和Tasktrack。
Hadoop 开启后,先查看安全模式的状态:
hadoop dfsadmin -safemode get
如果是开启状态则执行下面命令关闭:
hadoop dfsadmin -safemode leave
或等待自动关闭也可以。
打开 Hadoop http 页面,查看 Hadoop 运行状态。
http://IP 地址:端口,在 hdfs-site.xml 配置文件中dfs.http.address 的值,如果直接用主机名,请确保你的访问机能 ping 通 dfs 主机名(ubuntu00 等)。
如:http://192.168.1.130:50070
http://IP 地址:端口,在 mapred-site.xml 配置文件中 mapred.job.tracker.http.address 的值。
如:http://192.168.1.130:50030
可能一开始打开会很慢,或者 Nodes、Live Nodes 显示为 0 ,稍等一会(10分钟之内),如果还是为 0,则查看对应的日志,在 ${HADOOP_HOME}/logs 下。
四、 Hadoop-HDFS 测试
本节介绍使用 Java 代码测试 Hadoop HDFS 。
4.1 创建测试用的 Hadoop 目录
hadoop dfs -mkdir /test
hadoop dfs -mkdir /input
4.2 创建两个(或多个)任意内容的文件
vi /tools/hadoop/workspace/1.txt
vi /tools/hadoop/workspace/2.txt
4.3 拷贝文件到 Hadoop 中:
hadoop dfs -copyFromLocal /tools/hadoop/workspace/1.txt /input/
hadoop dfs -copyFromLocal /tools/hadoop/workspace/2.txt /test/
4.4 查看在 Hadoop 中的这两个文件:
hadoop dfs -cat /input/1.txt
hadoop dfs -cat /test/2.txt
4.5 编写 Java 类
我这里类名叫 "DirStatus" ,文件名叫 " DirStatus.java"。
vi DirStatus.java
文件内容如下:
import java.util.*;
import java.net.URI;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.conf.Configuration;
public class DirStatus {
public static void main (String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
Path[] paths = new Path[args.length];
for (int i = 0, length = paths.length; i < length; i++) {
paths[i] = new Path(args[i]);
System.out.println("Directory argument[" + i + "]='" + args[i] + "'");
}
FileStatus[] status = fs.listStatus(paths);
Path[] listedPaths = FileUtil.stat2Paths(status);
for (Path p : listedPaths) {
System.out.println(p);
}
}
}
4.6 编译 Java 类
javac -classpath ${HADOOP_HOME}/hadoop-0.20.2-core.jar:${HADOOP_HOME}/lib/commons-logging-1.0.4.jar DirStatus.java
4.7 执行 Java 程序
java -classpath ${HADOOP_HOME}/hadoop-0.20.2-core.jar:${HADOOP_HOME}/lib/commons-logging-1.0.4.jar: DirStatus "hdfs://ubuntu00:9000/input" "hdfs://ubuntu00:9000/test" "hdfs://ubuntu00:9000/"
注:-classpath 命令选项值最后的:不能省略,否则报 "Error: Could not find or load main class DirStatus" 异常。
执行结果如下:
五、 Hadoop-MapReduce 测试
本节介绍使用 hadoop 自带的例子 hadoop-0.20.2-examples.jar 测试MapReduce 。
5.1 创建 hadoop 输入目录
hadoop dfs -mkdir /input
5.2 创建计算时需要的文件
1) 编辑 file1.txt
vi file1.txt
文件内容如下:
hello world
hello hadoop
2) 编辑 file2.txt
vi file2.txt
文件内容如下:
hello mapreduce
hadoop world
hadoop is running
The world is ours
5.3 上传文件到 Hadoop 输入目录
hadoop dfs -put file1.txt file2.txt /input
5.4 执行 jar
hadoop jar ${HADOOP_HOME}/hadoop-0.20.2-examples.jar wordcount /input /output
注:输出目录 "/output" 必须不存在,否则会报错。
显示以下内容即为成功:
在 http://192.168.1.130:50030 中的 " Running Jobs" 下显示正在执行的任务。
如果执行成功,在 http://192.168.1.130:50030 中的 "Completed Jobs" 下显示已执行的任务表格,点击 "Jobid" 列中的值可以查看任务的详细信息。
"http://192.168.1.130:50030" 需要根据你的配置更改。
5.5 查看结果
hadoop dfs -cat /output/part-r-00000
或先查看 "/output" 目录下存在哪些文件
hadoop dfs -ls /output
注:"/output" 是 5.4 中输入的最后一个参数:输出目录。
结果内容如下:
六、 Java 的操作
6.1 编译 Java 文件
javac -classpath ${HADOOP_HOME}/hadoop-0.20.2-core.jar:${HADOOP_HOME}/lib/commons-cli-1.2.jar -d wordcount WordCount.java
其中:"-classpath" 命令选项后面的值是你的类所需要的包;"-d" 命令选项后面的值是编译后的文件存放路径,路径必须存在。
6.2 归档成 jar 文件
jar -cvf wordcount.jar -C wordcount/ .
注:"/ ." 不能删改!
6.3 Hadoop 执行 jar 归档文件
hadoop jar ${HADOOP_HOME}/hadoop-0.20.2-examples.jar wordcount /input /output
其中:"${HADOOP_HOME}/hadoop-0.20.2-examples.jar "为要执行的 jar 归档文件;"worcount" 为要执行的主函数所在类的类名;"/input" 、"/output" 为类的参数,分别代表输入路径及输出路径。