伪分布式:在一台机器上模拟出分布式环境
1 安装 VMware 或 VirtualBox
笔者很早就安装了 VMware 11
2 安装 CentOS
笔者从网上直接找了“VMware 专用 CentOS”,版本是 6.4,解压后直接用 VMware 打开即可
虚拟机的网络连接方式参见文章《Linux学习笔记(一)——Linux安装》第 5 小节,笔者在此使用的是 host-only 仅主机方式:
- 将宿主机的 VMware Network Adapter VMnet1 的 IPv4 设置为 192.168.80.1
- 在虚拟机中添加适配器,选择“Wired”,在 Wired 选项卡中勾选“Available to all users”,在 IPv4 Settings 选项卡中将 Address 设置为 192.168.80.100,将 Netmask 设置为 255.255.255.0,将 Gateway 设置为192.168.80.1,其他设置默认即可
- 在虚拟机中执行命令
service network restart
,重启网卡,使上面的配置立即生效 - 在虚拟机中执行命令
ifconfig
,查看配置是否生效
3 使用 PieTTY 修改主机名
3.1 修改主机名
打开绿色软件 PieTTY
- 在 Host Name (or IP address) 中输入虚拟机的 IP 地址(在本文中即 192.168.80.100),其他配置默认,点击 Open,输入用户名 root 和其密码
- 执行命令
hostname
查看主机名,笔者查到的主机名为“localhost.localdomain” - 临时修改主机名:执行命令
1
2
3
4
5[root@localhost ~]# hostname
localhost.localdomain
[root@localhost ~]# hostname hadoop
[root@localhost ~]# hostname
hadoophostname 主机名
,笔者所用的主机名为 Hadoop,配置后再次用hostname
命令查看,发现主机名已经更改成功。但是此时修改的主机名只对当前会话有效,关闭或重启电脑后此设置不被保存,主机名还会恢复为原来的名字 - 永久性修改主机名:
打开配置文件:修改主机名:将“HOSTNAME=”后面的内容改为新主机名(在本文中为“hadoop”),输入1
[root@localhost ~]# vi /etc/sysconfig/network
:wq
保存退出
3.2 将主机名与 IP 地址绑定
新修改的主机名是没有和 IP 地址绑定的(执行命令ping hadoop
不通)
打开配置文件:
1 | [root@localhost ~]# vi /etc/hosts |
绑定主机名与 IP:在文件中添加一行“192.168.80.100 hadoop”,输入:wq
保存退出
3.3 关闭防火墙
- 查看虚拟机防火墙:
1
[root@localhost ~]# service iptables status
- 关闭防火墙:
1
[root@localhost ~]# service iptables stop
- 关闭后再次查看防火墙,显示“iptables: Firewall is not running.”
- 查看再次开启电脑时防火墙是否会自动重启:如果发现出现“on”,说明在相应级别会自动启动
1
[root@localhost ~]# chkconfig --list | grep iptables
- 关闭 iptables 的自动启动功能
1
[root@localhost ~]# chkconfig iptables off
- 再次查看防火墙是否会自动启动,发现各级别均为“off”
3.4 SSH(secure shell)的免密码登录
如果要访问对方的服务器,需要知道对方的账号和密码
SSH 加密访问对方的服务器的流程大概是(假如有 A、B 两台机器):
- A 产生一对公钥和私钥,并把公钥复制到 B 那边
- 通信的时候,A 再次连接 B,B 会发来一个字符串,A 将该字符串用自己的私钥加密,然后将加密后的字符串返回给 B
- B 用 A 的公钥将字符串再次加密
- 用算法比对加密后的字符串是否一致,如果不一致,则判断连接不可信;反之则可信
3.4.1 产生密钥
执行命令ssh-keygen -t rsa
产生密钥
注:ssh-keygen
产生密钥,-t rsa
说明加密算法为 RSA
产生的密钥位于~/.ssh
文件夹中(~
为当前家目录,由于笔者使用 root 账号,所以即为/root
目录)
1 | [root@hadoop ~]# cd .ssh |
3.4.2 验证
当把公钥发给对方后,对方会存储在~/.ssh/authorized_keys
文件中(在进行通信验证的时候,会读取authorized_keys
文件)
由于笔者此时只有一台虚拟机,所以只能自己访问自己了。。。
1 | [root@localhost .ssh]# cp id_rsa.pub authorized_keys |
验证:执行命令ssh localhost
1 | [root@hadoop .ssh]# ssh localhost |
4 用 WinSCP 安装 JDK
- 为了传输文件,笔者首先安装了 WinSCP
- 安装完毕打开后,在“主机名”填写 IP 地址(192.168.80.100),“用户名”填写“root”,然后填写密码(本文为 hadoop)
- 登录后将宿主机 Windows 下的文件“jdk-6u24-linux-i586.bin”和“hadoop-1.1.2.tar.gz”从左边拖放到右边希望存放文件的文件夹(笔者选择的是
/root/Downloads
) - 在虚拟机下查看
1
2
3[root@hadoop ~]# cd /root/Downloads/
[root@hadoop Downloads]# ls
hadoop-1.1.2.tar.gz jdk-6u24-linux-i586.bin - 将安装包复制到安装目录下
1
2
3
4
5
6
7
8[root@hadoop Downloads]# cd /usr/local/
[root@hadoop local]# ls
bin etc games include lib libexec sbin share src
[root@hadoop local]# rm -rf * 将目录下的所有文件都删除(选项 r 代表递归,选项 f 表示不用确认,* 代表所有文件)
[root@hadoop local]# ls
[root@hadoop local]# cp /root/Downloads/* . . 代表当前目录
[root@hadoop local]# ls
hadoop-1.1.2.tar.gz jdk-6u24-linux-i586.bin - 解压 JDK 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@hadoop local]# ./jdk-6u24-linux-i586.bin 解压 JDK 文件
-bash: ./jdk-6u24-linux-i586.bin: Permission denied 发现权限不够
[root@hadoop local]# ls -l 查看权限,发现没有执行权限
total 143420
-rw-r--r--. 1 root root 61927560 Nov 19 01:20 hadoop-1.1.2.tar.gz
-rw-r--r--. 1 root root 84927175 Nov 19 01:20 jdk-6u24-linux-i586.bin
[root@hadoop local]# chmod u+x jdk-6u24-linux-i586.bin
[root@hadoop local]# ls -l
total 143420
-rw-r--r--. 1 root root 61927560 Nov 19 01:20 hadoop-1.1.2.tar.gz
-rwxr--r--. 1 root root 84927175 Nov 19 01:20 jdk-6u24-linux-i586.bin
[root@hadoop local]# ./jdk-6u24-linux-i586.bin 再次解压
··· 解压过程省略
[root@hadoop local]# ls
hadoop-1.1.2.tar.gz jdk1.6.0_24 jdk-6u24-linux-i586.bin
[root@hadoop local]# mv jdk1.6.0_24 jdk 将 jdk1.6.0_24 重命名(不是必须的) - 配置环境变量
打开配置文件在文件中添加两行:1
[root@hadoop local]# vi /etc/profile
如下图所示(一定看清楚是1
2export JAVA_HOME=/usr/local/jdk
export PATH=.:$JAVA_HOME/bin:$PATH/usr
而不是/user
,笔者找了好久才发现错误):
让配置立即生效查看是否安装成功:1
[root@hadoop local]# source /etc/profile
1
2
3
4[root@hadoop ~]# java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)
5 安装 Hadoop
- 解压压缩包
1
2
3
4
5
6
7
8[root@hadoop ~]# cd /usr/local/
[root@hadoop local]# ls
hadoop-1.1.2.tar.gz jdk jdk-6u24-linux-i586.bin
[root@hadoop local]# tar -zxvf hadoop-1.1.2.tar.gz
··· 解压过程省略
[root@hadoop local]# ls
hadoop-1.1.2 hadoop-1.1.2.tar.gz jdk jdk-6u24-linux-i586.bin
[root@hadoop local]# mv hadoop-1.1.2 hadoop 将 hadoop-1.1.2 重命名(不是必须的) - 配置环境变量
打开配置文件在文件中添加一行:1
[root@hadoop local]# vi /etc/profile
在“PATH”变量中添加1
export HADOOP_HOME=/usr/local/hadoop
:$HADOOP_HOME/bin
如下图所示:
让配置立即生效1
[root@hadoop local]# source /etc/profile
- 修改位于
$HADOOP_HOME/conf
目录下的 Hadoop 配置文件
需要修改的 4 个配置文件分别是:hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml
为了避免麻烦,用 WinSCP 打开/usr/local/hadoop/conf
,选择文件后编辑- hadoop-env.sh
将第 9 行# export JAVA_HOME=/usr/lib/j2sdk1.5-sun
前面的#
去掉,将值改为上文中配置的值**/usr/local/jdk
**,保存
如下图所示: - core-site.xml
将文件中改为:1
2
3<configuration>
</configuration>如下图所示:1
2
3
4
5
6
7
8
9
10
11<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop:9000</value>
<description>change your own hostname</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
其中第 4 行name
标签下hadoop
为主机名- hdfs-site.xml
将文件中改为:1
2
3<configuration>
</configuration>1
2
3
4
5
6
7
8
9
10<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
- hdfs-site.xml
- mapred-site.xml
将文件中改为:1
2
3<configuration>
</configuration>其中第 4 行1
2
3
4
5
6
7<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadoop:9001</value>
<description>change your own hostname</description>
</property>
</configuration>value
标签下hadoop
为主机名
- hadoop-env.sh
6 对 Hadoop 进行格式化
执行命令:
1 | [root@hadoop local]# hadoop namenode -format |
注意:多次格式化 Hadoop 会导致一些错误,解决方法是删除/usr/local/hadoop/tmp
文件夹,然后再次重新格式化
7 启动 Hadoop
执行命令:
1 | [root@hadoop local]# start-all.sh |
查看 Java 进程,发现除 JPS 外还有 5 个 Java 进程,分别是NameNode、DataNode、SecondaryNameNode、JobTracker、TaskTracker:
1 | [root@hadoop local]# jps |
还可以在浏览器上访问hadoop:50070
,如下图所示:
这也说明 NameNode 本身是个 Web Server
访问hadoop:50030
,发现 Map/Reduce 在运行,说明进程 JobTracker 在运行
其实如果在宿主机 Windows 下,在C:\Windows\System32\drivers\etc\hosts
中增加一行192.168.80.100 hadoop
,将主机名和 IP 地址绑定后,在 Windows 浏览器中也可访问
到这里 Hadoop 伪分布式平台搭建就完成了 :)
8 去除 Hadoop 启动过程中的警告信息
在执行start-all.sh
命令的时候发现有警告信息:
1 | [root@hadoop local]# start-all.sh |
先将 Hadoop 关闭:
1 | [root@hadoop local]# stop-all.sh |
由于是命令start-all.sh
报的错,所以先去看一下这个 shell 脚本文件
1 | [root@hadoop local]# cd hadoop/bin/ |
发现代码中有一段是这么写的:
这段代码的大概意思就是:如果$bin/../libexec/hadoop-config.sh
这个文件存在(-e
表示存在),则执行这个文件,如果不存在,则执行$bin/hadoop-config.sh
这个文件
然而事实是$bin/../libexec/hadoop-config.sh
这个文件是不存在的,所以我们就继续去看文件$bin/hadoop-config.sh
:
1 | [root@hadoop bin]# ls |
然后在最后一页发现了端倪 =_=:
由于HADOOP_HOME
刚刚设置过,显然不为空,所以HADOOP_HOME_WARN_SUPPRESS
应该是空的,所以就去给它赋个值,让它不为空 :)
1 | [root@hadoop bin]# vi /etc/proflie |
增加一行:export HADOOP_HOME_WARN_SUPPRESS=1
(等于什么都可以),然后保存退出
然后执行命令source /etc/profile
再次启动,发现没有警告信息了
9 配置回收站
Hadoop 默认 Trash(回收站)的保留时间是 0,即不保留,所以需要在core-site.xml里增加如下配置:
1 | <property> |
10080 = 60 * 24 * 7
所以以上配置是保留 7 天