Hadoop
Hadoop是一个开源的分布式计算框架,旨在处理大规模数据集和进行并行计算。核心包括两个组件:HFDS、MapReduce。
配置方案
各虚拟机的用户名分别为test0、test1、test2,主机名为hadoop100、hadoop101、hadoop102
虚拟机的分配如下:
- hadoop100:NameNode + ResourceManager
- hadoop101:DataNode + NodeManager
- hadoop102:SecondaryNameNode
其中Master为hadoop100,这个配置方案可以提供集群的基本功能,Master节点负责管理整个文件系统的元数据和资源调度,而Worker节点负责存储数据和执行任务。
各节点的作用:
- NameNode:负责管理整个分布式文件系统的命名空间和文件元数据。它是HDFS的主节点,负责存储文件系统的元数据信息,并处理客户端的文件操作请求。将一台虚拟机作为NameNode节点可以提供高可靠性和容错性。
- SecondaryNameNode:主要负责协助NameNode进行元数据备份和检查点操作。它定期从NameNode获取编辑日志,并创建检查点,从而减少NameNode对元数据的负担和故障恢复时间。请注意,SecondaryNameNode并不是NameNode的备份,无法自动接管NameNode的角色。
- HDFS DataNode:负责存储和管理实际的数据块。它接收并处理从NameNode分配的数据块写入请求,并执行数据块的读取和复制操作。HDFS DataNode节点存储实际的数据块和后续读写操作。
安装Hadoop
上传压缩包,并解压
tar zxvf hadoop-3.3.6.tar.gz
打开环境变量注册表
vim /etc/profile
配置环境变量
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
配置生效
source /etc/profile
进入
Hadoop
的安装目录,编辑
/etc/hadoop/hadoop-env.sh
文件,设置
JAVA_HOME
为您的
JDK
安装路径
export JAVA_HOME=/opt/dev/jdk1.8.0_151
检查是否安装完成,使用命令查看hfs中的根目录
hadoop fs -ls /
由于Hadoop单机模式是一种用于开发和测试的模式,它并不需要进行集群和分布式环境的设置。在Hadoop单机模式下,默认情况下,Hadoop会使用当前用户的身份进行操作,而无需输入密码。
配置Hadoop分布式集群
前提条件:
- 三台Linux系统虚拟机(可使用VMWare软件进行克隆)定义为hadoop100、hadoop101、hadoop102
- 所有虚拟机都需要联通网络
- 虚拟机之间区别主机名
- 三台虚拟机都拥有相同路径版本的 JDK 和 Hadoop
设置主机名
首先分别打开三台虚拟机,分别使用下列指令将主机名修改。
由于NetworkManager服务的配置问题,直接使用hostname指令设置主机名在重启后会失效,需要每次开机重启,若想永久修改主机名生效,则修改/etc/hostname文件
vi /etc/hostname
下述的hadoop100是指新的主机名。同理修改其他的虚拟机主机名
hadoop100
分别检查虚拟机网络,当有数据返回时则无问题
ping www.baidu.com
编辑主机名列表文件
vi /etc/hosts
在文件加入,指定IP地址对应的hostname
192.168.10.128 badoop100
192.168.10.130 hadoop101
192.168.10.131 hadoop102
重启生效
reboot
在主机验证
ping hadoop101
分发 JDK 和 Hadoop
如果没有安装JDK和Hadoop,则可先在某一台虚拟机上安装完毕:
tar -zxvf /opt/jdk1.8.0_151.tar.gz
然后在该虚拟机上通过下列的集群分发脚本将 JDK和Hadoop分别分发到其他的虚拟机中,后续要输入yes和当前将要连接的hadoop101的密码:
# 将当前JDK发送到test1用户下主机名为hadoop101的/opt/dev/jdk1.8.0_151路径
scp -r /opt/dev/jdk1.8.0_151 test1@hadoop101:/opt/dev/jdk1.8.0_151
# 将Hadoop发送到test2用户下主机名为hadoop102的/opt/dev/jdk1.8.0_151路径
scp -r /opt/hadoop/bin/hadoop test1@hadoop102:/opt/hadoop/bin/hadoop
记得配置环境变量,查看环境变量profile文件
vim /etc/profile
目标虚拟机都要设置环境变量
export JAVA_HOME=/opt/dev/jdk1.8.0_151
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
让配置文件生效
source /etc/profile
输入java指令检验Java是否安装成功
java -version
输入hadoop指令查看是否安装成功
hadoop
设置免密登录
配置SSHD:如果免密登录不生效或出现连接错误,可能是由于目标节点的SSH服务器配置不正确。在目标节点上,编辑
/etc/ssh/sshd_config
文件,确保以下设置:
sudo vim /etc/ssh/sshd_config
PubKeyAuthentication yes
PasswordAuthentication no # 如果需要使用finalshell,那么可以不写这个
重启ssh服务:
sudo service ssh restart
分别在三个虚拟机中的
~/.ssh
目录下生成id_rsa和id_rsa.pub文件,分别对应着私钥和公钥:
ssh-keygen -t rsa -P ""
追加到新文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
修改id_rsa.pub文件的权限
chmod 644 ~/.ssh/authorized_keys
将主节点的公钥文件分发到集群中的各个节点上,使得节点可以进行免密登录。运行以下命令,其中test1、test2是目标节点的登录用户名,hadoop101、hadoop102是节点主机名:
ssh-copy-id -i ~/.ssh/id_rsa.pub test1@hadoop101
ssh-copy-id -i ~/.ssh/id_rsa.pub test2@hadoop102
输入完成后,输入目标机的密码,将主节点的公钥添加到从节点的
~/.ssh/authorized_keys
文件中。
远程登录目标机,测试是否成功共享密钥,如果可以成功登录且不用输入密码,则表示免密登录已经配置成功:
ssh test1@hadoop101
ssh test2@hadoop102
配置hadoop-env.sh
打开文件
vi etc/hadoop/hadoop-env.sh
修改文件
export JAVA_HOME=/opt/dev/jdk1.8.0_381
配置core-site.xml
打开文件
vi etc/hadoop/core-site.xml
修改文件:
fs.defaultFS:该参数是配置指定HDFS的通信地址。
hadoop.tmp.dir:该参数配置的是Hadoop临时目录
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoopTmp/</value>
</property>
</configuration>
配置hdfs-site.xml
打开文件
vi etc/hadoop/hdfs-site.xml
修改文件:
dfs.namenode.http-address:该参数是配置NameNode的http访问地址和端口号。因为在集群规划中指定hadoop100设为NameNode的服务器,故设置为hadoop100:9870。
dfs.namenode.secondary.http-address:该参数是配置SecondaryNameNode的http访问地址和端口号。在集群规划中指定hadoop102设为SecondaryNameNode的服务器,故设置为hadoop102:50090。
dfs.replication:该参数是配置HDFS副本数量,建议不超过从节点数。
dfs.namenode.name.dir:该参数是设置NameNode存放的路径。
dfs.datanode.data.dir:该参数是设置DataNode存放的路径。
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop100:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoopTmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoopTmp/dfs/data</value>
</property>
</configuration>
配置yarn-site.xml
打开文件
vi etc/hadoop/yarn-site.xml
修改文件:
参数说明:
yarn.resourcemanager.hostsname:该参数是指定ResourceManager运行在那个节点上。
yarn.resourcemanager.webapp.address:该参数是指定ResourceManager服务器的web地址和端口。
yarn.nodemanager,aux-services:该参数是指定启动时加载server的方式。
yarn.nodemanager.aux-services.mapreduce.shuffle.class:该参数是指定使用mapreduce_shuffle中的类。
yarn.log-aggregation-enable:该参数是配置是否启用日志聚集功能。
yarn.log-aggregation.retain-seconds:该参数是配置聚集的日志在HDFS上保存的最长时间。
yarn.nodemanager.remote-app-log-dir:该参数是指定日志聚合目录。
<configuration>
<property>
<name>yarn.resourcemanager.hostsname</name>
<value>hadoop100</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hadoop100:8088</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>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>106800</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/user/hadoopcontainer/logs</value>
</property>
</configuration>
配置mapred-site.xml
打开文件
vi etc/hadoop/mapred-site.xml
修改文件参数说明:
mapreduce.framework.name:该参数是指定MapReduce框架运行在YARN上。
mapreduce.jobhistory.address:该参数是设置MapReduce的历史服务器安装的位置及端口号。
mapreduce.jobhistory.webapp.address:该参数是设置历史服务器的web页面地址和端口。
mapreduce.jobhistory.intermediate-done-dir:该参数是设置存放日志文件的临时目录。
mapreduce.jobhistory.done-dir:该参数是设置存放运行日志文件的最终目录。
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop102:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop102:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${hadoop.tmp.dir}/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>${hadoop.tmp.dir}/mr-history/done</value>
</property>
</configuration>
开放防火墙端口
sudo ufw allow 9000 # 开放HDFS默认端口
sudo ufw allow 9870 # 开放NameNode的http访问地址和端口
sudo ufw allow 8088 # 开放master资源管理器WEb默认端口
sudo ufw allow 50090 # 开放SecondaryNameNode的服务器端口
sudo ufw allow 50020 # 开放DataNode通信端口
sudo ufw allow 8088 # 开放资源管理器的WEB通信端口
sudo ufw allow 10020 # 开放MapReduce通信端口
sudo ufw allow 19888 # 开放历史服务器通信端口
配置主次节点
PS:hadoop3以后slaves改为workers,打开文件:
vim etc/hadoop/slaves
vim etc/hadoop/workers
添加所有子节点的主机名:
hadoop101
hadoop102
分发配置文件
在其他节点查看下当前存放hadoop目录是否具有权限写入,否则后续分发将失败
ls -ld /opt/hadoop
如果没有权限,则输入下列指令开放hadoop目录的写入权限
sudo chmod -R 777 /opt/hadoop
将上述配置好的hadoop相关文件分发到其他虚拟机:
scp -r /opt/hadoop/* test1@hadoop101:/opt/hadoop/
scp -r /opt/hadoop/* test2@hadoop102:/opt/hadoop/
启动集群
在主节点输入格式化命令:
hdfs namenode -format
启动集群
start-all.sh
停止集群
stop-all.sh
验证是否成功
jps
当看到下列内容表示成功:
Master: NameNode、DataNode、ResourceManager、NodeManager
slave1: SecondaryNameNode、DataNode、NodeManager
slave2: DataNode、NodeManager
Web端访问
关闭防火墙:
service iptables stopservice iptables stop
访问HDFS:ip地址:9870;
访问YARN:ip地址:8088;
版本注意事项
- Hadoop3版本后,NameNode、Secondary NameNode, DataNode的端口出现了变化。2版本端口号3版本端口号namenode80209820namenode htttp web500709870namenode https web504709871secondnamenode https web500919869secondnamenode https web500919869secondnamenode http web500909868datanode ipc500209867datanode500109866datanode http web500759864datanode https web504759865
- Hadoop3版本之前的主从节点文件为slaves,3之后为workers
版权归原作者 米糊老师 所有, 如有侵权,请联系我们删除。