欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注公众号:Java学习之道 Fork me on GitHub

hadoop集群搭建

 hadoop集群的搭建:

集群节点初始化:
主机节点(4个节点):
Master01:NN进程(NameNode)

Slave01:DN进程(DataNode)
Slave02:DN进程(DataNode)
Slave03:DN进程(DataNode)

一、虚拟机中操作(启动网卡)

sh /install/initNetwork.sh(执行初始化网卡的脚本)
ifup eth0 (启动网卡)
ifconfig -a(192.168.238.128)

配置网卡,一劳永逸,不需要每次重启都配置了,
(把'ifup eth0'输入到/etc/rc.d文件下的rc.local脚本文件中,
rc.local脚本就是每次重启都会自动加载的脚本文件):
echo 'ifup eth0'>>/etc/rc.d/rc.local

二、基础配置(主机名、IP配置、防火墙及selinux强制访问控制安全系统)

vi /etc/sysconfig/network (配置磁盘中主机名字)
vi /etc/hosts (配置映射,)
hostname 主机名 (修改内存中主机名)
然后,重新链接查看是否成功;

vi /etc/sysconfig/network-scripts/ifcfg-eth0
查看内容是否设置成功:cat /etc/sysconfig/network-scripts/ifcfg-eth0 

DEVICE=eth0 (设置需要重启的设备的名字)
TYPE=Ethernet(以太网)
ONBOOT=yes (设置为yes)
NM_CONTROLLED=yes
BOOTPROTO=static (设置为静态)
IPADDR=192.168.238.130 (本机IP地址)
NETMASK=255.255.255.0 (子网掩码)
GATEWAY=192.168.238.2 (网关)(查询本机网关:route -n)
DNS1=192.168.238.2 (需要和主机的dns一样,才能正常上外网)
DNS2=8.8.8.8    (谷歌IP地址)

vi /etc/sysconfig/selinux
修改:SELINUX=disabled
去掉注释查看selinux内容:
grep -Ev '^#|^$' /etc/sysconfig/selinux

永久关闭防火墙:
service iptables stop
chkconfig iptables off

三、配置ssh免密登录(为root用户配置免s密码登录)

只需要master登录到salve各个节点即可,无需反向
[root@master01 ~]# ssh-keygen -t rsa 创建公匙
[root@master01 ~]# ssh-copy-id slave02 拷贝公匙

 大数据学习交流群:217770236 

四、时间同步

rpm -qa|grep ntp(查看是否安装ntp)
yum install -y ntp(如没有安装执行该语句在线安装)
:set nonu(关闭行号)

主机: vi /etc/ntp.conf (35行的样子) 
server 127.127.1.0 # local clock
fudge 192.168.154.130 stratum 0
(stratum 时间层级,0等级最高;从机同步本机此值 必须比0大,即从机比本机低)

设置时间为当前时间:
date -s "14:20:50"

可屏蔽23-24行的内容,只查看local的状态:
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org


从机:server 192.168.25.130 # master01 clock
fudge 192.168.25.131 stratum 10 (slave01的ip)


自动同步时间(不稳定,不常用):
启动ntp服务:
service ntpd start
或者 /etc/init.d/ntpd start
默认启动的ntp服务使用端口123
lsof -i:123
查看详细状态:
ntpq -p(如果reach超过17则启动完成)
查看状态:
ntpstat(当有synchronized时,表示启动完成)
手动同步时间(常用):(slave01 ntp服务同步后需要关闭,因为其占用资源很大)
ntpdate master01(手动同步该机时间为master01的时间)

五、整体环境配置

su -lc "vi /etc/profile"
修改文件为:

JAVA_HOME=/software/jdk1.7.0_79
HADOOP_HOME=/software/hadoop-2.7.3
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/lib:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH JAVA_HOME HADOOP_HOME

source /etc/profile (使配置文件生效;source 与 . 等效)
. /etc/profile (使配置文件生效;source 与 . 等效)

六、hadoop安装及其环境配置

1. 导入并解压压缩包:
rz -y
tar -zxvf hadoop-2.7.3.tar.gz -C /software/(解压到software文件夹)

2. 更改文件的宿主:-R递归改变文件;-r递归拷贝子文件子目录
chown -R hadoop:hadoop hadoop-2.7.3/

3. su -l hadoop 切换到hadoop用户

4. 为hadoop用户配置ssh免密连接登录(hadoop用户默认密码hadoop)

5. 配置hadoop环境
修改文件hadoop-env.sh
vi /software/hadoop-2.7.3/etc/hadoop/hadoop-env.sh
修改文件中25行:
export JAVA_HOME=/software/jdk1.7.0_79
首先进入cd /software/hadoop-2.7.3/etc/hadoop/再修改configuration
1、[hadoop@master01 hadoop]$ vi core-site.xml
name的名字不可以改变,而value可以改变,应为设置了主机名所以没用IP;

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://master01:9000</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/software/hadoop-2.7.3/work</value>
</property>

2、[hadoop@master01 hadoop]$ vi hdfs-site.xml
传文件时是分割后,文件默认副本数量是3;

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

3、[hadoop@master01 hadoop]$ mv mapred-site.xml.template mapred-site.xml
[hadoop@master01 hadoop]$ vi mapred-site.xml

配置mapreduce的别名是yarn

<property>
  <name>mapreduce.framework.name </name>
  <value>yarn</value>
</property>

4、[hadoop@master01 hadoop]$ vi yarn-site.xml
第一个yarn用来调度资源;做主机硬件资源分配;
第二个yarn将收到的结果重新洗牌shuffle分配;

<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>master01</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>

5、[hadoop@master01 hadoop]$vi slaves(不要localhost)

slave01
slave02
slave03

 

七、权限不够时可以切换到root用户,或者使用su -lc "***"(获取root权限操作某个命令)命令

将修改好的hadoop-2.7.3文件夹拷贝至其它slave用户:
scp -r /software/hadoop-2.7.3 slave01:/software/
拷贝配置好的hadoop环境
scp /software/hadoop-2.7.3/etc/hadoop/hadoop-env.sh slave01:/software/hadoop-2.7.3/etc/hadoop/
拷贝配置好的profile文件到从机
scp /etc/profile slave01:/etc/
拷贝后的hadoop文件夹宿主为root,需要改变宿主(原因是该文件是从root 用户拷贝而来)
chown -R hadoop:hadoop hadoop-2.7.3/
使配置文件生效
source /etc/profile
. /etc/profile

 

 【使用hdfs dfsadmin -report 命令进行集群状态查看】

八、WebPortal端监控

#查看HDFS集群状态信息
http://master01的IP地址:50070
#查看Yarn集群状态信息
http://master01的IP地址:8088

九、搭建过程出错的解决方案

1、cannot restore segment prot after reloc:Permission denied解决?

【错误原因:】这是因为SELINUX的问题,需要关闭SELINX,

【解决办法:】
su -l root      #首先需要切换到root用户
/usr/sbin/setenforce 0      #关闭selinux的安全性检测(这是会话级别的关闭)
如果需要全局关闭可以修改配置文件/etc/sysconfig/selinux
su -l root #首先需要切换到root用户
vi /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing #这里修改成disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

2、在master机器上执行start-all.sh时没有启动其它机器上的数据节点datanode和tasktracker?

【错误原因:】没有配置好masters(hadoop2.x之后没有此文件)和slaves两个配置文件,hadoop中的所有master节点和slave节点的配置应该保持完全相同;

【解决办法:】需要将所有的机器IP在/etc/hosts中映射成主机名,hadoop的所有配置文件中直接采用主机名;
  在/etc/sysconfig/network中配置主机名;
  在/etc/sysconfig/network-script/ifcfg-eth0中配置IP地址;
  在/etc/hosts中完成主机名到IP地址的映射。

3、ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Call to master01/192.168.254.134:9000 failed on local exception: java.net.NoRouteToHostException: No route to host?

【错误原因:】没有关闭防火墙导致datanode无法连接到namenode去注册它自己,最后很快将自己停掉;
所以在datanode上执行start-all.sh之后刚开始使用jps检测还有datanode和tasktracker进程,但是很快就停掉了这两个进程,再次执行jps发现此两个进程已经死掉。

【解决办法:】
hadoop离线分析集群系统是在内网,无须开启防火墙和selinux:
关闭防火墙:   service iptables stop
查看防火墙在哪些运行级别是开机自启动的:  chkconfig --list iptables
关闭所有运行级别的开机自启动:   chkconfig iptables off
关闭指定运行级别的开机自启动:   chkconfig --level 5 iptables off
一般计算机的运行级别是3(带Nfs的多用户级别)和5(XWindows),级别4是保留级别,没有使用;
运行级别2:不带网络NFS的多用户级别;
运行级别1:single单点级别(用于忘记root口令时使用);
运行级别0:关机(halt);
运行级别6:重启(reboot)。

默认运行级别在/etc/inittab文件中设置:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault: #这里设置默认运行级别(可以将级别5改成3)

4、hadoop节点的工作目录访问异常(查看日志发现提示目录不存在或不可访问)?

【错误原因:】这是因为权限导致的,即没有使用工作目录的宿主来启动hdfs系统

【解决办法:】使用工作目录的宿主来启动hdfs系统

5、执行start-dfs.sh后无法上传文件?

这可能是由于安全模式开启导致的,一般在执行start-dfs.sh时其namenode是开启safemode的,但是如果hdfs启动完成之后安全模式没有关闭就是属于一种异常,可以通过如下命令查看:
当前hdfs系统是否处理安全模式下:  hdfs dfsadmin -report
退出安全模式执行命令:   hdfs namenode -safemode leave
如果退出发生异常可以查看*.log日志或者直接重启hdfs系统。

如果是因为datanode进程死掉造成数据无法上传可以执行下面的命令来单独启动数据节点:

hadoop-daemon.sh start datanode 

6、执行hdfs fs -ls /提示无法加载主类 fs?

检查以下hadoop的版本,hadoop2.5及其之后的版本中文件操作命令是dfs而不是fs,所以hadoop shell应该写成hdfs dfs -ls /

7、执行hdfs dfs -ls /没有任何输出

请确定你的hdfs文件系统根目录下存在文件或文件夹,如果根目录下不存在任何文件则不会有任何显示。

8、执行start-dfs.sh没有启动数据节点上的datanode进程,于数据节点上,在hadoop用户下使用jps没有看到任何Java进程,查看datanode的*.log日志发现地址被占用,查看namenode上的*.log日志发现数据节点没有权限访问,提示需要超级用户root?

【错误原因:】在master节点上使用root用户启动了HDFS集群所致,使用root用户启动了HDFS集群之后,在datanode上就存在以root身份运行的datanode进程,当你意识到操作失误从而切换到hadoop用户,再去启动集群则发现数据节点上的datanode进程无法启动,因为datanode上已经存在以root身份运行的datanode进程了,这些进程占用了datanode的通信端口导致datanode上抛出地址被占用的异常,而在hadoop用户下使用jps则无法看到root用户下启动的进程(但如果使用ps命令则可以看到)
【解决办法:】
1、切换到root用户下使用pkill java命令杀掉所有master和slave节点上的java进程
2、执行下面的命令清除掉root操作中留下的残余文件
rm -rf /software/hadoop-2.7.3/work /software/hadoop-2.7.3/work/logs/*
如果有高可用则清除journalnode元数据目录
rm -rf /software/hadoop-2.7.3/QJNNMetadata
3、执行chown -R hadoop:hadoop /software/hadoop-2.7.3将hadoop安装目录的宿主修改为hadoop用户
4、重新初始化HDFS集群
如果有高可用则先启动ZK集群(./zkServer.sh start)、启动QJ集群(hadoop-daemon.sh start journalnode)
重新格式化HDFS
hdfs namenode -format
如果有高可用则拷贝master01上的work目录到master02(scp -r work/ master02:/software/hadoop-2.7.3/),然后重新格式化zkfc(hdfs zkfc -formatZK)
重启HDFS
./start-dfs.sh

9、在Hadoop2.2中支持符号连接配置如下,在Hadoop2.7之后不再支持符号连接操作

<property> 
  <name>test.SymlinkEnabledForTesting</name>
  <value>true</value> 
</property> 

 



posted @ 2017-12-13 09:36  淼淼之森  阅读(1167)  评论(0编辑  收藏  举报
  👉转载请注明出处和署名