当前位置: 代码迷 >> 综合 >> 超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群
  详细解决方案

超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群

热度:67   发布时间:2023-12-28 06:20:59.0

超详细!CentOS 7 + Hadoop3.0.0 搭建伪分布式集群

 

转载:https://www.cnblogs.com/thousfeet/p/8618696.html

 

准备linux主机环境

一、安装虚拟机

下载地址:
VMware workstation 14 Pro (附:许可证秘钥)
系统iso:CentOS7 Minimal

基本上就是下一步下一步这种简单的默认安装就好了。除了在安装过程中配置分区的时候可能需要手动分区,然后选择标准分区即可。

装好后,修改内存,因为不需要图形界面,所以只给个512M内存也没问题。并更改网络适配器为VMnet8(NAT)。

附上NAT方式的工作原理


(CentOS和Windows这两台机子通过虚拟网关互联,虚拟网关由VMware workstation生成,在Windows上会生成一个虚拟网卡VMnet8,这个网卡地址和本机的物理网卡没有关系)

二、网络配置

在VMware workstation的菜单 编辑 -> 虚拟网络编辑器 可以查看和修改虚拟网关地址。

然后打开控制面板的网络连接查看VMnet8的IP地址

如图,在我这台机子上:

虚拟网关地址 192.168.216.1
VMnet8 IP地址 192.168.216.2

运行虚拟机,进行网络配置:

1.输入 ip addr 看到我的网卡叫做ens33
2.输入 ls /etc/sysconfig/network-scripts/ 看到网卡ip信息的配置文件名叫做ifcfg-ens33

3.输入 cat /etc/sysconfig/network-scripts/ifcfg-ens33 查看,可以发现虽然BOOTPROTO=dhcp,但是ONBOOT=no

(下面4-6步纯属实验性质可忽视,直接开始第7步)

4.输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将ONBOOT=no修改为yes,在此之前要先进入root模式chmod 777 文件名把文件改为可写状态。修改完毕后,cat一下看看

5.输入 shutdown -r now 重启系统
6.重启完成后,ip addr 看到分配到的地址是192.168.216.128

下面开始进行固定ip的设置。
7.输入vi /etc/sysconfig/network-scripts/ifcfg-ens33,用#将BOOTPROTO=dhcp注释,并输入以下参数,把ip地址固定写为192.168.216.100

IPADDR0=192.168.216.100
PREFIX0=24
GATEWAY0=192.168.216.1
DNS1=192.168.216.1


(后来看到有BOOTPROTO=dhcp这行不注释而是改为BOOTPROTO=static,以及多配置一行NETMASK=255.255.255.0而没有DNS那行的,似乎也可以)

8.输入 service network restart 重启网络服务
9.输入 ip addr 确认配置成功

10.PING 一波试试。

现在用windows主机ping一下刚配置好的虚拟机试试看能否ping通,行的话这步就已经完成了。

三、修改主机名

下载安装终端软件 Mobaxterm。点击 sessions -> New sessions -> SSH,输入虚拟机的IP地址和用户名。现在就可以把刚建好的虚拟机假装是远程终端一样的用了。

然后修改主机名方便集群间的访问

sudo vi /etc/sysconfig/network ,假设我给它起名字叫node01,则输入

NETWORKING=yes  
HOSTNAME=node01 

改好后需要重启。若不想重启可以输入 sudo hostname node01 然后exit登出,重新登录终端,就可以看到已经生效了。

(可以看到原本是localhost的地方变为了node01)

修改域名解析映射文件使得后续可以直接通过主机名访问,sudo vi /etc/hosts,添加一行 IP地址 主机名

PING一波试试是否已生效

到此为止linux主机环境已完成。

 

安装jdk

一、下载解压

在主目录~下新建一个文件夹来放之后要装的所有文件比如叫做app mkdir app

从官网下载jdk包,我下载的是 jdk-8u161-linux-x64.tar.gz

打开 Mobaxterm。点击 sessions -> New sessions -> SFTP,注意要使用root登录。然后打开相应目录直接把本地文件拖拽到那一大块空白处即可。

把刚刚的压缩包解压到这个目录下 tar -zxvf jdk-8u161-linux-x64.tar.gz -C ~/app/ (后面那个参数是由于我拖拽的时候把原压缩包放到/usr/java文件夹了所以用 -C 把它解压到指定文件夹下)

进入 app/jdk1.8.0_161/bin 目录下,./java -version 看是否成功安装

二、配置环境变量PATH

sudo vi /etc/profile

在最末尾处添加两行

export JAVA_HOME=/home/thousfeet/app/jdk1.8.0_161
export PATH=$PATH:$JAVA_HOME/bin

(JAVA_HOME变量的值可能因人而异,查看方式可以是在 mobaxterm 的左侧这个 session 的图标上右击->duplicate session 复制出一个新 session ,然后进入之前jdk文件夹下输入pwd,然后选中这串东西贴过来)

配置好了之后我们想要使它立刻生效,输入 source /etc/profile,然后输入 java -version看到能够使用。这样就已经配置好了。

 

安装Hadoop

下载 hadoop 3.0.0 压缩包。
打开 Mobaxterm 刚刚那个 SFTP ,老样子拖拽上传解压到/app。

进入解压目录 cd /app/hadoop-3.0.0/etc/hadoop

一、配置 hadoop-env.sh

vi hadoop-env.sh,修改 JAVA_HOME 为之前那个参数

二、配置 core-site.xml

vi core-site.xml,在configuration中添加各配置项

1.配置默认采用的文件系统。
(由于存储层和运算层松耦合,要为它们指定使用hadoop原生的分布式文件系统hdfs。value填入的是uri,参数是 分布式集群中主节点的地址 : 指定端口号

<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000/</value>
</property>

2.配置hadoop的公共目录
(指定hadoop进程运行中产生的数据存放的工作目录,NameNode、DataNode等就在本地工作目录下建子目录存放数据。但事实上在生产系统里,NameNode、DataNode等进程都应单独配置目录,而且配置的应该是磁盘挂载点,以方便挂载更多的磁盘扩展容量)

<property>
<name>hadoop.tmp.dir</name>
<value>/home/thousfeet/app/hadoop-3.0.0/data/</value>
</property>

(value的参数仍与之前一样可以进入解压目录输入pwd查看)

三、配置 hdfs-site.xml

vi hdfs-site.xml,配置hdfs的副本数
(客户端将文件存到hdfs的时候,会存放在多个副本。value一般指定3,但因为搭建的是伪分布式就只有一台机器,所以只能写1。)

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

四、配置 mapred-site.xml

vi mapred-site.xml,指定MapReduce程序应该放在哪个资源调度集群上运行。若不指定为yarn,那么MapReduce程序就只会在本地运行而非在整个集群中运行。

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

五、配置 yarn-site.xml

vi yarn-site.xml,要配置的参数有2个:

1.指定yarn集群中的老大(就是本机)

<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>

2.配置yarn集群中的重节点,指定map产生的中间结果传递给reduce采用的机制是shuffle

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

六、配置环境变量PATH

输入 sudo vi /etc/profile

加入一行 export HADOOP_HOME=/home/thousfeet/app/hadoop-3.0.0
以及修改PATH,追加参数 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

然后记得 source /etc/profile

现在就可以在任意地方使用hadoop指令了。

 

关掉防火墙

由于hadoop中的程序都是网络服务,需要监听端口,这些端口默认会被linux防火墙挡住。因此要把hadoop中的端口一个个打开,或者把防火墙关掉。由于都是内网,所以关掉就好了。

sudo firewall-cmd --state 查看防火墙状态
sudo systemctl stop firewalld.service 关闭防火墙
再次查看状态,看到已经关闭了。但在下一次开机时还会自启动,因此 sudo systemctl disable firewalld.service 禁止开机时防火墙自启。

 

实现SSH免密码远程登录

SSH机制解析图(假如有一台叫做weekend110的终端要远程登录叫做spark01的终端)

我们要做的只是黑色箭头的步骤,绿色的是SSH机制的内部实现。

一、创建公钥/私钥

ssh-keygen -t rsa,然后yes加一路回车

二、创建authorized_keys文件并修改权限为600

cd .ssh
touch authorized_keys
chmod 600 authorized_keys

三、将公钥追加到authorized_keys文件中去

cat id_rsa.pub >> authorized_keys

ssh node01 试试看能否成功免密登录

(因为是伪分布式集群,其实就是自己登录自己)

 

启动Hadoop

一、初始化(格式化)

输入 hadoop namenode -format

二、启动

start-dfs.sh
start-yarn.sh

然后输入jps 查看已成功启动的进程

若出现这六个都没少则说明已全部成功启动了。

 


几个坑点

出事点1:can't open file for writing

在网络配置第4步的时候,遇到了can't open file for writing,然而试图chmod也并没有成功,查了半天得知可能需要删除在/var/tmp路径下的.swp隐藏文件(来自http://blog.csdn.net/luoluoguo/article/details/11557291)。然后chmod,发现root状态下vi这个文件看到里面内容是空的(?)于是切换回普通用户vi修改保存后退出就成功了。

出事点2:不在sudoers文件中

第一次使用sudo命令的时候失败提示“不在sudoers文件中”

因此要切换到root修改一下sudoers文件:vi /etc/sudoers,在如下图的位置加上一行自己的用户名

出事点3:wget下载JDK后解压不了

安装jdk的时候试图用wget直接从官网下载,高高兴兴的一波操作

sudo wget http://download.Oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz
tar -xf jdk-8u121-linux-x64.tar.gz

发现GG了,怎么都解压不了,查了下发现非要手动下载再传,迷得不行orz(来自http://blog.csdn.net/jdjdndhj/article/details/73649419#/)

出事点4:Found a swap file by the name "/etc/.profile.swp"

环境变量配置到一半的时候电脑突然死机了(T T 渣机是真的难受),重启后再次进入编译/etc/profile的时候出现如下错误提示

E325: ATTENTION
Found a swap file by the name "/etc/.profile.swp"
owned by: root dated: Wed Jul 14 10:01:10 2010
file name: /etc/profile
modified: YES
user name: root host name: zhaoyang-laptop
process ID: 1934
While opening file "/etc/profile"
dated: Thu Apr 29 20:18:30 2010

解决方法是:q!退出vi编辑器,在终端输入sudo rm -f /etc/.profile.swp

出事点5:启动hadoop后jps查看进程只有一个

在配置完成后我直接启动了hadoop并jps查看,发现只有JPS一个进程,开始没注意启动过程提示一直在检查配置错误,除去上文的配置又补做了如下操作:(事实上下面的做不做都并不需要,但为了避免最终操作和文中不符所以还是列出来)

修改了hadoop-env.sh配置了hadoop_home变量
把core-site.xml的9000后多余的/去掉
mapred-site.xml加上了

<property>
<name>mapreduce.admin.user.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value>
</property>

后来恍然意识到是没有输入密码,启动过程中也不会给输入密码的提示步骤,所以一定要先配置SSH免密登录。

出事点6:启动hadoop后jps查看进程没有datanode

这个坑点是重复格式化造成的。

当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录namespaceID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。

我们之前配置的时候是一起放在一个data文件夹下,所以先进到那个路径下去查看:cd /home/thousfeet/app/hadoop-3.0.0/data/dfs,会看到一个data文件夹和一个name文件夹。

cd cd name/current/,然后cat VERSION,把namenode的clusterID复制下来。

然后回到data文件夹下的current文件夹,vi VERSION,果然datanode这里的clusterID和namenode里的不一致,就把这串替换成刚复制过来的就好了。

这时候stop-all.sh,然后重新启动就好了。

出事点5:启动hadoop后无法访问50070端口

jps查看一切正常,防火墙也已经关闭。查看监听的端口发现8088都有,就是没有50070。

解决方案:

在 hdfs-site.xml 添加如下:

<property>
<name>dfs.http.address</name>
<value>192.168.216.100:50070</value>
</property>

然后重新格式化namenode,启动hadoop。
(来自https://blog.csdn.net/Neone__u/article/details/53741786)


附:vi命令的使用

首先使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式
接下来按 i 进入insert模式,然后键盘随便输入写内容。
然后按ESC重新进入到命令模式。
在命令模式的情况下,按 : ,进入到了末行模式。
输入wq!,然后回车,强行保存退出。
下次再打开对应文件(可用less filename命令打开),即可看到内容已经更改。

补充:
(1)末行模式下:q! 【强制退出不保存】 q【退出不保存】 wq【退出并保存后面也可以加个!】
(2)如果你不想保存直接退出有可以在命令模式下使用“ctrl+z”快捷键或者按住“shift”键,输入两个z即可退出。


参考资料

CentOS 7 网络配置详解
CentOS中防火墙相关的命令(CentOS7中演示)
VMware安装Centos7超详细过程(图文)

  相关解决方案