郭心全

IT者,程序员,在读硕士研究生

VitualBox建三台虚拟机Ubuntu18.04试搭建Hadoop3.2+spark2.4

由于条件限制,先在虚拟机上试安装Hadoop3.2+spark2.4
安装虚拟机的心酸请看我另外一个博客:虚拟机VirtualBox-Ubuntu18.04和主机win10共享文件 里提到的
这里装好了四台虚拟机,Master、Salver1、Slaver2、Slaver3,连接网络,结果四个虚拟机的Ip地址一样,这就尬了。找度娘要解决办法呗,首先修改了虚拟机网络的连接方式为:桥接网卡,如下
1

然后接着捣鼓修改Ip地址。。。。。。然后晚上就玩了,没干,第二天打开电脑查看IP地址发现不一样了,个人推测:网络连接方式改为桥接网卡,然后重启虚拟机或本机电脑-再打开虚拟机,就会使虚拟机的ip地址不一样

第一步 配置hosts

在每个节点(即每台虚拟机上)修改hosts文件,运行以下命令

sudo gedit /etc/hosts //会打开hosts文件

在其后面加上每个节点的Ip地址,如下

1
Ip地址后面是电脑的名,即/etc/hostname里设置的
## 第二步 设置SSH免密登录
感谢作者 https://www.linuxidc.com/Linux/2019-02/156882.htm 和博主 https://www.cnblogs.com/benfly/p/8117894.html
SSH是secure shell的缩写,是一种创建在应用层和传输层基础上的安全协议。
### 1 为每个节点安装SSH
sudo apt-get install openssh-server //安装SSH

查看是否安装成功
ps -e|grep ssh 或者 ssh -V //安装SSH

2

2 为每个节点生成ssh密钥

ssh-keygen -t rsa //生成ssh密钥

一路回车直至结束,会在主目录(/home/Master,master是Ubuntu系统用户名)下生成一个.ssh文件夹,其中包含id_rsa、id_rsa.pub两个文件,如下

3
4
如果在主目录下找不到.ssh,就点击上图的右上角的三个横杠,然后选择显示隐藏文件(H)即可
### 3 把四个节点(四台电脑)产生的公钥放在一个文件(authorized_keys)并每个电脑放一份
#### 1 在master节点上,进入.shh,把id_rsa.pub拷贝到authorized_keys上
cp id_rsa.pub authorized_keys //拷贝id_rsa.pub到文件authorized_keys上

ls //查看.ssh文件下的目录

5

2 把master节点上的authorized_keys拷贝到slaver1节点的.ssh文件下

scp authorized_keys slaver1@slaver1:/home/slaver1/.ssh //@前是下个节点的用户,@后是下个节点的主机名

2
登录slaver1电脑查看是否拷贝过来了,然后把slaver1节点的ssh密钥加入到authorized_keys中去
6

3 把电脑slaver1的authorized_keys拷贝到下个节点(slaver2)重复上面两步,接着slaver2拷贝到slaver3,把slaver3的ssh密钥加到authorized_keys

3
4
7

4 把最终的slaver3的authorized_keys复制到master、slaver1、slaver2三台电脑上,Ok

5

3 验证免密登录成功

16
此时登录需要ssh slaver1@Slaver1 即ssh 要登陆的主机的用户名@要登陆的主机名,若想直接ssh Slaver1 即ssh 要登陆的主机名则需要修改.ssh/config,若没有新建一个,如下

sudo gedit .ssh/config

7
18
其中出现了”小插曲”,master连接slaver1、slaver2、slaver3都不行,需要输入密码,而三者连谁都行,不需要输入密码,然后百度找原因,有说authorized_keys的读写权限没有真的实现,要怎么怎么做,我去打开我的authorized_keys看了下,尼玛,两个slaver1的公钥,一个slaver2一个slaver3的公钥,没有master节点的公钥,明明第一个就加进去的master啊,咱也不知道,咱也不敢问,只能去打开master的id_rsa.pub,复制到每个电脑的authorized_keys里,Ok
还有就是警告:The authenticity of host 192.168.0.xxx can’t be established.
处理:打开/etc/ssh/ssh_config文件,在其后面加入下面两行代码,然后重启服务sshd

sudo gedit /etc/ssh/ssh_config //打开ssh_config文件

StrictHostKeyChecking no
UserKnownHostsFile /dev/null
sudo service sshd restart //重启sshd服务

8

第三步 安装JDK环境

下载JDK,我的是JDK11,解压到要安装的文件夹下,解压后就可以用了,不过要配置环境变量,在/etc/profile文件末尾加上如下代码
9
代码意义请百度,有很多的教程

第四步 安装Hadoop

下载、解压、移动Hadoop

到官网上去下载Hadoop3.2.0,然后解压,我解压到了/home/master/software文件下,把Hadoop移动到/usr/local下,这步我觉得可以不用移动,配置环境变量时修改就行,我看网上好多教程都移动了,若是不放心就移动下,反正无关乎啥,步骤如下

mv -v /home/master/software/hadoop-3.2.0 /usr/local/hadoop

6

配置Hadoop环境变量

配置的JDK环境变量不变,如下
10
配置Hadoop环境变量,在JDK的环境变量下面添加即可
11
可我看的书(Python+Spark2.0+Hadoop机器学习与大数据实战 林大贵著)上说是:运行Hadoop必须设置很多环境变量,可是如果每次登录时都必须重新设置就会很麻烦,因此我们可以在~/.bashrc文件中设置每次登录时都会自动运行一次环境变量设置。
我懵懵的,人家都在/etc/profile里设置,可他在~/.bashrc中设置,还有充分的理由,虽说我没太看懂这理由。然后百度了一下,说是
在/etc/profile中配置的环境变量只会在会话开始读取一次
而在/etc/bashrc中配置的环境变量则每次打开终端都会读取
我懂了,就是在/etc/profile文件中配置会出现问题,那我也写在/etc/bashrc中得了,还是书中自有黄金屋啊,书中代码,即我写入~/.bashrc的代码
export JAVA_HOME=/home/master/software/jdk-11.0.3
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS=”-Djava.library.path=$HADOOP_HOME/lib”
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
export PATH=$JAVA_HOME/bin:$PATH

第五步 修改usr/local/hadoop/etc/Hadoop下的Hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、workers、yarn-site.xml六个

首先,每台虚拟机都要配置这几个文件,我在博客上看到的都说是五个配置文件修改,有的少了yarn-site.xml有的少了hdoop-env.sh,这里我都配置一下,万一用到了其功能呢。但是还是要感谢博主和作者
https://www.cnblogs.com/caiyisen/p/7373512.html https://blog.csdn.net/u014636511/article/details/80171002 https://www.cnblogs.com/laov/p/3421479.html
hadoop-env.sh 添加Java安装的地址

sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/home/master/software/jdk-11.0.3
core-site.xml fs.default.name:设置HDFS的默认名称 hadoop.tmp.dir:设置一个临时目录,用来存放每次运行的作业job的信息(书上没设置)
sudo gedit /usr/local/hadoop/etc/hadoop/core-site.xml

12
hdfs-site.xml dfs.replication:设置blocks副本数量,dfs.master.dir:设置master数据存储目录,会在master主机上创建,dfs.slaver.dir:设置slaver数据存储目录,会在slaver1、slaver2、slaver3从机上都创建

sudo gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml

13
17
mapred-site.xml mapreduce.framework.name:设置mapreduce的框架为yarn

sudo gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml

14
yarn-site.xml

sudo gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml

15

workers 把三天从机的主机名加进来即可

格式化namenode,并且启动集群

hadoop namenode -format //格式化namenode

19
启动集群,下面是一些启动的命令,

start-all.sh //启动所有Hadoop守护进程,有NameNode、SecondaryNameNode、DataNode、ResourceManager、NodeManager

stop-all.sh //停止所有的Hadoop守护进程,即start-all.sh开启的

start-dfs.sh //启动Hadoop HDFS守护进程,有NameNode、SecondaNameNode、DataNode

stop-dfs.sh //停止Hadoop HDFS守护进程

hdfs –daemon start namenode //单独启动namenode进程

hdfs –daemon stop namenode //单独停止namenode进程

hdfs –daemon start datanode //单独启动datanode

hdfs –daemon stop datanode //单独停止datanode

hdfs –daemon start secondarynamenode //单独启动secondarynamenode

hdfs –daemon stop secondarynamenode //单独停止secondarynamenode

start-yarn.sh //启动ResourceManager、nodeManager进程

stop-yarn.sh //停止ResourceManager、nodeManager进程

yarn –daemon start resourcemanager //单独启动ResourceManager进程

yarn –daemon stop resourcemanager //单独停止ResourceManager进程

yarn –daemon start nodemanager //单独启动nodeManager进程

yarn –daemon stop nodemanager //单独停止nodeManager进程

版本2的有所不同,请看下面的博客,感谢博主 https://www.cnblogs.com/xym4869/p/8821312.html
修改start-dfs.sh、start-yarn.sh、stop-dfs.sh、stop-yarn.sh
这一步不用修改了,在百度上有的修改是因为一开始配置Hadoop都是用的root用户,所以需要在start-dfs.sh和stop-dfs.sh前面加上
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
在start-yarn.sh和stop-yarn.sh前面加上
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
结果start-all.sh后,没有ResourceManager、NodeManager进程,急死了,搞了好长时间,去查看日志,发现

8
百度到原因,JDK版本太高,某些java的API被禁什么玩意的,解决方法有二,
一:修改/etc/hadoop/yarn-env.sh
export YARN_RESOURCEMANAGER_OPTS=”–add-modules=ALL-SYSTEM”
export YARN_NODEMANAGER_OPTS=”–add-modules=ALL-SYSTEM”
二:下载JDK8,把JDK11换成JDK8
我肯定首先修改配置文件啊,这比换JDK简单点,但是…..不行,无奈之下去下载JDK8,这时候下载JDK还需要注册Oracle的账号,没办法,注册吧
然后下载JDK,更换四个节点的JDK,很激动,应该可以了吧,这次不能再出事了吧,启动着,先去厕所。。。。回来之后,很激动的jps,尼玛,还是没有,打开日志文件,又Error
20
找解决办法吧,也没招啊,感谢下面两个作者
http://www.pianshen.com/article/7314336061/ https://inote.xin/182.html
只能把四个节点的Hadoop删掉,重新配置
然后再start-all.sh,老天爷不能再错了吧。。。。。。。。。。。唉,皇天不负有心人啊,搞了一个多周的Hadoop+spark搭建,终于完成了Hadoop的搭建,醉了,这个JDK啊
启动了后,打开网址http://localhost:9870 点击Datanodes,应该有四个Node,若是只有一个,则有可能/etc/hosts的第二行master与主机名相冲,什么的,改一下或者注释第二行即可,如下
27
解决上述错误期间,还把Hadoop的配置改了改,大概按照书上的改的,具体如下
Master
hadoop-env.sh
export JAVA_HOME=/home/master/software/jdk1.8.0_211
core-site.xml 没改变
hdfs-site.xml
21
mapred-site.xml 没改变
yarn-site.xml
9
workers 没改变

Slaver1-3
hadoop-env.sh
export JAVA_HOME=/home/slaver1/software/jdk1.8.0_211 slaver后的数字随节点变
core-site.xml
22
hdfs-site.xml
23
mapred-site.xml
24
yarn-site.xml
25
workers 添加上另外三个计算机的名即可
继续踩坑:http://localhost:50070 打不开,因为hadoo3.0版本以上端口都改为了9870,而不再是50070,故http://localhost:9870 能打开
错误:26
解决 https://www.cnblogs.com/aguncn/p/4460095.html
还有可能显示一个激活datanode,有可能 https://blog.csdn.net/wk51920/article/details/51729460 路径一样,误认为一个datanode,修改hdfs-site.xml的datanode路径
还有可能 https://blog.csdn.net/wk51920/article/details/51729460 即/etc/hosts里,第二行127.0.1.1 master 注释掉或把后面的名字改一下

第六步 安装scala、spark2.4.3

我这里下载的是scala2.10.7,只因看到一个博客说,这个版本用的多,有错的话查资料好查
Spark,我下载的2.4.3,现在下载spark还要有Oracle的账号,唉,只能注册了
我这里还把解压的scala和spark移动到了/usr/local/下,分别建了scala和spark文件夹
感谢博主 https://www.cnblogs.com/studyzy/p/setup-hadoop-cluster.html https://www.cnblogs.com/studyzy/p/6204620.html
scala
10
28
spark 同理Scala移动、配置环境变量、使环境变量生效
29
然后配置spark-env.sh、slaves
由于原spark没有spark-env.sh、slaves,需要把/usr/local/spark/conf文件夹下的spark-env.sh.template复制成一个spark-env.sh,salves.template复制成一个slaves,然后再配置
11
spark-env.sh配置如下
30
slaves配置如下 只配置从节点,把从节点的主机名加入,主节点(Master)不加入,每个主机都一样
31
开启Hadoop和spark,由于一开始配好了Hadoop,故在桌面打开用户端,直接start-all.sh即可,而spark需要去/usr/local/spark/sbin下启动spark的start-all.sh
32
查看进程,master出现了Master,slaver出现了worker
12
13
启动后查看结果:
http://localhost:8088
14
http://10.2.172.230:9870 这里不是50070,50070好像是Hadoop3.0版本以下的地址
33
http://10.2.172.230:8080
15