Hadoop是一个为离线和大规模数据分析而设计的分布式存储和运行数据的框架。利用Hadoop,可以构建大型数据仓库,实现PB级数据的存储、分析等工作。如今Hadoop已经成为了业界大数据平台首选,很多互联网公司也在使用Hadoop,本文主要记录Hadoop分布式集群的搭建以及过程中需要注意的事项。
一.实验准备
1.环境及配置
电脑配置:内存>=8G,16G为佳
ubuntu-18.04-desktop-amd64.iso镜像
VMware station 14Pro
hadoop-2.6.5.tar.gz文件
jdk-8u11-linux-x64-tar.gz文件
2.相关知识
Hadoop是由Java语言编写的,在分布式服务器集群上存储海量数据并运行分布式分析应用的开源框架,其核心部件是HDFS与MapReduce。
HDFS是一个分布式文件系统:引入存放文件元数据信息的服务器Namenode和实际存放数据的服务器Datanode,对数据进行分布式储存和读取。
MapReduce是一个计算框架:核心思想是把计算任务分配给集群内的服务器里执行。通过对计算任务的拆分再根据任务调度器对任务进行分布式计算。
Hadoop特点:分布式存储与处理,高容错性,动态扩展,高吞吐量
二.实验流程
1.虚拟机安装
安装3台Ubuntu虚拟机到VMware station上,内存可分配为2G,存储空间为30G(在操作过程中需要同时开3台虚拟机,而本实验中所用电脑为8G,内存直接到94%,因此可以先设置为1G,以后再修改)。
安装完虚拟机后,需要对三台虚拟机分别修改hostname,分别在三台虚拟机上运行:
sudo vi /etc/hostname
分别修改为master,slaver1,slaver2,然后重启虚拟机,修改成功。
2.设置静态IP
不同节点之间要保持稳定的互相通信,需要设置静态ip,首先执行:
ifconfig
命令查看当前ip,然后在setting-network中设置静态ip,如图所示:
图1 设置静态IP
修改后,断开网络重连一遍,可以看到修改成功。
图2 设置成功
三台虚拟机的节点分别为如下所示
表1 静态IP设置
三.建立ssh服务
要实现不同节点之间的互联互通需要使用ssh,执行:
sudo apt-get install openssl-server
安装ssh服务,若出现进程锁,那是因为上次进程未结束就关闭了终端,需要手动kill进程,运行:
ps aux | grep "apt-get"
列出包含apt-get的进程,然后Kill对应的进程即可。
kill xxxxx
安装成功后,利用如下命令查看防火墙是否开启,可以看到防火墙处于“inactive”,若防火墙开启则需关闭(Ubuntu默认关闭,但是centos默认开启)。
图3 查看防火墙状态
然后测试是否可以由master节点登录其他两个节点,使用如下命令:
ssh zhangyu@192.168.19.131
由master节点登录其他两个slaver虚拟机(使用格式为:ssh 用户名@目标主机IP),然后点击“yes”,输入密码,如图,已经由master变为slaver1,说明登录成功。
图4 ssh登录成功
四.无密钥登录
由于之前的登录需要每次都输入密钥,在Hadoop使用中肯定是不现实的,因此需要设置无密码登录,基本原理即把生成的RSA公钥让每个节点都保存一份,这样每次就只需要和自己的私钥做对比就可以实现验证,无需密码。
运行:
ssh-keygen
然后一路回车,生成RSA密钥对,保存到新生成的.ssh目录。进入新生成的.ssh目录,里面有保存生成的公钥和私钥,接着将两个子节点公钥拷贝到master节点的对应目录里。
图5 RSA密钥对生成
运行如下命令:
scp id_rsa.pub hadoop@12.1.1.1:~/.ssh/slave_one.pub
现在Master节点集合了三台机器的公钥,再新生成authorized_keys文件
运行。
vim authorized_keyscat id _rsa.pub author authorized_keys #同样的方式,将三台机器的公钥追加到这个文件中
打开该文件效果如图。
图6 Authorized_keys
现在我们可以看到.ssh文件夹已经有了对应的密钥文件。
图7 .ssh文件夹
然后通过如下命令分发到两台机器上。
scp authorized_keys hadoop@192.168.19.131scp authorized_keys hadoop@192.168.19.132
图8 分发成功
接着使用ssh命令尝试无密码登录,发现不需要输入密码即可登录。
五.Hostname设置
由于之前我们ssh登录都要输入目标主机的IP,为了方便,现在将目标主机的hostname保存在每个节点上,就可以直接使用名字登录,不用输入IP。
运行命令,追加图中橙色部分内容,每个节点都操作一次。
cd /etcvi hosts
图9 设置hostname
然后尝试利用hostname进行ssh登录,成功。
图10 Hostname登录
六.Java安装配置
手动安装,版本可控,此处采用的是jdk-8u11-linux-x64.tar.gz,先将此压缩包放到到桌面,然后运行解压缩命令:
tar -zxvf(要解压的文件和路径)
将其解压到自己想要放的文件夹(建议建一个目录把Hadoop相关的都放进去,包括后面以后可能会用的Hive,Hbase等组件)。
图11 解压文件
接下来开始配置jdk,运行:
source /etc/profile
修改配置文件,由于profile是只读文件,需要使用如下命令进行修改。
sudo chmod a+w /etc/profile
命令增加写权限,如下所示。
图12 修改权限
然后在该文件中,修改如下内容。
JAVA_HOME=/usr/lib/jdk/jdk1.8.0_11 #这个是你的jdk文件夹路径HADOOP_HOME=/usr/local/hadoop #这个是你的Hadoop文件夹路径PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbinexport JAVA_HOMEexport PATHexport HADOOP_HOME
然后运行:
source /etc/profile
命令更新一下配置,然后需要注意的是看一下Hadoop和jdk文件夹的owner是不是me,不是的话需要修改为自己。
运行如下命令检测,Hadoop和JDK安装成功!
图13 安装成功
七.配置hadoop
安装Hadoop成功后,接着进入Hadoop的配置工作,首先进入对应文件夹:
cd hadoop/etc/hadoop
在该文件夹下,我们需要修改如下几个文件,分别是:
Core-site.xml
Hadoop-env.sh
Hdfs-site.xml
yarn-env.sh
mapred-site.xml
Yarn-site.xml
首先修改core-site.xml:
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> <description>A base for othertemporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://master.hadoop:9000</value> </property></configuration>
接着修改hadoop-env.sh中的JAVA_HOME,先去掉前面的#,将其设置为jdk当前安装路径。
图14 hadoop-env.sh
接下来是hdfs-site.xml文件:
图15 hdfs-site.xml
接下来修改yarn-env.sh文件,还是配置jdk路径。
图16 yarn-env.sh
接下来是mapred-site.xml文件(这个文件需要将mapred-site.xml.template复制一份修改为mapred-site.xml,然后对新产生的mapred-site.xml修改)。
vi mapred-site.xml
<configuration> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://master.hadoop:9000</value> </property></configuration>
最后是Yarn-site.xml:
vi yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>master.hadoop</value> </property>
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master.hadoop:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master.hadoop:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master.hadoop:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master.hadoop:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master.hadoop:8088</value> </property></configuration>
我们只需按如上步骤布置master节点的Hadoop环境,然后将布置好的Hadoop环境分发到其他两个salver1和slaver2节点即可,分发方法与之前RSA公钥分发一样,使用同样的命令,因此这里不赘述。
八.启动Hadoop集群
启动需要先将HDFS格式化,然后启动集群,格式化指令如图:
图17 hdfs格式化
然后使用start-dfs.sh和start-yarn.sh启动hadoop集群(图中使用的是start-all.sh,但是命令行显示建议使用前两个命令)。
如图所示,启动成功。
图18 Hadoop集群启动成功
启动成功后可通过jps命令查看节点状态。
图19 查看节点
同时,可以通过进入浏览器中的50070端口进入可视化界面的展示,如果能够看到这个界面,说明Hadoop集群已经完全正常的启动了!
图20 浏览器查看启动成功
九.上传文件并测试
布置成功后,可以运行hadoop/share中的示例程序,并上传文件并运行示例程序,那接下来进行文件的上传和示例程序的测试。
首先在Hadoop中新建input目录:
图21 新建文件
在本地新建一个TXT文件,如下(可以随便输入一段英文)。
图22 Test.txt
通过如下命令上传到Hadoop文件系统中,实现分布式存储。
图23 上传命令
可以进入web端的utils中查看到文件上传成功。
图24 上传效果
接下来运行Hadoop的MapReduce示例程序“Wordcount”来统计文件中出现的单词次数,并将输出结果保存在output文件夹中。
图25 MapReduce示例程序运行
运行过程大约半分钟,主要是在启动MapReduce,但是在大规模数据处理时启动时间就只占很小的比重。
图26 运行过程
然后我们进入hdfs文件系统中看到已经多了个文件夹,打开里面的文件。
图27 运行成功
最后将其中的part-r-00000文件下载到本地,打开如下图,可以看到文件中已经统计出了之前上传的文件中单词的数目。
图28 运行结果
至此,Hadoop的分布式集群搭建以及hdfs存储和mapreduce计算的实验就圆满完成,大家可以在此基础上可以安装Hive,Hbase等组件探索Hadoop的更多使用。
Tips
由于没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被删掉,必须重新执行如下命令才行,否则会出错。
hadoop namenode -format
停止hadoop集群采用如下命令
stop-all.sh
若运行示例程序过程中出现虚拟机卡顿和如下图所示的错误,原因在于虚拟机分配的内存不够,可以分配2G以上内存,可能会比较流利的运行。
如果在上传文件到Hadoop的时候出现如下错误
“There are 0 datanode(s) running and nonode(s) are excluded in this operation.”
在网上找了一些资料,如下所示。
出现上述问题可能是namenode在format初始化的时候会形成两个标识blockPoolId,clusterId。新的datanode加入时,会获取这两个标识作为自己工作目录中的标识,一旦namenode重新format后,namenode的身份标识已变,而datanode如果依然持有原来的id,就不会被namenode识别。
解决办法如下:
在master节点上找到hadoop安装目录下 hdfs/name中的current文件夹删除,在slaver节点上找到hdfs/data目录下的所有文件,将其删除,然后重新执行一下如下命令
hadoop namenode-format
再使用start-dfs.sh和start-yarn.sh 重启一下hadoop,用jps命令看一下就可以看见datanode已经启动了。
若出现如下错误
“Call to localhost/127.0.0.1:9000 failed onconnection exception:java.net.ConnectException”
则是因为没有执行hadoop namenode -format命令。启动一下就ok。
实验总结:
本次实验完成了Hadoop集群的搭建和测试工作,包括从虚拟机配置到ssh通信的设置,一步步实现了hadoop的分布式存储和处理操作,后续可以在此基础上探索Hadoop的更多功能。
关于 天 方 夜 “谈”
天方夜谈原意讲不切实际的东西,而这里想要 “脚踏实地”真正弄懂并感受一篇文章的思想。
方班人有自己的浪漫,
我们探讨知识,谈论理想,
采摘科研的繁星,
脚下是星辰大海。
天:代表我们的理想犹如天空般浩荡
方:代表方班
夜:代表代码人的冷静与静谧
谈:代表方班愿与您,就领域内的经典思想和前沿成果“秉烛夜谈”