首页 > 代码库 > Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统 + Parallels Desktop 12 Pro Edition)
Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统 + Parallels Desktop 12 Pro Edition)
Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统)
前言
由于学校课程实验的要求,特意需要搭建hadoop的完全分布式系统,所以自己就蛋疼的配了,可惜关于MAC系统的Hadoop搭建材料太少,而且真正的基于校园网的配置基本上没有(基本是在一台电脑上进行,因此当在多台电脑上运行会有许多bug),因此这里想要能够将自己搭的过程想要分享给大家,可能有些配置的解释没有那么全面,所以希望大家见谅??
环境
- 基于Mac OSX 10.12.4(Sierra)、Ubuntu 17.04系统
- 虚拟机使用Parallel Desktop12(Mac专用虚拟机)(后面有提到需要升级到Pro Edition)、 VMWare WorkStation 9(Windows上的虚拟机)
- Hadoop采用的是官网下载的2.7.3(相对稳定)
- Hadoop Eclipse的plugins为2.7.3(某大神提供的已编译版本)(文章的最后提供的百度云链接地址)
实验目的
本次试验的目的是实现mac系统上面的主机作为master,mac上面的parallel desktop虚拟机上的linux系统作为slave1,windows10系统上VMWare WorkStation 9的linux系统作为slave2,最后实现分布式的WordCount程序(同时涉及一台主机上的配置和不同主机间的配置)
搭建Hadoop前的琐事(工欲善其事,必先利其器)
1.搭建Parallel Desktop上的虚拟机
1.将/etc/hostname修改为slave1(需要重启才能生效)
sudo vim /etc/hostname #若没有安装vim则使用vi代替
2.将Parallel Desktop12的网络的模式设置为共享网络
3.将Macbook的hostname修改为master(mac系统可以不需要重启)
sudo scutil —set HostName master #修改mac上的hostname
4.获取macbook以及linux系统下的ip地址(两个终端指令相同)
ifconifg #查看虚拟机的ip地址
5.通过获取来的ip地址修改/etc/hosts文件(linux将原有的127.0.1.1删除)
sudo vim /etc/hosts
6.linux系统安装openssh-server并启动(苹果系统自带支持ssh,所以不用安装)
sudo apt-get install openssh-server #安装openssh-server
sudo service ssh start #启动openssh-server
7.将mac系统上的防火墙关闭,并启动远程登录的机制(为了保证能够进行ssh)
8.前往master主机的~/.ssh目录,在master主机上面生成rsa秘钥(注意这里最好不要用dsa),并将其放入本机的~/.ssh文件夹内
cd ~/.ssh #前往~/.ssh目录,该目录用于存放ssh所用的公钥和私钥
ssh-keygen -t rsa #生成rsa秘钥(有提示出现,一直按回车默认设置)
cat id_rsa.pub >> authorized_keys #将rsa公钥放入authorized_keys中,作用是当通过ssh登录自己时不需要密码
#cat指令的作用是添加到尾部,在这里需要保证authorized_keys是可以改写的
9.将master主机的rsa公钥放入linux系统的~/.ssh/authorized_keys中(新生成文件)(免密码登录slave1)
scp id_rsa.pub jiangqian@slave1:~/.ssh/authorized_keys #注意这里jiangqian是mac机上面的主机名,记得更改
10.检查是否配置ssh成功
ssh master #检查自己
ssh slave1 #检查slave1
2.搭建Windows10上的虚拟机
1.打开VMWare, 点击Ubuntu 64-bit虚拟机的镜像
2.点击Edit,设置虚拟机的虚拟网卡
3.这里使用VMnet8作为NAT的转换端口,其它的端口都可以关闭,将子网设置为192.168.18.0(保留地址都可以)
4.将VMnet8设置为NAT(NAT的概念详见计算机网络),并点击NAT Settings进行配置
5.设置网关IP(保留地址的概念详见计算机网络),添加三个端口转换,这里的Virtual machine IP address通过ifconfig获取
温馨小提示:
这里必须要设置三个端口的转换,第一个端口是22号端口,这个端口是ssh需要使用的默认端口,而50010端口和50090端口都是在hdfs上传文件的时候需要开放的,如果没有进行端口转换会导致最后出现让人苦恼的bug,详细出错信息参见后面
6.设置linux系统的网卡,让其使用的是VMNet8(右键 -> Settings打开,选择Network Adapter)
7.右键点击windows10桌面的小电脑,选择"打开网络和共享中心",选择更改适配器设置
8.选择关于VMNet8的网卡,配置相应的IP地址
9.选择前面设置子网网段(4中的IP subnet)里面的一个IP地址作为该网卡的地址,设置好默认网关和DNS服务器
10.如配置Parallel Desktop12中的虚拟机一样,配置 /etc/hostname(slave2) 和/etc/hosts文件
11.同时将master和slave1主机的/etc/hosts文件中添加slave2的IP地址和相应的名字
12.在master主机上,在~/.ssh目录下,同样将id_rsa文件发送到slave2中,进行免密码登录
scp id_rsa.pub jiangqian@slave2:~/.ssh/authorized_keys #注意这里jiangqian是mac机上面的主机名,记得更改
13.验证是否成功配置
ssh slave2 #检查slave2
3.配置JAVA环境变量!!!!
温馨小提示:
MAC配置JAVA的环境变量就是麻烦,毕竟是竞争对手??,可能会遇到的一种情况就是如果普通的配置~/.bash_profile后,需要每次打开一个终端就要source一次,不然的话echo $JAVA_HOME的话结果为空。千万别被网上的坑爹的讲法给坑了,千万别蛋疼地重启!!配置方法详见下方
1.配置master(关键)的JAVA环境变量,通过/usr/libexec/java_home查看当前的java的绝对路径(如果打which java是引用路径)
/usr/libexec/java_home #查看当前的java路径(记得复制该路径)
2.打开~/.bash_profile并添加JAVA_HOME环境变量,并通过source使它生效
sudo vim ~/.bash_profile #打开环境变量配置的文件夹
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home #添加JAVA_HOME环境变量(所复制的路径)
3.在 ~/.zshrc 文件的末尾添加如下语句,使得每次新开终端都有效
sudo vim ~/.zshrc #打开zshrc文件
source ~/.bash_profile #添加该语句
source ~/.zshrc #使得该文件生效
4.配置linux的路径(两个slave的配置一摸一样,所以只选择一个来讲),首先是安装java
java -version #查看是否安装JAVA
sudo apt get install default-jre #安装jre
sudo apt get install default-jdk #安装jdk(可能不需要装)
5.寻找java的绝对路径,通过ls -ll寻找(可能有更好的办法??)
whcih java #寻找java的绝对路径
ls -ll /usr/bin/java
ls -ll /etc/alternatives/java #查看绝对路径
sudo vim ~/.bashrc #添加环境变量(直觉告诉我绝对路径是下面这个。。)
export JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64 #添加JAVA_HOME环境变量(所复制的路径)
source ~/.bashrc #使得该文件生效
草蛋,终于可以开始搭Hadoop了~~~
1.在官网或者通过下面的百度云盘链接下载Hadoop2.7.3(记得下载二进制文件,不用编译了!)
Hadoop2.7.3的云盘链接: Hadoop2.7.3 提取码为: 7udu
1.将该文件解压到/usr/local的目录下,记住不要忘记了加-C的参数,不然会解压失败!!
sudo tar -zxf ~/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/ #前往该文件夹
sudo mv ./hadoop-2.7.3/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R jiangqian ./hadoop # 修改文件权限,权限是你当前的用户
2.为了操作方便,将该文件的bin文件夹和sbin文件夹的路径放入~/.bash_profile下,便于操作指令
sudo vim ~/.bash_profile #打开环境变量配置的文件夹
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin #添加sbin和bin的文件夹路径
2.配置集群/分布式环境(这里需要修改4个xml文件、两个sh文件)(这里是在master机上操作)
1.配置yarn-env.sh和hadoop-env.sh文件,添加master机上的环境变量(建议用sublime text打开)
echo $JAVA_HOME #获取当前JAVA环境变量
sudo vim /usr/local/hadoop/etc/hadoop/yarn-env.sh #打开yarn-env.sh文件
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home #添加JAVA_HOME环境变量(所复制的路径)
sudo vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh #打开yarn-env.sh的文件夹
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home #添加JAVA_HOME环境变量(所复制的路径)
2.配置core-site.xml文件(说白了就是复制粘贴大法)
sudo vim /usr/local/hadoop/etc/hadoop/core-site.xml #打开core-site.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.mamicode.com/configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<!-- master是hostsname -->
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
</configuration>
3.配置hdfs-site.xml文件,这里注意,dfs.replication的含义就是备份,备份的数目不要超过节点数(slave)(这里是2),不然会有问题
sudo vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml #打开hdfs-site.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.mamicode.com/configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
4.配置mapred-site.xml文件,这里注意,原来没有修改的文件是没有这个文件的,需要重新命名(默认文件名是 mapred-site.xml.template)
cd /usr/local/hadoop/etc/hadoop #前往目标文件夹
sudo cp mapred-site.xml.template mapred-site.xml #创建mapred-site.xml文件(拷贝template文件夹的内容)
sudo vim /usr/local/hadoop/etc/hadoop/mapred-site.xml #打开mapred-site.xml文件
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="http://www.mamicode.com/configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
5.配置yarn-site.xml(守护进程)文件
sudo vim /usr/local/hadoop/etc/hadoop/yarn-site.xml #打开yarn-site.xml文件
<?xml version="1.0"?>
<configuration>
<?xml version="1.0"?>
<configuration>
<property>
<!-- 注意,这里是master机的hostname -->
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- <property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property> -->
</configuration>
</configuration>
6.修改slaves文件(差点忘了~~),记得添加两台slaves主机的hostname!
sudo vim /usr/local/hadoop/etc/hadoop/slaves #打开slaves文件
slave1
slave2
3.将master主机上配置好的文件复制到两台slave机上,并修改yarn-env.sh以及hadoop-env.sh的JAVA环境变量(这里两台机都要配,操作而且一样,这里演示一个即可)
cd /usr/local/ #前往hadoop文件夹所在的上一层
scp -r ./hadoop jiangqian@slave1:/tmp/ #将hadoop文件夹复制到slave1主机的tmp文件夹,这里jiangqian是指slave1的主机名字
scp -r ./hadoop jiangqian@slave2:/tmp/ #将hadoop文件夹复制到slave2主机的tmp文件夹,这里jiangqian是指slave2的主机名字
> 温馨小提示:
这里由于ssh的权限原因,不能直接复制到slave机子的/usr/local文件夹的目录下,因此需要先复制到/tmp文件夹的目录下,然后再从tmp文件夹转移到/usr/local文件夹下(有点类似于黑客入侵的感觉~~)
ssh slave1 #通过ssh登录slave1主机, 这里也可以直接在slave2主机上进行操作
sudo mv /tmp/hadoop /usr/local/ #将tmp文件夹下的hadoop移动至/usr/local文件夹下
>!!温馨大提示!!:
Warning!Warning!
老大们,千万千万不要将mv指令写成rm指令,坑爹的rm指令也可以支持这种格式的递归删除,小编就是糙心将mv指令写成rm指令,结果导致啊电脑啊重新装~,hadoop重新搭~,教程重新写~!!!!!!,千万别组合sudo和rm加上-r指令,不然~!
cd /usr/local/ #前往/usr/local文件夹下
sudo chown -R jiangqian:jiangqian ./hadoop # 修改文件权限,权限是你当前slave用户的用户名以及用户组(没有创建则用root也行),不过很危险呀补充可能用到的操作:echo $JAVA_HOME #获取当前JAVA环境变量
ls -ll #来查看用户名和用户组
sudo passwd root #用来创建root用户的密码(大大哥用户)(要是不记得的话)
sut root #用来登录root用户(大大哥用户)
adduser jiangqian sudo #用来创建jiangqian的用户,并且加入sudo的用户组(说白了就是可以用sudo指令)(需要登录到root用户才能执行这个操作)
sudo vim /usr/local/hadoop/etc/hadoop/yarn-env.sh #打开yarn-env.sh文件
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 #添加JAVA_HOME环境变量(所复制的路径)
sudo vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh #打开yarn-env.sh的文件夹
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 #添加JAVA_HOME环境变量(所复制的路径)
温馨小提示:
之前跑过伪分布式或者之前配置完全分布式失败需要进行下面清除临时文件以及日志的操作,不然会出错(datanode起不来)!!(记得三台主机都得删除~)
cd /usr/local/hadoop #前往目标文件夹,在该文件夹下存放着日志和临时文件的文件夹
sudo rm -r ./tmp #删除临时文件存放的文件夹
sudo rm -r ./logs/* #删除日志文件夹里面的所有日志文件
4.好了,老大们,拔剑吧,开始跑了!(记得开始跑之前关闭windows、linux和mac上面的防火墙!!!)
1.首次(准确说是每次删除了tmp和logs文件后)记得在master主机上格式化namenode
cd /usr/local/hadoop #前往目标文件夹
hdfs namenode -format #格式化namenode
2.启动hadoop
start-all.sh #启动hadoop
温馨小提示:
这里小编贪图方便就直接用了start-all.sh,但规范的用法应该如下:
start-dfs.sh
start-yarn.sh
3.检查是否启动成功(关键是结点是否都live起来了)
首先可以通过Web来查看:http://master:50070/
hdfs dfsadmin -report #或者通过命令行直接查看
4.在hdfs上创建相应的文件,同时上传/usr/local/hadoop/etc/hadoop文件夹中所有的xml文件
hdfs dfs -mkdir -p /user/jiangqian #创建jiangqian的文件夹,这里的jiangqian是指master主机的主机名字
hdfs dfs -mkdir -p input #创建input文件夹,默认是在/user/jiangqian的文件夹下
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input #将对应文件夹所有的xml文件上传到hdfs
!!温馨大提示!!:
这里如果没有将50010端口和50090端口打开(其实主要是50010端口)打开的话,会出现一个非常常见的问题,那就是出现下面的一大堆错误:
而网上的错误回答真的是一本正经地胡说八道,有些瞎扯蛋的人说的datanote没起来,怎么可能??都live起来了!,有些人说是内存不够,去尝试这个原因小编吃了不少苦头!不小心把系统文件夹给删了??~,而小编也是因为这个错误,苦恼了许久,幸好有可靠的师姐和大神的帮助以及出错信息才发现没有打开50010端口,然后去就去把虚拟机的两个端口50010和50090打开,VMWare的方法前面也已经提到了,而下面这一点则是重点讲Parallels Desktop如何打开50010和50090端口!
5.如果出现了未开放端口的错误(或者其它失败的错误),需要先停止hadoop,再清除tmp文件目录和logs日志
stop-all.sh #停止hadoop
cd /usr/local/hadoop #前往目标文件夹,在该文件夹下存放着日志和临时文件的文件夹
sudo rm -r ./tmp #删除临时文件存放的文件夹
sudo rm -r ./logs/* #删除日志文件夹里面的所有日志文件
6.配置Parallels Desktop12,开放50010和50090端口!(钱的代价)
温馨小提示
这里Parallels Desktop的网络的模式应该选择是的共享模式(shared Network),Parallels Desktop中,共享模式就相当于NAT转换的形式
由于不知道怎么使用Parallels Desktop,所以并不知道怎么开放端口,后来找到了,但是也发现了一个惊人的事实,就是如果想要做tcp端口的规划,就需要钱!!,个人模式无法进行端口的设置!!
小编脑子一热,为了作为先行者,就升级了Pro Edition??哭了~。
7.通过telnet验证主机是否开放50010端口和50090端口
温馨小提示
这里telnet的是master主机而不是slave1(虚拟机) ,因为该虚拟机的端口是通过master主机来做端口转换来实现与外界的交流,因此需要去telnetmaster的端口而不是slave
8.运行WordCount小程序,验证结果(结果不正确可能是由于slave1和slave2不可达(无法ping通))
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output ‘dfs[a-z.]+’ #运行hadoop文件夹自带的wordCount小程序
由于小编还找不到问题,所以这个问题可能待到以后再解决,先看看能不能运行wordCount程序吧??可能的猜想:
可能是因为master上的虚拟机不能通过作为一个独立的主机(只是有可能),所以导致slave1和slave2以及master之间不能很好地通信,最好将三者分开吧??然后slave2和slave1之间可能会不可达,也可能会导致失败(来自华为大神香飘叶子的猜想)
9.退出hadoop
stop-all.sh #停止hadoop
>温馨小提示
>这里小编还是偷懒了,正规的用法是:
> >
> >stop-dfs.sh
stop-yarn.sh #停止守护进程
搭建可视化的hadoop平台(装eclipse hadoop plugins)
1.下载并安装eclipse的neon2的版本(neon3的版本的兼容性不好~)
eclipse neon2网盘地址: eclipse neon2 提取码为: jdwd
2.下载并安装eclipse hadoop2.7.3 plugins插件
eclipse hadoop 2.7.3plugins网盘地址: eclipsehadoop 2.7.3plugins 提取码为: 5u52
3.将该插件解压(双击或者用前面的指令)并安装到neon2的相应的文件夹中(plugins文件夹)
Cotents->Eclipse->plugins
4.打开neon2,并进行相关的操作
温馨小提示:
在打开neon2之前,请保持hadoop已经打开(start-all.sh)
5.配置好后,接下来的操作请参照厦门大学hadoop实验室的mapreduce的配置:
厦门大学hadoop实验室: 厦门大学hadoop实验室的mapreduce的配置
温馨小提示:
6.运行程序并显示结果(希望要成功哦~~~)
实验总结
本次实验为了写这个教程花费小编不少心血,而且搭hadoop搭到都想吐了,但是一想到现在网上的教程一水一大把,所以才想要写这个教程给大家节省宝贵的时间,虽然最后验证自带的hadoop包出了问题(有空小编会努力找出问题~~),但是最后的整体结果是一致的,所以在这里要感谢Dragon大神和何大神以及师姐的帮忙,不然这篇教程不会出现在这里~~,虽然自己写的不好,希望大家勿喷~~!这些都是纯手工打的哦~
参考的文章
不得不说好的文章教程会省很多事情,小编这里强烈推荐厦门大学Hadoop的教程~!,大家多看看这个实验室
的东西,比较标准!厦门大学hadoop实验室: 厦门大学hadoop2.6.0集群安装配置
厦门大学hadoop实验室: 厦门大学hadoop实验室的mapreduce的配置
关于mac配置hadoop的教程: 关于mac配置hadoop的教程
关于配置路径的生效问题: 配置路径的生效问题
Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统 + Parallels Desktop 12 Pro Edition)