含泪使用Ubuntu搭建hadoop分布式集群笔记

hadoop之前安装的一直是伪分布式,总觉得不够装逼。所以打算装一下分布式集群。开个玩笑。
做一下笔记记录我安装的过程。
因为分布式集群必须要有三个节点。
我用的是Ubuntu系统,之前从阿里云白嫖活动中嫖了一台服务器,再加上本机,我打算再装一台虚拟机就可以了。后来发现服务器太麻烦了,我开了两台虚拟机,一台Ubutnu 18.04,一台Ubuntu 20.04,我自己装的系统是19.10,多体验一下,我觉得用起来都差不多

安装虚拟机

之前只在windows上装过VMware,不知道如何在Ubuntu中安装
安装包去官网下载即可,密钥可以输入:

UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA

现在是2020-5-29,密钥还是有效的,不知道什么时候会失效。
VMware安装好之后,打开虚拟机,却出现:

could not open /dev/vmmon:?????? please make sure that the kernel moduel vmmon is load

搜到的大部分教程都是输入:

sudo /etc/init.d/vmware start

但是这样并不行。后来发现是配置问题:
secure boot,导致未签名的内核扩展(即vmware的vmmon模块)不能被加载。vmmon.ko和vmnet.ko都是未签名的,因此就发生的上图所示的错误。
解决方法
进入boot,关闭 secure boot 即可。
现在进入打开虚拟机就没有问题了。

进入虚拟后,我安装的是Ubuntu版本,首先设置root密码,输入:

sudo passwd root

https://blog.csdn.net/weixin_45468845/article/details/105185198

第二步:换源

18.04换源方法
https://blog.csdn.net/zhangjiahao14/article/details/80554616?ops_request_misc=&request_id=&biz_id=102&utm_term=ubuntu18.04%E6%8D%A2%E6%BA%90&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-80554616
20.04换源方法
这个有直接从图形界面换源的方法,也有从终端换源的方法,我觉得从图形界面换源还是比较方便的。
https://blog.csdn.net/YooLcx/article/details/104527734

安装相关命令包

接下来安装vim
我的Ubuntu装好后,并
上面换源的教程中,没有换源之前安装 vim 我没有成功,用的是vi 命令编辑 source.list 文件
输入:

sudo apt-get install vim

安装ssh:

sudo apt-get install openssh-server

此处注意:
发现虚拟机不能使用root用户进行ssh登录
解决方法:

vim /etc/ssh/sshd_config

找到 #PermitRootLogin prohibit-password在后面添加一行

PermitRootLogin yes

保存退出后,重启ssh服务:

sudo /etc/init.d/ssh restart

但是直接ssh ip地址 会出现错误,输入密码也不管用,原来是本地登录用户名和远程登录用户名不一致,上网也搜不到答案,网上的答案都是:

解决本地登陆用户与远程登陆用户不一致

好吧,这事很纠结,虽然不用输入密码了,但是还得 ssh [email protected] 来登陆,很不爽,你懂的。
其实解决也很简单(but是同事告诉我的,老脸一红),修改本地登陆用户的 ~/.ssh/config
文件,如果木有的话就自个儿建一个吧,内容如下:

Host SomeHostName
User_name_on SomeHostName

这样,本地和远程登陆用户名不一致也可以 ssh hostname 登陆了。

我寻思着复制粘贴连一个字都不改?
这tm什么意思我水平不够也看不懂
找到解决方法了。在~/.ssh 目录下新建config 文件,添加如下内容,
Host就是我想要连接的节点的地址,user是登录用户

Host 192.168.43.239
user root

Host 192.168.43.142
user root

这样就可以直接使用 ssh IP地址 来登录了
安装网络工具:

sudo apt-get install net-tools

第三步:配置静态ip

比较重要的一点是设置静态ip地址,有的机器会自动分配导致ip地址经常变化,这样不利于ssh登录
18.04设置静态ip地址.
注意,下面的操作结束后直接重启虚拟机,有的时候重启网络不管用
https://blog.csdn.net/qq_36937342/article/details/80876385
20.04设置静态ip地址:
https://editor.csdn.net/md/?articleId=106458371

查看虚拟机的ip地址
输入

ifconfig

查看虚拟机的ip地址

输入

sudo vim /etc/hosts

将本地地址设置为 master
另外两个节点的地址分别设置为 slave1 slave2
这里我设置的是服务器为 slave1,虚拟机为slave2

192.168.43.***    master
192.168.43***    slave1
192.168.43.***   slave2

编写集群分发脚本xsync

将本地文件上传到虚拟机和服务器上。
使用scp 传输
在本地打开终端输入

sudo  scp -r /要传输的文件地址    虚拟机ip地址:/想要传到的目录

scp使用命令详情可以参考:
https://blog.csdn.net/weixin_45468845/article/details/105677691

建议在根目录下建立/apps 文件夹,将软件都放在这个文件下,方便管理
先在本地将hadoop 下载并解压好。
我的hadoop文件和jdk文件都放在apps文件中
这里将hadoop 文件与jdk配置文件一起传输到虚拟机中

sudo scp -r /apps/java [email protected]:/apps
sudo scp -r /apps/hadoop [email protected]:/apps

rsync 远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法

rsync    -rvl              $pdir/$fname                      $user@hadoop$host:$pdir/$fname
命令      选项参数   要拷贝的文件路径/名称    目的用户@主机:目的路径/名称

-r 递归
-v 显示复制过程
-l 拷贝符号连接

分布式集群中下面的操作在三台机器中都是一样的。照着套路来就可以了
打开终端输入:

sudo vim /etc/profile

在后面追加:

#java
export JAVA_HOME=/apps/java
export PATH=$JAVA_HOME/bin:$PATH

#hadoop
export HADDOP_HOME=/apps/hadoop
export PATH=$HADOOP_HOME/bin:$PATH

使文件生效:

source /etc/profile

进入hadoop 配置目录:
cd /apps/hadoop/etc/hadoop

需要配置一下几个文件:
核心配置文件:
core-site.xml

HDFS配置文件:
hadoop-env.sh
hdfs-site.xml

YARN配置文件:
yarn-env.sh
yarn-site.xml

MapReduce配置文件:
mapred-env.sh
mapred-site.xml

core-site.xml :

<configuration>
  <property>
      <name>hadoop.tmp.dir</name>
      <value>/data/tmp/hadoop/tmp</value>
  </property>
  <property>
      <name>fs.defaultFS</name>
      <value>hdfs://master:9000</value>
  </property>
      <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>

</configuration>

hadoop-env.sh

#java
export JAVA_HOME=/apps/java

hdfs-site.xml

<configuration>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>/data/tmp/hadoop/hdfs/name</value>
  </property>
  <property>
     <name>dfs.namenode.secondary.http-address</name>
     <value>slave2:50090</value>
  </property>
  <property>
      <name>dfs.datanode.data.dir</name>
      <value>/data/tmp/hadoop/hdfs/data</value>
  </property>
  <property>
      <name>dfs.replication</name>
      <value>3</value>
  </property>
  <property>
      <name>dfs.permissions.enabled</name>
      <value>false</value>
  </property>
</configuration>

yarn-env.sh

#java
export JAVA_HOME=/apps/java

yarn-site.xml

<configuration>
<!-- Site specific YARN configuration properties -->
 <property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
 </property>
 <property>
     <name>yarn.resourcemanager.hostname</name>
     <value>slave1</value>
 </property>
</configuration>

mapred-env.sh

#java
export JAVA_HOME=/apps/java

mapred-site.xml

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

在每台机器上创建目录

sudo mkdir -p /data/tmp/hdfs
sudo mkdir -p /data/tmp/name

文件配置好之后,在虚拟机上输入 hadoop
出现:

hadoop:未找到命令

在服务器和本地却可以
解决方法:
1)可能是没有使配置文件生效,输入

sourcr /etc/profile

2)直接在配置文件中输入绝对路径

export HADOOP_HOME=/apps/hadoop
export PATH=/apps/hadoop/bin:$PATH

然后

sourcr /etc/profile

3)通过shell命令export修改Linux环境变量。
因为之前通过

sudo vim /etc/profile

修改环境变量导致系统无法进入桌面环境,所以换一种方式添加环境变量,即直接在命令行中输入:

 export PATH=$PATH:/apps/hadoop/bin

集群单点启动

1)如果是第一次启动,需要格式化namenode
master机中输入:

hadoop namenode -format

格式化完成。
2)在master机上启动NameNode

hadoop-daemon.sh start namenode

3)在master,slave1,slave2上分别启动DataNode

hadoop-daemon.sh start datanode

注意:教程上是这样,但是我尝试的时候却显示错误

hadoop-daemon.sh:找不到命令

或:

WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.

于是我在三台机器上都直接输入

sudo ./apps/hadoop/sbin/start-all.sh

反正都运行起来了

ssh免密钥登录配置

输入:

ssh-keygen -t  rsa
会出现:
root@yx:/apps/hadoop/sbin# ssh-keygen -t  rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:g9JM/kNsjzN4tLPIHBjeCIAyfd2duwB4u5zTI9hXjTg root@yx
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|..   o . . .     |
|= . o = . o      |
|.o . * = . +     |
|  . o * E + .    |
|   o X X O .     |
|    = @ & o      |
|     o B B       |
|      + .        |
+----[SHA256]-----+

如果之前配置过本机的ssh免密钥登录,会提示你是否覆盖之前的内容,输入 y(覆盖) 即可。
剩下的就一直按 enter
将公钥拷贝到要免密登录的目标机器上

ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2

如果前面的配置好了,这一步应该是没有问题的,我之前因为ssh 本地登陆用户与远程登陆用户不一致,导致这一步无法正常进行,如果不可以的话可以使用

ssh-copy-id root@master
ssh-copy-id root@slave1
ssh-copy-id root@slave2

指定用户名登录。
如果到这一步还是不行,建议卸载ssh

sudo apt-get purge openssh-server

群起集群

因为我安装的版本是hadoop3.2.1,和hadoop2.xx稍有区别。如果是hadoop2.xx,没有workers,而是slaves

cd /apps/hadoop/etc/hadoop/
sudo vim workers 

添加:

master
slave1
slave2

1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)

cd /apps/hadoop/bin
hdfs namenode -format

2)启动HDFS

cd /apps/hadoop/sbin
sudo ./start-dfs.sh

3)启动YARN

cd /apps/hadoop/sbin
sudo ./start-yarn.sh

因为我单独使用ssh slave1, ssh slave2都没有错误,但是此处却出现了:

WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [master]
master: Warning: Permanently added 'master,192.168.43.190' (ECDSA) to the list of known hosts.
master: root@master: Permission denied (publickey,password).
Starting datanodes
master: Warning: Permanently added 'master,192.168.43.190' (ECDSA) to the list of known hosts.
master: root@master: Permission denied (publickey,password).
slave2: Warning: Permanently added 'slave2,192.168.43.142' (ECDSA) to the list of known hosts.
slave1: Warning: Permanently added 'slave1,192.168.43.4' (ECDSA) to the list of known hosts.
slave2: root@slave2: Permission denied (publickey,password).
slave1: root@slave1: Permission denied (publickey,password).
Starting secondary namenodes [slave2]
slave2: Warning: Permanently added 'slave2,192.168.43.142' (ECDSA) to the list of known hosts.
slave2: root@slave2: Permission denied (publickey,password).

解决:
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
可以参考:
https://blog.csdn.net/daqiang012/article/details/104109578

解决:
master: Warning: Permanently added ‘master,192.168.43.190’ (ECDSA) to the list of known hosts.
可以参考:
https://blog.csdn.net/bingguang1993/article/details/82415543

现在再次启动就会出现:

yx@yx:/apps/hadoop/sbin$ sudo ./start-dfs.sh 
Starting namenodes on [master]
master: root@master: Permission denied (publickey,password).
Starting datanodes
master: root@master: Permission denied (publickey,password).
slave2: root@slave2: Permission denied (publickey,password).
slave1: root@slave1: Permission denied (publickey,password).
Starting secondary namenodes [slave2]
slave2: root@slave2: Permission denied (publickey,password).

因为不能读取root用户中的文件,最简单直接的方法:

su root
chmod -R 777  ~/.ssh

这样就ok了,可能并不对所有人适用。
但是会出现:

root@yx:~/.ssh# /apps/hadoop/sbin/start-all.sh 
Starting namenodes on [master]
master: Bad owner or permissions on /root/.ssh/config
Starting datanodes
master: Bad owner or permissions on /root/.ssh/config
slave1: Bad owner or permissions on /root/.ssh/config
slave2: Bad owner or permissions on /root/.ssh/config
Starting secondary namenodes [slave2]
slave2: Bad owner or permissions on /root/.ssh/config
Starting resourcemanager
Starting nodemanagers
slave2: Bad owner or permissions on /root/.ssh/config
master: Bad owner or permissions on /root/.ssh/config
slave1: Bad owner or permissions on /root/.ssh/config

修改config文件即可

sudo chmod 600 config

猜你喜欢

转载自blog.csdn.net/weixin_45468845/article/details/106404724