首先要说明:这里采用了阿里云,腾讯云服务器来搭建集群。当然,在vm中开多台虚拟机来实现集群环境搭建,此教程也同样适用。下面切入正题:
1.vmware虚拟机的安装(云服务器搭建忽略此点)
这里就自行选择一个版本的vmware,来进行安装操作。
2.linux安装(云服务器搭建忽略此点)
关于linux的具体的安装教程可另行搜索,这里提几点建议:
- 建议安装没有图形界面的linux,比如ubuntu server,体积小,占内存少,毕竟搞hadoop也用不到什么图形界面。
- 安装的时候一般会先创建一个普通用户,用此用户登录。登陆后,输入:sudo passwd root ,就可以进行root用户密码的设置
- dpkg-reconfigure console-setup 用来设置终端的字体格式
3.ssh配置链接
主从主机之间进行通信、对各个主机的统一控制,都需要配置ssh服务。
- 在linux上开启ssh服务
- apt-get install openssh-server 安装ssh组件
- 这个教程涉及的hadoop集群,默认都是在root用户下进行操作。但ubuntu下默认不允许用ssh登录root用户,故需要进行配置:
- vim /etc/ssh/sshd_config
- PermitRootLogin=yes 找到该行,做如此修改
- /etc/init.d/ssh start 启动ssh服务
- ps -e | grep sshd 查看ssh服务进程是否正常启动
- (vm虚拟机搭建注意此点)如果每次打开vm中的虚拟机,ip发生变更,那就要进行相应配置变更,为了避免麻烦,故这里:
- 将虚拟机关闭,并在vm中设置该虚拟机的网络适配器为:NAT模式
- 在windows上使用ssh客户端工具
- 这里我用了secureCRT,他有一个优点:可以直接用其提供的ftp,从windows向虚拟机传输文件
- Xshell也非常不错
4.JDK安装与配置
- jdk压缩包
- 可通过windows去Oracle下载好,再利用ftp传到各个节点
- 也可在节点的终端里下载:
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz
- 将jdk压缩包解压到指定目录:tar xzvf xxxname -C /usr/local
- 进入/usr/local给jdk1.8.0_73 改名:mv jdk1.8.0_73 jdk
- 修改配置环境变量:vim /etc/profile 打开后,在文件最下面添加:
export JAVA_HOME=/usr/local/jdk export PATH=\$PATH:\$JAVA_HOME/bin: export CLASS_PATH=\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
- source /etc/profile 让配置生效,输入java -version看是否成功
5.Hadoop的下载安装
- 直接终端下载:
wget http://mirrors.shu.edu.cn/apache/hadoop/common/hadoop-2.8.4/hadoop-2.8.4.tar.gz
- 若到 www.apache.org 上下载hadoop,记得,是binary的那一个版本
- 将压缩包解压到/usr/local目录
- 改名字 mv hadoop-2.7.2 hadoop
- 进行环境变量配置:vim /etc/profile
export JAVA_HOME=/usr/local/jdk export HADOOP_HOME=/usr/local/hadoop export PATH=\$PATH:\$JAVA_HOME/bin:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin: export CLASS_PATH=\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
- source /etc/profile 让配置生效
6.Hadoop配置
- 为了配置方便,为每台电脑配置一个主机名:
- vim /etc/hostname
- 各个节点中,主节点写入:master , 其他从节点写入:slavexx
- 如果这样修改不能生效,则继续如下操作
- vim /etc/cloud/cloud.cfg 做preserve_hostname: true 修改
- reboot重启,这时应该就修改过来了
- 主机名称与ip的绑定:(云服务器配置这里有大坑)
- vim /etc/hosts 添加如下信息
- 本机ip 本机hostname
- 其他节点xx的ip 其他节点xx的hostname
- 需要注意的是,如果是云服务器搭建,一般买来的服务器会提供一个内网ip,一个公网ip,这里配置时,其他节点ip是公网ip,本机ip是ifconfig得到的内网ip
- 上面配置生效可能要reboot重启
- 设置ssh免登录处理,也就是master节点无密码登录各个slave节点:
- 根目录中,查看是否有.ssh的配置文件,有就要先删除: rm -rf ~/.ssh
- 在master的节点上生成ssh key: ssh-keygen -t rsa 一路回车
- 将公钥信息保存到另一个文件:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 将公钥信息复制到id_rsa_master.pub:
cp .ssh/id_rsa.pub ~/id_rsa_master.pub
- 将此id_rsa_master.pub文件,复制到各个slave节点的~/.ssh目录中去(可以通过secureCRT提供的ftp功能)
- 免登录测试:ssh root@slavexx 此时就进入了从节点slavexx的终端,退出可以用exit
- 在/usr/local/hadoop 中创建如下目录, 如果hadoop出问题,需要重新配置时,这些文件记得彻底删除再重新创建
mkdir hdfs hdfs/tmp hdfs/data hdfs/name
- 进入 cd /usr/local/hadoop/etc/hadoop ,准备对如下几个文件进行配置:
- 配置core-site.xml文件,在configuration标签中添加如下代码,注意hadoop.tmp.dir的value目录与刚刚创建的tmp目录要一致
<property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/hdfs/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property>
- 配置 hadoop-env.sh文件,关联hadoop使用的语言,就是jdk
# The java implementation to use. export JAVA_HOME=/usr/local/jdk
- 配置 yarn-env.sh文件
# some Java parameters export JAVA_HOME=/usr/local/jdk
- 配置hdfs-site.xml,在configuration标签中添加如下代码。注意其中dfs.namenode.name.dir和dfs.datanode.data.dir的value和之前创建的/hdfs/name和/hdfs/data路径一致;因为我只有一个从节点slave1,所以dfs.replication设置为1
<property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/hdfs/name</value> <final>true</final> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/hdfs/data</value> <final>true</final> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>master:9001</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.permissions</name> <value>true</value> </property>
- 复制mapred-site.xml.template模板文件:cp mapred-site.xml.template mapred-site.xml ,然后在configuration标签中添加如下代码:
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
- 配置yarn-site.xml,在configuration标签中添加如下代码:
<property> <name>yarn.resourcemanager.address</name> <value>master:18040</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:18030</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:18088</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:18025</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:18141</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
- 配置slaves 文件:vim slaves 添加所有从节点的hostname,然后保存退出
- 配置masters文件:vim masters 添加主节点的hostname,然后保存退出
- 要确保所有节点的防火墙已经关闭,以防出现一下错误:(云服务器配置这里有大坑)
- could only be replicated to 0 nodes instead of minReplication (=1). There are …
- ubuntu中的防火墙是ufw防火墙:状态查看:ufw status 开启:ufw enable 关闭:ufw disable
- 需要注意的是,如果是云服务器搭建,有的云服务平台会默认开启一些端口的防火墙,比如阿里云的服务器就默认开启了三个端口的防火墙,此时要想在不同节点之间成功传输数据,就要:1,把ubuntu里的防火墙关了 2,把阿里云服务器上提供的防火墙端口全部打开。
- 各个节点都要进行如上配置
- 在master节点格式化系统: hdfs namenode -format
- 启动hadoop:start-all.sh
- 终端输入:jps 命令,若主节点出现如下进程:
从节点出现如下进程:5664 SecondaryNameNode 14392 Jps 5821 ResourceManager 5439 NameNode
则说明配置成功21557 NodeManager 21432 DataNode 24558 Jps
- 接下来可以试着编写一个hadoop界的“hello world”程序:wordcount,来测试一下配置好的集群了。