在 Linux 服务器上搭建和配置 Hadoop 集群
实验条件:3台centos服务器,jdk版本1.8.0,Hadoop 版本2.8.0
注:hadoop安装和搭建过程中都是在用户lb的home目录下,master的主机名为host98,slave的主机名分别是host99和host101。
1. ssh远程连接服务器
ssh [username]@hostname
2. 创建新用户并创建用户的home主目录
useradd -d /home/lb lb -m
3. 将当前用户加入sudo用户组中,方便在不修改当前用户组权限的情况下,对某些文件和目录做修改
vi /etc/sudoers
在 root ALL = (ALL) ALL 下添加一行 lb ALL = (ALL) ALL
4. 下载jdk并配置环境变量
1. 用sudo权限创建存放目录
sudo mkdir /etc/java
2. 用curl命令从官网下载最新的jdk
curl -L "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz" -H "Cookie: oraclelicense=accept-securebackup-cookie" -H "Connection: keep-alive" -O
从浏览器上得到的下载链接并不是最终的压缩包位置,在这其中经过了3次重定向,所有使用-L参数可以自动对链接进行重定向,第一个-H命令传递了同意证书的cookie,第二个-H命令保持连接的稳定,否则下载速度可能很慢。-O命令才能下载文件,否则只是将内容输出到控制台。
3. 将压缩包解压到当前目录下
sudo tar -zxvf jdk-8u131-linux-x64.tar.gz
4. 配置环境变量
#set Java Environment
export JAVA_HOME=/usr/java/jdk1.8.0
export CLASSPATH=".:$JAVA_HOME/lib:$CLASSPATH"
export PATH="$JAVA_HOME/bin:$PATH"
export JRE_HOME=$JAVA_HOME/jre
修改完成后,在命令行执行source /etc/profile命令使文件生效。使用java -version可察看当前java版本。
5. 手动设置系统默认JDK(不知是否必要)
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk/bin/javac 300
sudo update-alternatives --config java
5. 在CentOS上安装openssh服务并配置免密钥登陆
1. 安装openssh服务
yum install openssh
yum install openssh-server
yum install openssh-clients
对应的删除命令将install改为remove。
2. 修改 sshd_config 配置文件
vi /etc/ssh/sshd_config 启用以下三行
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile
保存并退出,使用 service sshd start 启用ssh服务。
3. 设置当前用户免密钥登陆
进入用户主目录应该存在 .ssh 子目录,否则创建。
执行 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa 在 ~/.ssh 子目录下生成公钥和私钥文件。ssh-keygen 代表生成密钥;-t 表示指定生成的密钥类型,rsa 和 dsa 均可;-P 用于提供密语,为空;-f 指定生成的密钥文件。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 将用于认证的公钥加到保存的公钥文件中,密钥和公钥就像是钥匙和锁的关系,公钥加入到在被连接的主机的authorized_keys文件中,私钥自己保存。
注意修改 authorized_keys 文件和 .ssh 子目录的访问权限,很重要!
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
完成以上操作后就可以通过 ssh localhost 完成本机的无密钥访问。
6. 安装并配置hadoop
1. 下载并解压hadoop
通过 http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz 在本机上下载hadoop压缩文件后,使用scp命令进行远程拷贝到服务器。
scp /Users/hope/Downloads/hadoop-2.8.0.tar.gz lb@10.3.242.98:/home/lb
将本地路径下的 hadoop-2.8.0.tar.gz 拷贝到远程服务器 [[用户名 @ ] 主机地址 : 路径
tar -zxvf hadoop-2.8.0.tar.gz 进行解压
2. 伪分布 Hadoop 配置
可以把伪分布式的Hadoop看作是只有一个节点的集群,在这个集群中,这个节点既是Master,也是Slave;既是Namenode,也是DataNode;既是JobTracker,也是TaskTracker。
需要修改hadoop安装目录下 ./etc/hadoop 中的配置文件。
1. 指定 jdk 的安装位置
修改 hadoop-env.sh 文件,加上 export JAVA_HOME=/usr/java/java1.8.0 为jdk的安装路径。
2. 配置 HDFS 的地址及端口号
修改 hadoop 核心的配置文件 core-site.xml :
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
上述配置增加了property,这样就可以通过指定的web访问hdfs的地址。
3. 配置 HDFS 的具体属性
修改 hdfs-site.xml 文件:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
原本每个数据块默认的备份数为3,在单机版的hadoop中,需要将其改为1。
4. 配置 MapReduce 的相关信息
修改 mapred-site.xml 文件:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
5. 格式化 hadoop 的文件系统 HDFS
进入 hadoop 安装目录下的二进制可执行文件夹,执行格式化文件
bin/hadoop namenode -format
返回结果如上图所示,Exiting with status 0 表示格式化成功,如果是1的话代表存在错误。倒数第五行也有说 successfully formatted 。
6. 启动 NameNode 和 DataNode
跟启动有关的可执行二进制文件都在hadoop安装目录的sbin子目录下。
sbin/hadoop-daemon.sh start namenode 用于启动namenode
sbin/hadoop-daemon.sh start datanode 用于启动datanode
用 jps 命令可以察看这两种进程的启动情况。
然后就可以用 Web 浏览器察看dfs的情况了,默认端口是50070。如果是本机访问,就是 http://localhost:50070;如果通过公网访问,就是 http://ip地址:50070。
7. 启动 hadoop
sbin/start-all.sh 命令可用于启动整个hadoop服务
3. hadoop 集群的配置
1. hadoop 集群的配置至少需要三台 Linux 服务器,首先给集群中的每台机器分配角色
10.3.242.98-master, namenode, jobtracker-host98(主机名)
10.3.242.99-slave, datanode, tasktracker-host99(主机名)
10.3.242.103-slave, datanode, tasktracker-host101(主机名)
2. 在三台主机上创建相同的用户 lb (这是 hadoop 的基本要求),普通用户即可,加入 sudoer 用户组
3. 安装 jdk ,配置环境变量
4. 修改 /etc/hosts 文件,用于定义局域网内主机名与IP地址的映射关系,可以通过主机名进行远程连接
127.0.0.1 localhost
10.3.242.98 host98
10.3.242.99 host99
10.3.242.101 host101
5. 安装ssh,配置不用主机间的免密钥登陆
在重新安装ssh后,一定要记得修改/etc/ssh/sshd_config文件,使用service sshd start命令启动服务。否则中断当前连接后可能无法使用ssh重新连接服务器。
比如要从host98主机免密钥登陆host99,就将host98主机生成的公钥加入到host99的authorized_keys文件中:
scp lb@host98:~/.ssh/is_rsa.pub lb@host99:~/.ssh/host99_rsa.pub
在host98主机下, cat ~/.ssh/host99_rsa.pub >> ~/.ssh/authorized_keys 即可。
对三台主机两两执行上述操作,使得每两台主机间都可以实现免密钥登陆。因为有可能 jobtracker 不是 master。
6. 配置三台主机的hadoop配置文件
1. etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0 加上java的环境变量
2. etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://host98:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp</value>
</property>
</configuration>
第一个资源声明的是访问hdfs的web浏览器地址,host98是master主机名,也可以用ip地址替换。
第二个资源声明的是在格式化分布式文件系统时所产生的临时文件的存储地址,有时不能重新格式化文件系统是因为临时文件夹下有同名文件,需要将文件夹清空后才可以正常格式化。(通过报错信息可以知道)
3. etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
声明数据块的备份个数
4. etc/hadoop/mapred.site.xml.template
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>host98:9001</value>
</property>
</configurantion>
声明jobtracker节点,为master主机host98,端口为9001
5. etc/hadoop/slaves
在slaves文件中添加作为slave的主机名
host99
host101
7. 启动hadoop服务(均是在主机host98执行命令,会自动调用slave节点完成相应操作)
1. 格式化hdfs系统
bin/hadoop namenode -format
会完成hdfs文件系统的格式化,在临时文件的文件夹下会生成很多临时文件,在下一次格式化之前,一定要把这些临时文件夹清空,否则会格式化失败。
2. 启动dfs服务
sbin/start-dfs.sh
会在master主机运行namenode进程,在所有的datanode节点运行datanode进程。
在启动服务的过程中,出现了部分slave节点没有运行datanode进程的情况,在slave节点单独开启datanode服务会出现问题的反馈,原因是由于其他进程占用了50010端口。解决的方式有两种:1. 结束原本占用50010端口的进程;2. 更改datanode的端口。
使用 netstat -a -t --numeric-ports -p 命令察看正在占用50010端口的进程号,使用kill 进程号杀死该进程后重新启动dfs服务,所有的slave节点都启动了datanode进程。
3. 启动yarn服务
sbin/start-yarn.sh
新版的hadoop2.*不存在 jobtracker 进程和 tasktarcker 进程,取而代之的是 sourcemanager 和 nodemanager。
在这个过程中出现了slave节点成功运行 nodemanager 进程,但是master节点没有运行 sourcemanager 进程,出现问题的原因不会在终端界面显示,需要自己去察看 logs 子目录中的日志记录。显示如下:
NodeStatusUpdaterImpl failed in state STARTED; cause: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.ConnectException: Call From host99/10.3.242.99 to 0.0.0.0:8031 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
可以看到问题与之前的一样,是8031端口被占用,使用同样的方法查找占用8031端口的进程号后杀死进程,重新启动服务后成功。
4. 成功的标识
host98主机(master):
[lb@host98 ~]$jps
5904 ResourceManager
21028 SecondaryNameNode
20743 NameNode
1225 Jps
host99和host101主机(slave):
[lb@host99 ~]$jps
11316 Jps
12568 DataNode
11117 NodeManager
至此,在服务器上从 添加用户 到 安装jdk并配置环境变量 到 安装并配置ssh免密钥登陆 到 安装配置hadoop单机模式、伪分布模式和集群模式的所有过程 均已有所呈现。