Hadoop集群安装配置(完全分布式)(step by step) | 张恒镭的博客

Hadoop集群安装配置(完全分布式)(step by step)

时间:13-11-27 栏目:hadoop 作者:恒镭, 张 评论:0 点击: 3,096 次

要学习hadoop,第一个最重要的就是搭建Hadoop的集群。本文将带领大家step by step的安装配置一个4个节点的Hadoop集群。(所需要的软件我会提供在百度网盘供大家下载见本文最后的附录)

官方安装文档地址:官方地址:(http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.html)

  1. 集群环境

采用 4 台安装 Linux 环境的机器来构建一个小规模的分布式集群。

通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode作为TaskTracker。

本文NameNode和JobTracker 都放在一台机器 上。

 

集群网络拓扑如下图:

image

集群机器详细信息

操作系统:Ubuntu(推荐12.04 64位)
部署:Vmvare
在vmvare安装好一台Ubuntu虚拟机后,可以导出或者克隆出另外三台虚拟机。
说明:
保证虚拟机的ip和主机的ip在同一个ip段,这样几个虚拟机和主机之间可以相互通信。
为了保证虚拟机的ip和主机的ip在同一个ip段,虚拟机连接设置为桥连。

准备机器:一台master,若干台slave,配置每台机器的/etc/hosts保证各台机器之间通过机器名可以互访,例如:
192.168.50.10 node1(master)
192.168.50.11 node2 (slave1)
192.168.50.12 node3 (slave2)

192.168.50.13 node4 (slave3)
主机信息:

机器名
IP地址
作用

node1
192.168.50.10
NameNode、JobTracker

node2
192.168.50.11
DataNode、TaskTracker

node3
192.168.50.12
DataNode、TaskTracker

node4
192.168.50.13

DataNode、TaskTracker

 

对于vmware 如何配置 简单的方法是采用内部网络,选择host-only 或者自定义。

不建议使用DHCP分配地址,因为每次开虚拟机可能地址会变化。(其实也可以,在/etc/hosts 里指定好主机名就可以)

给虚拟机分配静态ip 最安全了。

image

网络拓扑配置好的要求是:这几台机器能互相ping通。

 

2、安装好JDK和ssh

JDK版本要求大于1.6  

安装jdk 去官网下载linux版本jdk,或者使用我附录提供的jdk1.7.解压到/usr/java/ 目录下即可。

配置环境变量

在"/etc/profile"文件的尾部添加以下内容:
# set java environment
export JAVA_HOME=/usr/java/jdk1.6.0_25
export JRE_HOME=/usr/java/jdk1.6.0_25/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
使配置生效
保存并退出,执行下面命令使其配置立即生效。
source /etc/profile

 

ssh 必须安装。

安装ssh:

sudo apt-get install ssh

这个安装完后,可以直接使用ssh命令 了。
执行$ netstat -nat 查看22端口是否开启了。
测试:ssh localhost。
输入当前用户的密码,回车就ok了。说明安装成功,同时ssh登录需要密码。
(这种默认安装方式完后,默认配置文件是在/etc/ssh/目录下。sshd配置文件是:/etc/ssh/sshd_config)。

 

重要的一步 关闭防火墙:

在命令行执行:sudo ufw disable

 

3、创建账户:

建议不要使用系统本身的账户,您应该为hadoop创建一个账户。 我默认都创建的是hadoop。

命令:$ adduser hadoop  不要使用useradd

 

为了hadoop能使用sudo。

参考下文

hadoop is not in the sudoers file. This incident will be reported
这是我在红旗linux6.0下用sudo时遇到的问题,解决方法如下:
    1>、进入超级用户模式。也就是输入"su -",系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。(当然,你也可以直接用root用户登录,因为红旗安装过后默认的登录用户就是root)
    2>、添加文件的写权限。也就是输入命令"chmod u+w /etc/sudoers"。
    3>、编辑/etc/sudoers文件。也就是输入命令"vim /etc/sudoers",输入"i"进入编辑模式,找到这一 行:"root ALL=(ALL) ALL"在起下面添加"xxx ALL=(ALL) ALL"(这里的xxx是你的用户名),然后保存(就是先摁一 下Esc键,然后输入":wq")退出。
    4>、撤销文件的写权限。也就是输入命令"chmod u-w /etc/sudoers"。
    至此,问题解决。

检查主机名:

$hostname

假定我们发现我们的机器的主机名不是我们想要的,通过对"/etc/hostname"
文件修改其中"HOSTNAME"后面的值,改成我们规划的名称。
在 Ubuntu 系统中永久修改主机名也比较简单。主机名存放在/etc/hostname
文件中,修改主机名时,编辑 hostname 文件,在文件中输入新的主机名并保存
该文件即可。重启系统后,参照上面介绍的快速查看主机名的办法来确认主机名
有没有修改成功。

host 文件配置

"/etc/hosts"这个文件是用来配置主机将用的 DNS 服务器信息,是记载 LAN
内接续的各主机的对应[HostName 和 IP]用的。当用户在进行网络连接时,首先
查找该文件,寻找对应主机名(或域名)对应的 IP 地址。
我们要测试两台机器之间知否连通,一般用"ping  机器的 IP",如果想用"ping

机器的主机名"发现找不见该名称的机器,解决的办法就是修改"/etc/hosts"这个
文件,通过把 LAN 内的各主机的 IP 地址和 HostName 的一一对应写入这个文件
的时候,就可以解决问题。修改内容如下:

$ cat /etc/hosts

在里面增加 192.168.50.1 node1 node1  ……把所有的都添加进去。

4、配置 SSH 无密码登录

配置

在Hadoop启动以后,Namenode是通过SSH(Secure Shell)来启动和停止各个datanode上的各种守护进程的,这就须要在节点之间执行指令的时候是不须要输入密码的形式,故我们须要配置SSH运用无密码公钥认证的形式。
以本文中的四台机器为例,现在node1是主节点,他须要连接node2和node3,node4。须要确定每台机器上都安装了ssh,并且datanode机器上sshd服务已经启动。

( 说明:hadoop@hadoop~]$ ssh-keygen -t rsa
这个命令将为hadoop上的用户hadoop生成其密钥对,询问其保存路径时直接回车采用默认路径,当提示要为生成的密钥输入passphrase的时候,直接回车,也就是将其设定为空密码。生成的密钥对id_rsa,id_rsa.pub,默认存储在/home/hadoop/.ssh目录下然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/dbrg/.ssh/authorized_keys文件中,如果机器上已经有authorized_keys这个文件了,就在文件末尾加上id_rsa.pub中的内容,如果没有authorized_keys这个文件,直接复制过去就行.)

首先设置namenode的ssh为无需密码的、自动登录。

切换到hadoop用户( 保证用户hadoop可以无需密码登录,因为我们后面安装的hadoop属主是hadoop用户。)

$ su hadoop

cd /home/hadoop

$ ssh-keygen -t rsa

然后一直按回车
完成后,在home跟目录下会产生隐藏文件夹.ssh

$ cd .ssh

之后ls 查看文件

cp id_rsa.pub authorized_keys

测试:

$ssh localhost

或者:

$ ssh node1

第一次ssh会有提示信息:

The authenticity of host ‘node1 (10.64.56.76)’ can’t be established.
RSA key fingerprint is 03:e0:30:cb:6e:13:a8:70:c9:7e:cf:ff:33:2a:67:30.
Are you sure you want to continue connecting (yes/no)?

输入 yes 来继续。这会把该服务器添加到你的已知主机的列表中

发现链接成功,并且无需密码。

4 ) 复制authorized_keys到node2 和node3 node4上

为了保证node1可以无需密码自动登录到node2和node3,先在node2和node3上执行

$ su hadoop

cd /home/hadoop

$ ssh-keygen -t rsa

一路按回车.
然后回到node1,复制authorized_keys到node2 和node3

[hadoop@hadoop .ssh]$ scp authorized_keys node2:/home/hadoop/.ssh/

[hadoop@hadoop .ssh]$ scp authorized_keys node3:/home/hadoop/.ssh/

这里会提示输入密码,输入hadoop账号密码就可以了。
改动你的 authorized_keys 文件的许可权限 (要做的)

[hadoop@hadoop .ssh]$chmod 644 authorized_keys

测试:ssh node2或者ssh node3(第一次需要输入yes)。
如果不须要输入密码则配置成功,如果还须要请检查上面的配置能不能正确。

 

配置所有 Slave 无密码登录 Master
和 Master 无密码登录所有 Slave 原理一样,就是把 Slave 的公钥追加到 Master
的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>) 。
操作之前,先把 namenode 的/etc/hosts 文件通过 scp 复制到各个 datanodede
的/home/hadoop/Downloads 文件夹下,然后登陆各个 namenode 使用 sudo cp 命
令覆盖 hosts 文件。

 

5、安装配置hadoop

 

安装Hadoop

#切换为hadoop用户

su hadoop

下载安装包后,直接解压安装即可:

$ tar xvfz hadoop-0.20.2-cdh3u6.tar.gz

1 ) 安装Hadoop集群通常要将安装软件解压到集群内的所有机器上。并且安装路径要一致,如果我们用HADOOP_HOME指代安装的根路径,通常,集群里的所有机器的
HADOOP_HOME路径相同。
2 ) 如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把配置好的软件即hadoop-0.20.2-cdh3u6整个文件夹拷贝到其他机器的相同位置即可。
3 ) 可以将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,同时根据每一个Slave的Java_HOME 的不同修改其hadoop-env.sh 。
4) 为了方便,使用hadoop命令或者start-all.sh等命令,修改Master上/etc/profile 新增以下内容:
export HADOOP_HOME=/home/hadoop/hadoop-0.20.2-cdh3u6

exportPATH=$PATH:$HADOOP_HOME/bin
修改完毕后,执行source /etc/profile 来使其生效。

 

配置conf/hadoop-env.sh文件(主要是java 环境配置)

配置conf/hadoop-env.sh文件
#添加

export JAVA_HOME=/usr/java/jdk1.7.0_40

这里修改为你的jdk的安装位置。

 

集群配置(所有节点相同)

3.1配置文件:conf/core-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>

1)fs.default.name是NameNode的URI。hdfs://主机名:端口/
2)hadoop.tmp.dir :Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。

这里用了/home/hadoop/hadoop_home/var 记得创建这个目录

3.2配置文件:conf/mapred-site.xml

<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>node1:49001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>/home/hadoop/hadoop_home/var</value>
</property>
</configuration>

1)mapred.job.tracker是JobTracker的主机(或者IP)和端口。主机:端口。

3.3配置文件:conf/hdfs-site.xml

<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name1, /home/hadoop/name2</value> #hadoop的name目录路径
<description> </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data1, /home/hadoop/data2</value>
<description> </description>
</property>
<property>
<name>dfs.replication</name>
<!-- 我们的集群有3个结点,所以rep3份 -->
<value>3</vaue>
</property>
</configuration>

1) dfs.name.dir是NameNode持久存储名字空间及事务日志的本地文件系统路径。 当这个值是一个逗号分割的目录列表时,nametable数据将会被复制到所有目录中做冗余备份。
2) dfs.data.dir是DataNode存放块数据的本地文件系统路径,逗号分割的列表。 当这个值是逗号分割的目录列表时,数据将被存储在所有目录下,通常分布在不同设备上。
3)dfs.replication是数据需要备份的数量,默认是3,如果此数大于集群的机器数会出错。

注意:此处的name1、name2、data1、data2目录不能预先创建,hadoop格式化时会自动创建,如果预先创建反而会有问题。

3.4配置masters和slaves主从结点

配置conf/masters和conf/slaves来设置主从结点,注意最好使用主机名,并且保证机器之间通过主机名可以互相访问,每个主机名一行。

vi masters:
输入:

node1

vi slaves: (注意这个文件 只能master 主机有,不能拷贝到slave机器)

输入:
node2
node3

配置结束,把配置好的hadoop文件夹拷贝到其他集群的机器中,并且保证上面的配置对于其他机器而言正确,例如:如果其他机器的Java安装路径不一样,要修改conf/hadoop-env.sh

$ scp -r /home/hadoop/hadoop-0.20.203 root@node2: /home/hadoop/

 

6、启动和测试

hadoop启动

4.1 格式化一个新的分布式文件系统

先格式化一个新的分布式文件系统

$ cd hadoop-0.20.203
$ bin/hadoop namenode -format
成功情况下系统输出:

12/02/06 00:46:50 INFO namenode.NameNode:STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.203.0
STARTUP_MSG: build =http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203-r 1099333; compiled by 'oom' on Wed May 4 07:57:50 PDT 2011
************************************************************/
12/02/0600:46:50 INFO namenode.FSNamesystem: fsOwner=root,root
12/02/06 00:46:50 INFO namenode.FSNamesystem:supergroup=supergroup
12/02/06 00:46:50 INFO namenode.FSNamesystem:isPermissionEnabled=true
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name1 has been successfully formatted.
12/02/06 00:46:50 INFO common.Storage: Imagefile of size 94 saved in 0 seconds.
12/02/06 00:46:50 INFO common.Storage: Storagedirectory /opt/hadoop/hadoopfs/name2 has been successfully formatted.
12/02/06 00:46:50 INFO namenode.NameNode:SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode atv-jiwan-ubuntu-0/127.0.0.1
************************************************************/

查看输出保证分布式文件系统格式化成功
执行完后可以到master机器上看到/home/hadoop//name1和/home/hadoop//name2两个目录。在主节点master上面启动hadoop,主节点会启动所有从节点的hadoop。

4.2 启动所有节点

启动方式1: 只需要在master机器上启动即可。

$ bin/start-all.sh (同时启动HDFS和Map/Reduce)
系统输出:

starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-ubuntu.out
node2: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node3: starting datanode, loggingto /usr/local/hadoop/logs/hadoop-hadoop-datanode-ubuntu.out
node1: starting secondarynamenode,logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-ubuntu.out
starting jobtracker, logging to/usr/local/hadoop/logs/hadoop-hadoop-jobtracker-ubuntu.out
node2: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
node3: starting tasktracker,logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-ubuntu.out
As you can see in slave's output above, it will automatically format it's storage directory(specified by dfs.data.dir) if it is not formattedalready. It will also create the directory if it does not exist yet.

执行完后可以到master(node1)和slave(node1,node2)机器上看到/home/hadoop/hadoopfs/data1和/home/hadoop/data2两个目录。

启动方式2

启动Hadoop集群需要启动HDFS集群和Map/Reduce集群。

在分配的NameNode上,运行下面的命令启动HDFS:
$ bin/start-dfs.sh(单独启动HDFS集群)

bin/start-dfs.sh脚本会参照NameNode上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动DataNode守护进程。

在分配的JobTracker上,运行下面的命令启动Map/Reduce:
$bin/start-mapred.sh (单独启动Map/Reduce)

bin/start-mapred.sh脚本会参照JobTracker上${HADOOP_CONF_DIR}/slaves文件的内容,在所有列出的slave上启动TaskTracker守护进程。

4.3 关闭所有节点

从主节点master关闭hadoop,主节点会关闭所有从节点的hadoop。

$ bin/stop-all.sh

Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).

${HADOOP_HOME}就是安装路径.

5 .测试

1)浏览NameNode和JobTracker的网络接口,它们的地址默认为:

NameNode - http://node1:50070/
JobTracker - http://node2:50030/

3) 使用netstat –nat查看端口49000和49001是否正在使用。

4) 使用jps查看进程

要想检查守护进程是否正在运行,可以使用 jps 命令(这是用于 JVM 进程的ps 实用程序)。这个命令列出 5 个守护进程及其进程标识符。

5)将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -mkdir input
$ bin/hadoop fs -put conf/core-site.xml input

声明: 本文由( 恒镭, 张 )原创编译,转载请保留链接: Hadoop集群安装配置(完全分布式)(step by step)

Hadoop集群安装配置(完全分布式)(step by step):等您坐沙发呢!

发表评论




------====== 本站公告 ======------
欢迎关注我的博客。

其他