- 环境
- 主节点操作系统:macOS High Sierra 10.13.3
- 虚拟机软件:Parallels Desktop
- 从节点操作系统:Centos7
- Centos7 jdk版本:1.8.0_144
- Mac jdk版本:1.8.0_171
- Hadoop版本:Hadoop 2.8.1
本文是在Mac上创建两个虚拟机,两个虚拟机和Mac主机组成三个节点,主节点为Mac,两个从节点为centos7。
- 安装虚拟机
- 安装Parallels Desktop虚拟机软件
- 打开Parallels Desktop
- 选择相关镜像安装(虚拟机镜像为CentOS-7-x86_64-Everything-1611.iso)
首次安装好centos7进入桌面,发现没有输入法可以选择,只能输入英文。
解决方法如下:
- 选择桌面的“应用程序”—>“系统工具”
- 找到“设置”—>“区域和语言”
- 在输入源中添加汉语(中国)
- 接着选择其中的“汉语(Intelligent Pinyin)”,添加即为成功
- 安装JDK
- Centos7下配置jdk环境:
(1)在根目录下创建文件夹app(用于存放安装的集群组件)
cd /
mkdir app
(2)解压jdk压缩包
tar -zxvf jdk-8u144-linux-x64.tar.gz
(3)进入解压后的jdk文件夹,并获取绝对路径
cd jdk1.8.0_144
pwd
(4)Centos7自带有openjdk,所以在配置之前先删除掉自带openjdk,命令如下:
rpm -qa | grep java
sudo rpm -e —nodeps xxx-openjdk-xxx
(5)环境变量配置
#命令如下:
vim ~/.bash_profile
#在文件最后添加如下代码:
export JAVA_HOME=/app/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
#保存后,source一下使配置生效
source ~/.bash_profile
(6)检验是否配置成功:java -version - Mac下配置jdk环境
(1)下载jdk安装包.dmg
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)下载完成后直接点击安装(不需要修改安装路径)
(3)找到安装路径
#安装路径为:
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/ Contents/Home
(4)配置环境变量
vim ~/.bash_profile(Mac系统中找不到.bash_profile,需要自己创建)
#添加如下代码:
(5)保存后,执行:source .bash_profile
(6)检测是否配置成功:java -version
- 修改各个节点的hostname
- Mac节点(master)
#执行以下命令:
sudo scutil --set HostName master - Centos7(slaver1,slaver2)
修改/etc/hostname文件,在其中把之前的名字删除,只留下slaver1(在另一个centos上修改为slaver2)
修改完成后重启系统使之生效
- 修改各个系统的hosts文件
此方法Mac和centos系统上的操作是一样的,所以就统一说明:
- 输入ifconfig查看各个系统上的IP地址,并保证ping命令相互可以ping通,记录各个系统的IP地址
- 修改/etc/hosts文件,在文件中添加以下3条内容(以下内容仅代表本系统各个节点的IP地址):
10.xxx.xx.2 master
10.xxx.xx.5 slaver2
10.xxx.xx.4. slaver1
- 安装及测试SSH
- Macbookpro、centos7都自带ssh,所以不需要再安装ssh
- 测试的时候直接在终端输入:ssh IP地址(由于上面已经修改了hosts文件,所以ssh后面的IP地址可以用相应的机器名代替如master、slaver1、slaver2)
- 注意⚠️:在测试过程中遇到一个问题:Mac到centos的远程登陆都是成功的,但是通过centos远程登陆Mac一直不成功,显示连接拒绝。在这种情况下一般的解决方法有:1.查看Mac系统的防火墙是否关闭;2.Mac系统的远程登陆没有开启。开启的方法为:找到“系统偏好设置”—>“共享”—>勾选上“远程登录”选项即可。
- 配置ssh免密码登陆
- 在Mac和centos系统中,分别执行:ssh-******命令,一路回车下来会在.ssh文件夹下面生成id_rsa和id_rsa.pub私钥和公钥。
- 以Mac系统为例。在.ssh下创建一个文件authorized_keys,并且将三个系统中各自的id_rsa.pub(公钥)的内容复制到authorized_keys中。保存后,将这个文件分发至另外两个系统(slaver1和slaver2),命令如下:
scp ./authorized_keys [email protected]:~/.ssh/
scp ./authorized_keys [email protected]:~/.ssh/ - 测试:ssh slaver1/ssh slaver2/ssh master(三个系统之间就可以实现免密码登录了,第一次实验的时候可能需要密码。实质就是:在各自.ssh文件夹下的authorized_keys中添加对方的id_dsa.pub公钥。)
- 安装配置Hadoop环境
此过程在master节点:
- 解压缩包
- 首先进入根目录下app文件夹,切换到root用户:Mac(sudo su)centos(su)
- 更改文件夹权限用户名和用户组
chown -R hongqiang:staff app/ (Mac系统)
chown -R hongqiang:hongqiang app/ (centos系统) - 解压hadoop包
tar -zxvf hadoop-2.8.1.tar.gz - 解压后可以看到一个hadoop-2.8.1的文件夹,切换到文件夹内
cd hadoop-2.8.1
- 创建以下文件夹(之后在配置文件中有用到)
- mkdir hfs
- mkdir hdfs/name
- mkdir hdfs/data
- mkdir tmp
-
进入Hadoop配置文件夹
cd /app/hadoop-2.8.1/etc/hadoop -
配置hadoop-env.sh文件
- 修改JAVA_HOME值为当前系统jdk的安装路径
- 注意⚠️:JAVA_HOME的值对应jdk的安装路径,Mac系统和centos系统的jdk安装路径不同,要做相应的改变
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
- 配置slaves
将内容修改为:
master
slaver1
slaver2
- 配置core-site.xml文件
添加以下内容:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop-2.8.1/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slaver1:2181,slaver2:2181</value>
</property>
<property>
<name>hadoop.proxyuser.hongqiang.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hongqiang.groups</name>
<value>*</value>
</property>
</configuration>
- 配置hdfs-site.xml文件
添加以下内容:
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/app/hadoop-2.8.1/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/app/hadoop-2.8.1/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
- 配置mapred-site.xml文件
添加以下内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- 配置yarn-site.xml文件
添加以下内容:
<configuration>
<!-- Site specific YARN configuration properties -->
<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>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
- 将配置好的hadoop2.8.1文件夹远程拷贝到另外的两个节点
注意⚠️:配置文件中有些地方,根据每个节点不同路径也要做相应的改变。特别是jdk的安装路径
scp -r hadoop2.8.1 [email protected]:~/app/
scp -r hadoop2.8.1 [email protected]:~/app/
- 在各个系统中配置hadoop环境变量
在.bash_profile中添加如下内容:
export HADOOP_HOME=/app/hadoop-2.8.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
centos7系统和Mac系统一样的操作(添加之后,source一下,使之生 效)
- 启动hadoop集群
- 首先格式化namenode
hadoop namenode -format - 启动hadoop集群
start-all.sh
- 分别在各个节点执行jps,查看相关进程是否启动成功
至此,hadoop集群搭建成功!
注意⚠️: 在Mac系统执行hadoop fs -ls /时,出现如下警告:
18/06/08 13:55:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
原因: hadoop-2.8.1.tar.gz安装包是在32位机器上编译的,64位(Mac系统)的机器加载本地库.so文件时出错,不影响使用。(hadoop中lib目录下的native本地库出问题)
解决方法: 下载hadoop源码,重新编译一下,然后将编译后的native文件替换掉之前$HADOOP_HOME/lib/native文件夹即可。(替换掉后需要重启hadoop集群)
- 执行测试程序wordcount
- 在hdfs上创建input文件夹,用于存放待测文件(此处以hadoop自带的README.txt文件为例)
hadoop fs -mkdir /input - 将README.txt文件上传到hdfs上
hadoop fs -put README.txt /input/ - 进入到hadoop-2.8.1/share/hadoop/mapreduce文件夹下,并调用Hadoop自带案例,执行下面单词计数程序:
hadoop jar hadoop-mapreduce-examples-2.8.1.jar wordcount /input /output
注意⚠️: 在执行此程序之前,在HDFS上一定不能存在output文件夹,如果存在,需要先删除
- 程序执行完成后,可通过如下命令查看
hadoop fs -ls /output
hadoop fs -cat /output/part-r-00000
- 集群搭建相关安装包
- Parallels Desktop:https://pan.baidu.com/s/1z_wogkEsBX3tsjf0uLtl8w
- Centos7 jdk:https://pan.baidu.com/s/1kKdUm2gXN6CBkU2_bpK5FQ
- Mac jdk:https://pan.baidu.com/s/1dZ21tX4ioD132e1-7wPbJQ
- Hadoop2.0安装包:https://pan.baidu.com/s/1BhFubbj3hVR4PYsDxodHWQ
- 编译后的native文件:https://pan.baidu.com/s/1YqlBxldMdpyCjPn-u4SAVw