前言
无论一开始安装后的主机名和普通用户有那些, 现在三台机器都要保证拥有hadoop普通用户(名字可以随便改).
这里博主所有的普通用户都为:hadoop, 密码都为:123456
创建hadoop用户, 并修改密码:
useradd hadoop
passwd hadoop
三台主机的主机名分别为:
master
slave1
slave2
1. 免密登陆(自身和节点与节点之间)和IP隐射
映射是为了后面主节点与从节点之间的联系只需要通过一个名称即可, 而不在需要具体的IP地址.
免密是为了主节点启动从节点的服务是通过ssh服务, 如果不能免密, 那么进程会等待输入正确的密码, 免密后就可以直接运行.
- 自身免密登陆
三台Linux分别执行如下命令:
# 生成.ssh目录
ssh localhost
# 生成密钥(一直回车)
ssh-keygen -t rsa
# 将密钥写入authorized_key, 实现自身登陆自己免密
cat .ssh/id_rsa.pub >> authorized_keys
注:
由于从节点是Centos, 执行玩上述3步骤后, 还需要设置权限:
在两个从节点分别执行:
chmod 600 .ssh/*
最终 ssh 目录结构如下:
执行如下命令, 若无须密码即自身免密成功:
ssh localhost
- IP隐射
首先保证三台机器处于同一局域网, 如博主的三台机器IP如下(动态IP获取):
master: 192.168.0.103
slave1: 192.168.0.102
slave2: 192.168.0.104
然后, 三台机器分别执行如下操作:
向/etc/hosts 文件添加如下内容:
注: 注释掉主机点的127.0.1.1
下图为master节点内容, slave节点将最后三行内容写入即可.
在master 测试:
- 节点之间免密登陆
在slave1和slave2分别执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub master
这时, 从节点能够免密登陆master节点, 命令: ssh master.
然后, 在master节点执行如下操作:
scp .ssh/authorized_keys slave1:/home/hadoop/.ssh
scp .ssh/authorized_keys slave2:/home/hadoop/.ssh
这时, 主节点可免密登陆两台从节点, 并且从节点之间也可以免密登陆.
如:
2. Hadoop-2.7.3集群配置
为了方便组件的安装, 在三台机器分别设置/usr/local 的拥有者
chown -R hadoop /usr/local
下载Hadoop和JDK:
所有软件都可以在master节点下载, 通过scp命令传送给slave节点.
Hadoop-2.7.3 JDK-1.8.152网盘下载:
链接:https://pan.baidu.com/s/1WxOaetwJ49fsouZ01xejlw 提取码:ihb5
- JDK安装
三台机器分别执行:
mkdir /usr/local/java
tar -zxvf jdk-8u152-linux-x64.tar.gz -C /usr/local/java/
配置环境变量: 在 /home/hadoop/.bashrc 文件末尾添加如下内容:
# java
JAVA_HOME=/usr/local/java/jdk1.8.0_152
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH PATH
使配置生效:
source /home/hadoop/.bashrc
测试:
slave节点:
先将压缩包传递给slave节点, 博主这里先在slave节点创建了soft目录:
scp soft/Hadoop/jdk-8u152-linux-x64.tar.gz slave1:/home/hadoop/soft/
scp soft/Hadoop/jdk-8u152-linux-x64.tar.gz slave2:/home/hadoop/soft/
下述操作分别在slave节点执行, 这里以slave1为例
安装JDK:
配置变量, 添加内容见上面master的配置:
slave2同理.
- Hadoop配置(6个文件)
在master节点操作:
解压安装包:
tar -zxvf hadoop-2.7.3.tar.gz -C /usr/local/
配置核心文件:
进入目录:
cd /usr/local/hadoop-2.7.3/etc/hadoop
- hadoop-env.sh 修改JDK安装目录
- core-site.xml
内容如下:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop-2.7.3/tmp</value>
<description>注释</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
<description>垃圾回收</description>
</property>
</configuration>
- hdfs-site.xml
内容如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop-2.7.3/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop-2.7.3/dfs/data</value>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
</configuration>
其中: dfs.replication 为备份数量, 这里博主设置了1, 即所有数据只有1份.
- yarn-site.xml
内容如下:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8099</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:8031</value>
</property>
</configuration>
- mapred-site.xml
内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobtracker.address</name>
<value>master:9001</value>
</property>
</configuration>
- slaves (那些节点作为从节点)
原内容为 localhost, 改为:
slave1
slave2
然后, 创建相应目录(这三个目录为上述配置文件中填写的内容, 为同一文件):
cd /usr/local/hadoop-2.7.3/
mkdir -p dfs/{name,data} tmp
最终, hadoop-2.7.3的结构如下:
最后, 将hadoop-2.7.3传送给slave节点:
scp -r hadoop-2.7.3/ slave1:/usr/local/
scp -r hadoop-2.7.3/ slave2:/usr/local/
配置三台机器的环境变量:
修改 .bashrc 文件, 末尾添加如下内容:
# hadoop
export JAVA_HOME=/usr/local/java/jdk1.8.0_152
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
执行 source .bashrc 使配置神效, 查看:
3. 格式化Hadoop, 并测试
- 格式化
master节点执行命令:
hadoop namenode -format
数字 0 为格式化成功的标志:
- 启动所有服务
master节点执行如下命令:
start-all.sh
查看:
三台机器能够出现上述进程, 即成功.
- 单词统计测试
创建输入目录:
hdfs dfs -mkdir -p input
注: 直接写input 目录会创建在 /user/hadoop/input目录(一开始并没有 /user/hadoop目录, 因为 -p 级联创建), 即HDFS默认目录为 /user/hadoop, 只有加了 / 才是HDFS的根目录, 如:
另外, 第一行的提示信息没有用处, 可以不显示, 执行如下命令:
echo "log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR" >> /usr/local/hadoop-2.7.3/etc/hadoop/log4j.properties
效果如下:
其中, .Trash为回收目录(删除的东西会保存在这), 在core-site.xml中进行了配置, 不需要可以删除相应配置文件中的内容.
上传输入文件:
关闭HDFS:
stop-all.sh
关闭master节点防火墙:
sudo service ufw stop
sddo apt-get remove iptables
关闭slave节点防火墙:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
开启HDFS:
start-all.sh
上传:
hdfs dfs -put etc/hadoop/core-site.xml input/
执行单词统计命令:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount input/ output
查看结果:
完!