以下为作者本人撰写的报告,步骤略有繁琐,不建议作为参考内容,可以适当浏览,进一步理解。
一、实验目的
1、理解分布式文件系统的基本概念和工作原理。
2、掌握Hadoop分布式文件系统(HDFS)的基本操作。
3、学习如何在HDFS上进行文件的上传、下载、查看和管理。
二、实验环境准备
1、JAVA环境准备:确保Java Development Kit (JDK) 已安装并配置好环境变量。
2、Hadoop环境准备:安装并配置Hadoop环境,确保Hadoop的各个组件可以在伪分布式模式下运行。
三、实验教材参考
《大数据存储》,谭旭,人民邮电出版社,2022,ISBN 978-7-115-59414-3。
四、实验内容与步骤
1、 Hadoop的安装与配置
- 根据教材《大数据存储》中的指导,完成Hadoop的安装。

- 配置Hadoop以运行在伪分布式模式。
2.1 记录节点1的IP地址

节点1的IP地址为10.185.34.80
2.2 记录节点2的IP地址

节点2的IP地址为10.185.34.81
2.3 记录节点3的IP地址

节点3的IP地址为10.185.34.82
2.4 配置主机名称
主机1 名称配置

主机2名称配置

主机3名称配置

配置完名称后,重启主机。

2.5 节点1主机名与IP地址映射文件配置

检测配置是否成功


配置成功。
主机2和主机3的步骤相同,此处省略。
2.6 配置SSH免密码登录
2.6.1 节点秘钥配置及分发
使用下面代码生成使用rsa加密方式的秘钥
echo -e "\n"|ssh-keygen -t rsa -N "" >/dev/null 2>&1
查看秘钥

通过下面的命令将公钥文件发送到本机,创建root免密钥通道
ssh-copy-id -i /root/.ssh/id_rsa.pub root@realtime-1

将公钥文件发送到其他两个节点。其他两个节点进行相同的操作。此处省略。
2.6.2 登录测试



2.7 配置JDK
2.7.1 创建工作路径

2.7.2 解压安装包

2.7.3 配置环境变量
在.bashrc文件中写入下列内容:

把环境变量配置文件分发到其他两个节点。

2.7.4 更新环境变量

2.7.5 验证JDK是否配置成功


2.8 NTP服务配置
2.8.1 NTP服务配置
主机1中NTP服务配置。


主机2中NTP服务配置。

主机3中NTP服务配置。

2.8.2 启动NTP服务
在主机1中启动NTP服务。

在主机2中启动NTP服务。

在主机3中启动NTP服务。

2.8.3 NTP服务状态查看

2.9 SElinux安全配置
关闭节点的SElinux的安全设置。

2.10 安装配置ZooKeeper集群
2.10.1 解压安装包

查看解压后的文件内容

2.10.2 数据存储目录创建
创建数据存储目录data和日志存储目录logs

2.10.3 主机myid编号文件创建

2.10.4 zookeeper 配置文件编辑
通过命令vi /usr/cx/zookeeper-3.4.6/conf/zoo.cfg 创建并打开zoo.cfg配置文件,并在文件中写入下列内容

2.10.5 文件分发
通过下面命令将节点1的zookeeper文件包分发到节点2中。
scp -r /usr/cx/zookeeper-3.4.6 root@realtime-2:/usr/cx/

通过下面命令将节点1的zookeeper文件包分发到节点3中
scp -r /usr/cx/zookeeper-3.4.6 root@realtime-3:/usr/cx/

2.10.6 环境变量配置
通过命令 vi ~/.bashrc 使用vi编辑器打开 ~/.bashrc文件,将文件编辑为下图内容

通过命令将环境变量配置文件分发到其他节点

2.10.7 更新环境变量

2.10.8 验证环境变量是否配置成功


三个节点上的zookeeper环境变量均配置成功
2.11 zookeeper启动及状态查看
2.11.1 zookeeper启动

三个节点上的zookeeper启动成功
2.11.2 zookeeper运行状态查看

由结果得出,节点2是作为leader角色运行,其他两个节点是作为follower角色运行。
2.12 配置hadoop集群
2.12.1 数据存储目录创建
创建Hadoop元数据存储目录namenode,Hadoop数据存储目录datanode,创建JournalNode数据存储目录journalnode,创建任务调度的日志存储目录hadoop-yarn。

2.12.2 解压安装文件
使用tar -zxvf /usr/software/hadoop-2.7.1.tar.gz -C /usr/cx命令解压Hadoop安装文件。

2.12.3 编辑hadoop配置文件
使用vi /usr/cx/hadoop-2.7.1/etc/hadoop/hadoop-env.sh命令对配置文件进行编辑。

将此处修改为jdk的安装路径。
使用命令vi /usr/cx/hadoop-2.7.1/etc/hadoop/hdfs-site.xml 配置hdfs-site.xml 文件进行配置。将下列内容添加到<configuration> 和 </configuration> 之间:
XML
/*配置DataNode的数据存储目录,需要与上文创建的目录相对应*/
<property>
<name>dfs.datanode.data.dir</name>
<value>/hdfs/datanode</value>
</property>
/*配置数据块大小为256M*/
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
/*自定义的HDFS服务名,在高可用集群中,无法配置单一HDFS服务器入口,以需要指定一个逻辑上的服务名,当访问服务名时,会自动选择NameNode节点进行访问*/
<property>
<name>dfs.nameservices</name>
<value>HDFScluster</value>
</property>
/*配置NameNode的数据存储目录,需要与上文创建的目录相对应*/
<property>
<name>dfs.namenode.name.dir</name>
<value>/hdfs/namenode</value>
</property>
/*定义HDFS服务名所指向的NameNode主机名称*/
<property>
<name>dfs.ha.namenodes.HDFScluster</name>
<value>realtime-1,realtime-2</value>
</property>
/*设置NameNode的完整监听地址*/
<property>
<name>dfs.namenode.rpc-address.HDFScluster.realtime-1</name>
<value>realtime-1:8020</value>
</property>
/*设置NameNode的完整监听地址*/
<property>
<name>dfs.namenode.rpc-address.HDFScluster.realtime-2</name>
<value>realtime-2:8020</value>
</property>
/*设置NameNode的HTTP访问地址*/
<property>
<name>dfs.namenode.http-address.HDFScluster.realtime-1</name>
<value>realtime-1:50070</value>
</property>
/*设置NameNode的HTTP访问地址*/
<property>
<name>dfs.namenode.http-address.HDFScluster.realtime-2</name>
<value>realtime-2:50070</value>
</property>
/*设置主从NameNode元数据同步地址,官方推荐将nameservice作为最后的journal ID*/
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://realtime-1:8485;realtime-2:8485;realtime-3:8485/HDFScluster</value>
</property>
/*设置HDFS客户端用来连接集群中活动状态NameNode节点的Java类*/
<property>
<name>dfs.client.failover.proxy.provider.HDFScluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
/*设置SSH登录的私钥文件地址*/
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
/*启动fence过程,确保集群高可用性*/
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
/*配置JournalNode的数据存储目录,需要与上文创建的目录相对应*/
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hdfs/journalnode</value>
</property>
/*设置自动切换活跃节点,保证集群高可用性*/
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
/*配置数据块副本数*/
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
/*将dfs.webhdfs.enabled属性设置为true,否则就不能使用webhdfs的LISTSTATUS、LIST FILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode保存的*/
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
编辑完成后保存文件并退出vi编辑器。
使用命令vi /usr/cx/hadoop-2.7.1/etc/hadoop/core-site.xml 配置core-site.xml 文件进行配置。将下列内容添加到<configuration> 和 </configuration> 之间:
XML
/*设置默认的HDFS访问路径,需要与hdfs-site.xml中的HDFS服务名相一致*/
<property>
<name>fs.defaultFS</name>
<value>hdfs://HDFScluster</value>
</property>
/*临时文件夹路径设置*/
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/tmp</value>
</property>
/*配置ZooKeeper服务集群,用于活跃NameNode节点的选举*/
<property>
<name>ha.zookeeper.quorum</name>
<value>realtime-1:2181,realtime-2:2181,realtime-3:2181</value>
</property>
/*设置数据压缩算法*/
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.BZip2Codec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
/*设置使用hduser用户可以代理所有主机用户进行任务提交*/
<property>
<name>hadoop.proxyuser.hduser.host</name>
<value>*</value>
</property>
/*设置使用hduser用户可以代理所有组用户进行任务提交*/
<property>
<name>hadoop.proxyuser.hduser.groups</name>
<value>*</value>
</property>
编辑完成后保存文件并退出vi编辑器。
使用命令vi /usr/cx/hadoop-2.7.1/etc/hadoop/yarn-site.xml文件进行配置。将下列内容添加到<configuration> 和 </configuration> 之间:
/*设置NodeManager上运行的附属服务,需配置成mapreduce_shuffle才可运行MapReduce程序*/
<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.nodemanager.log-dirs</name>
<value>file:///var/log/hadoop-yarn </value>
</property>
/*设置Hadoop依赖包地址*/
<property>
<name>yarn.application.classpath</name>
<value>
$HADOOP_HOME/share/hadoop/common/*,$HADOOP_HOME/share/hadoop/common/lib/*,
HADOOP_HOME/share/hadoop/hdfs/*,$HADOOP_HOME/share/hadoop/hdfs/lib/*,
$HADOOP_HOE/share/hadoop/mapreduce/*,$HADOOP_HOME/share/hadoop/mapreduce/lib/*,
$HADOOP_HOME/share/hadoop/yarn/*,$HADOOP_HOME/share/hadoop/yarn/lib/*
</value>
</property>
/*开启resourcemanager 的高可用性功能*/
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
/*标识集群中的resourcemanager,如果设置选项,需要确保所有的resourcemanager节点在配置中都有自己的逻辑id*/
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>YARNcluster</value>
</property>
/*设置resourcemanager节点的逻辑id*/
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
/*为每个逻辑id绑定实际的主机名称*/
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>realtime-1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>realtime-2</value>
</property>
/*指定ZooKeeper服务地址*/
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>realtime-1:2181,realtime-2:2181,realtime-3:2181</value>
</property>
/*指定resourcemanager的WEB访问地址*/
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>realtime-1:8089</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>realtime-2:8089</value>
</property>
/*设定虚拟内存与实际内存的比例,比例值越高,则可用虚拟内存就越多*/
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>3</value>
</property>
/*设定单个容器可以申领到的最小内存资源*/
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>32</value>
</property>
/*设置当任务运行结束后,日志文件被转移到的HDFS目录*/
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>hdfs://HDFScluster/var/log/hadoop-yarn/apps</value>
</property>
/*设定资调度策略,目前可用的有FIFO、Capacity Scheduler和Fair Scheduler*/
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yan.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
/*设定每个任务能够申领到的最大虚拟CPU数目*/
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>8</value>
</property>
/*设置任务完成指定时间(秒)之后,删除任务的本地化文件和日志目录*/
<property>
<name>yarn.nodemanager.delete.debug-delay-sec</name>
<value>600</value>
</property>
/*设置志在HDFS上保存多长时间(秒)*/
<property>
<name>yarn.nodemanager.log.retain-seconds</name>
<value>86400</value>
</property>
/*设定物理节点有2G内存加入资源池*/
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
编辑完成后保存文件并退出。
使用 cp /usr/cx/hadoop-2.7.1/etc/hadoop/mapred-site.xml.template /usr/cx/hadoop-2.7.1/etc/hadoop/mapred-site.xml 命令复制mapred-site.xml.template文件并重命名为mapred-site.xml。使用 vi 命令打开mapred-site.xml文件进行配置,在文件 <configuration>和</configuration>之间增加下列内容:
XML
/*Hadoop对MapReduce运行框架一共提供了3种实现,在mapred-site.xml中通过"mapreduce.framework.name"这个属性来设置为"classic"、"yarn"或者"local"*/
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
使用 vi /usr/cx/hadoop-2.7.1/etc/hadoop/slaves 命令打开slaves文件进行配置。将文件中的内容更改为图中内容:

编辑完成后保存文件并退出。
2.12.4 文件分发
通过命令 scp -r /usr/cx/hadoop-2.7.1 root@realtime-n:/usr/cx/ 将节点1 的Hadoop文件包分到其他节点中。

2.12.5 配置Hadoop环境变量
通过命令 vi ~/.bashrc 使用vi编辑器编辑~/.bashrc文件,在文件中加入图中内容,编辑完成后保存并退出。

通过scp分发命令将节点1的环境变量文件分发到其他两个节点。

2.12.6 更新环境变量
执行图中命令,更新三个节点中的环境变量。

2.12.7 格式化HDFS
执行命令 hadoop namenode -format 格式化HDFS文件系统。

2.12.8 格式化zkfc元数据
执行命令 hdfs zkfc -formatZK 格式化zkfc元数据,在一个节点中进行处理即可。

2.19 Hadoop集群启用运行
2.19.1 启动HDFS相关服务
执行命令 start-dfs.sh 启动HDFS相关服务。

执行命令 jps 查看节点1中对应的相关服务。


执行命令 ssh realtime-2 "hadoop namenode -bootstrapStandby" 格式化Standby节点。

格式化Standby节点后,执行命令 ssh realtime-2 "hadoop-daemon.sh start namenode" 启动Standby节点的NameNode进程。

2.13.2 启动yarn相关服务
执行命令 start-yarn.sh 启动yarn相关服务。

执行命令 ssh realtime-2 "yarn-daemon.sh start resourcemanager" 在节点2中启动ResourceManager进程。

2、启动Hadoop HDFS
- 启动HDFS。

- 验证HDFS是否成功启动,可以使用jps命令查看Java进程,确认NameNode和DataNode等进程是否运行。

出现以上内容表示启动成功。
3、HDFS基本操作实践
- 目录操作:使用hdfs dfs -mkdir命令创建新的目录。

- 文件上传:使用hdfs dfs -put命令上传本地文件到HDFS。

- 文件下载:使用hdfs dfs -get命令下载HDFS上的文件到本地。

- 文件查看:使用hdfs dfs -cat命令查看HDFS上的文件内容。

- 文件删除:使用hdfs dfs -rm命令删除HDFS上的文件。
