本文建立在已经把虚拟机ip环境等已经下载好情况下。
那么,直接开始今天的正题:
搭建集群
环境准备
这里提供两种思路:一种是将一台直接搭建好,后面的克隆或者copy虚拟机
一种是3台并进,多次进行虚拟机之间文件互传,各有利弊,第一种方式容易漏改ip等问题,第二种方式简单明了,一遍过手,就是步骤稍微多一点,这里采用第二种方式:
1、配置服务器(我这里是以3台为例)
1个主节点:hadoop1(192.168.183.161),2个(从)子节点,hadoop2(192.168.183.162),hadoop13(192.168.183.163)
2、配置主节点名hadoop1(192.168.183.161)
在命令行输入: vi /etc/sysconfig/network
添加内容:
NETWORKING=yes
HOSTNAME=hadoop1
配置两台子节点名(192.168.102.136)和(192.168.102.137):
vi /etc/sysconfig/network
添加内容:
NETWORKING=yes
HOSTNAME=hadoop2
vi /etc/sysconfig/network
添加内容:
NETWORKING=yes
HOSTNAME=hadoop3
这块再多改一个东西 vi /etc/hostname
加上主机名 hadoop1,每个节点都执行各自的主机名
注意vi /etc/sysconfig/network 记得去掉 #号那一行,有时候会因为这个改不成功
3、配置hosts
打开主节点的hosts文件,将文件的前两行注释掉 (注释当前主机的信息)并在文件中添加所有hadoop集群的主机息。
在命令行输入: vi /etc/hosts
添加3台服务器的节点名信息(这个也就是后面用的映射)
192.168.183.161 hadoop1
192.168.183.162 hadoop2
192.168.183.163 hadoop3
保存之后,将主节点的hosts分别拷贝到其他两个子节点
命令行分别输入:
scp /etc/hosts root@192.168.183.162:/etc/
scp /etc/hosts root@192.168.183.163:/etc/
话不多说 重启吧,然后我们继续,可以看到主机名已经更改了
4、关闭防火墙(每一台机器上面执行)
a.查看防火墙状态
firewall-cmd --state
b.停止firewall
systemctl stop firewalld.service
c.禁止firewall开机启动
systemctl disable firewalld.service
5、时间同步
命令行输入:yum install ntp 下载ntp插件 ,
下载完成后 命令行输入:ntpdate -u ntp1.aliyun.com
然后命令行输入:date
如果出现如下情况表示配置成功:
6、配置ssh无密码访问(这步很关键,请用心)
这步的核心原理是:将每台机器的公钥全部放至同一个文件中(authorized_keys)
生成公钥密钥对
在每个节点上分别执行:
命令行输入:ssh-keygen -t rsa
一直按回车直到生成结束
执行结束之后每个节点上的~/.ssh/目录下生成了两个文件 id_rsa 和 id_rsa.pub
cd ~/.ssh/
其中前者为私钥,后者为公钥
这块用个简单的方法,以前的有点复杂:
在每台机器上执行这个命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop1
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop2
ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop3
3台都执行,会自动把密钥加载到 authorized_keys 文件中
在主节点上执行:
命令行输入:cp id_rsa.pub authorized_keys
将子节点的公钥拷贝到主节点并添加进authorized_keys
将两个子节点的公钥拷贝到主节点上
分别在两个子节点上执行:
scp /root/.ssh/id_rsa.pub root@hadoop1:/root/.ssh/id_rsa_hadoop2.pub
scp /root/.ssh/id_rsa.pub root@hadoop1:/root/.ssh/id_rsa_hadoop3.pub
然后在主节点上,将拷贝过来的两个公钥合并到authorized_keys文件中去
主节点上执行:
cat id_rsa_hadoop2.pub>> authorized_keys
cat id_rsa_hadoop3.pub>> authorized_keys
将主节点的authorized_keys文件分别替换子节点的authorized_keys文件,此时主节点上面的内容已经是最全的了,
主节点上用scp命令将authorized_keys文件拷贝到子节点的相应位置,
scp authorized_keys root@hadoop2:/root/.ssh/
scp authorized_keys root@hadoop3:/root/.ssh/
最后测试是否配置成功
这块有可能会ssh 失败,还需要输密码:可做以下操作:
要保证:
~/.ssh需要是700权限
authorized_keys需要是644权限
chmod 700 ~/.ssh
chmod 644 ~/.ssh/authorized_keys
在hadoop1上分别执行
ssh hadoop2
ssh hadoop2
相互之前也要能ssh成功
能正确跳转到两台子节点的操作界面即可,同样在每个子节点通过相同的方式登录主节点和其他子节点也能无密码正常登录就表示配置成功。
这里的配置方式可以有多种操作步骤,最终目的是每个节点上的/root/.ssh/authorized_keys文件中都包含所有的节点生成的公钥内容。到此免密已经OK
7、jdk安装
配置环境变量, 编辑profile文件:
vi /etc/profile
在profile文件末尾添加以下代码:
export JAVA_HOME=/usr/local/jdk1.8.0_191
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
保存,source /etc/profile 生效配置文件
测试是否安装成功:java -version
至此环境已经OK,开始开心的安装hadoop集群
8、安装hadoop
解压安装包:tar -zxvf hadoop-2.7.7.tar.gz
tar -zxvf hadoop-2.7.0.tar.gz -C /home/software/soft/ 解压到指定目录
cp -r jdk1.8.0_11/ /home/software/soft/ 复制到指定目录
完事儿后配置环境变量:
vi /etc/profile
在末尾添加:
export HADOOP_HOME=/usr/local/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存后使新编辑的profile生效:source /etc/profile
hadoop配置
修改文件:
1:hadoop-env.sh ——>jdk
2:yarn-env.sh ——>jdk
3:core-site.xml
4:hdfs-site.xml
5:mapred-site.xml
6:yarn-site.xml
7:slaves ——>子节点,节点
其中hadoop-env.sh和yarn-env.sh里面都要添加jdk,接下来一个一个来
hadoop-env.sh中
添加如下代码: export JAVA_HOME=/home/usr/java/jdk1.8.0_11 到如下位置:
yarn-env.sh中
添加如下代码: export JAVA_HOME=/home/usr/java/jdk1.8.0_11 到如下位置:
core-site.xml中
添加如下代码:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/usr/java/hadoop-2.7.0/temp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
注:上面代码中file后的路径下的temp文件夹需要自己创建
此处做个更新:hadoop.tmp.dir 这个参数配置的目录建议放在hadoop整体目录之外的某个地方,扩容时scp的时候会很方便 --20221026
hdfs-site.xml中
添加如下代码:
此处做个更新:dfs.namenode.name.dir 、dfs.datanode.data.dir 这两个参数配置的目录建议放在hadoop整体目录之外的某个地方,扩容时scp的时候会很方便,否则会比较麻烦 --20221026
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop1:9001</value>
</property>
<!-- 设置namenode.name目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/usr/java/hadoop-2.7.0/dfs/name</value>
</property>
<!-- 设置namenode.data目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/usr/java/hadoop-2.7.0/dfs/data</value>
</property>
<!-- 设置副本个数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 开启webHDFS -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.web.ugi</name>
<value>supergroup</value>
</property>
</configuration>
注:上面代码中file后的路径下的/dfs/data文件夹需要自己创建
mapred-site.xml中
(注意要将mapred-site.xml.template重命名为 .xml的文件 Mv mapred-site.xml.template mapred-site.xml)
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop1:19888</value>
</property>
</configuration>
yarn-site.xml中
添加如下代码:
<configuration>
<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>hadoop1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoop1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoop1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>hadoop1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop1:8088</value>
</property>
</configuration>
slaves中
修改成:
hadoop2
hadoop3
主节点上面该配的已经配完,下面是copy子节点的了
主节点上执行:
scp -r /home/usr/java/hadoop-2.7.0 root@hadoop2:/home/usr/java
scp -r /home/usr/java/hadoop-2.7.0 root@hadoop3:/home/usr/java
拷贝profile到子节点
主节点上执行:
scp /etc/profile root@hadoop2:/etc/
scp /etc/profile root@hadoop3:/etc/
在两个子节点上分别使新的profile生效:
source /etc/profile
格式化主节点的namenode
主节点上进入hadoop目录
然后执行:
./bin/hadoop namenode -format
新版本用下面的语句不用hadoop命令了
./bin/hdfs namenode -format
提示:successfully formatted表示格式化成功
记得加上这个配置,可避免集群环境停不下来的问题:
此时已经完成:
启动hadoop
主节点上在hadoop目录下执行:
./sbin/start-all.sh
主节点上jps进程如下:
NameNode
SecondaryNameNode
ResourceManager
每个子节点上的jps进程如下:
DataNode
NodeManager
如果这样表示hadoop集群配置成功
此时整个集群完成!!!!是不是很简单
------------------------------------------------------------------------------
备注:动态扩容的方法:参考博主另一篇文章