本实验的目的在于掌握在CentOS 8操作系统中安装和配置分布式Hadoop文件系统(HDFS)的基本技能,同时学习如何在HDFS系统上创建目录以及上传文件。通过实践这一过程,可以理解和体验大数据存储和处理的基本环境和步骤。
Hadoop分布式文件系统(HDFS)是一个可扩展且可靠的数据存储系统,专门设计用于存储和处理大量数据的需求。HDFS在大数据处理、机器学习和数据分析等领域有广泛的应用。通过本次实验,能够对HDFS的实际应用和操作有更深入的理解,掌握其核心技能,这对于未来大数据领域的学习和工作非常重要。
在大数据时代,数据量日益增长,传统的数据存储系统已经难以满足需求。Hadoop分布式文件系统(HDFS)的出现,解决了这一问题。HDFS能够提供高吞吐量的数据访问,非常适合运行在商用硬件上。它的优点在于可以存储大量数据,处理能力强,且具有良好的扩展性。
HDFS是Apache Hadoop的一个重要组成部分,它为用户提供了一个分布式的文件存储系统。在HDFS中,数据被分割成块,然后被分布在集群的多个节点上。这样做的好处是可以有效地处理大规模的数据集,同时提供了数据冗余保护机制,以防止数据丢失。
CentOS是一个开源的Linux发行版,广泛应用于服务器和数据中心环境。由于其稳定性和安全性,CentOS成为了部署HDFS的理想选择。
在本次实验中,选择CentOS 8作为操作系统,以学习和实践如何在此环境中安装和配置HDFS。完成HDFS的配置后,将在HDFS系统上创建一个名为"count"的目录,并上传一个txt文件到该目录。这个过程将使我熟悉HDFS的基本操作和管理,包括文件上传和目录创建。
总的来说,通过这次实验,我将获得在实际环境中操作和管理HDFS的经验,这对于掌握大数据技术和理解分布式存储系统的工作原理至关重要。
如何在CentOS8上面安装分布式HDFS系统,在HDFS系统上创建一个目录count,并上传一个txt文件该目录
以root用户登录CentOS 8
Hadoop运行需要Java环境,所以首先要在系统上安装Java。在命令行中输入以下命令:
sudo yum install java-1.8.0-openjdk
接下来,检查Java是否已经成功安装:
java -version
使用以下命令找出Java的安装路径,用于配置JAVA_HOME环境变量:
readlink -f $(which java)
在阿里云镜像站下载hadoop-3.3.1.tar.gz放于默认普通用户 “waldocentos” 的 “下载” 目录下:
以root用户登录CrentOS 8
创建一个普通用户来运行Hadoop,通常我们使用的用户名是"hadoop"。如果直接启动HDFS会报错。
首先,创建一个新用户:
adduser hadoop
然后为新用户设置密码:
passwd hadoop
将用户 “waldocentos” 的 “下载” 目录中的 “hadoop-3.3.1.tar.gz” 文件移动到用户 “hadoop” 的根目录:
sudo mv /home/waldocentos/下载/hadoop-3.3.1.tar.gz /home/hadoop/
这将会将 “hadoop-3.3.1.tar.gz” 文件从 “/home/waldocentos/Downloads” 目录移动到 “/home/hadoop” 目录下。使用 sudo
命令以管理员权限运行此命令,以确保您具有足够的权限来访问这些目录。
切换到新创建的hadoop用户:
su - hadoop
现在处于hadoop用户的主目录下,我这里是 /home/hadoop
。
解压Hadoop:
解压文件,并在在hadoop用户的主目录下创建一个名为 “hadoop” 的目录,其中包含Hadoop的所有文件。
tar xvf hadoop-3.3.1.tar.gz
mv hadoop-3.3.1 hadoop
编辑你的 .bashrc
文件来设置环境变量。你可以使用 nano
、vi
或你喜欢的任何文本编辑器:
nano .bashrc
在文件的末尾,添加以下行:
export HADOOP_HOME=/home/hadoop/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
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 JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.aarch64/jre
保存并关闭文件。然后,运行以下命令来应用新的环境变量:
source .bashrc
配置Hadoop。首先,编辑 hadoop-env.sh
文件:
nano $HADOOP_HOME/etc/hadoop/hadoop-env.sh
找到 export JAVA_HOME=
这一行,然后将其替换为:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.aarch64/jre
保存并关闭文件。
设置SSH公钥和私钥,以便 “hadoop” 用户可以无密码登录到localhost:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
ssh localhost
初始化HDFS:
hdfs namenode -format
这将初始化Hadoop的名字节点,这是在首次启动Hadoop之前必须进行的步骤。
启动Hadoop:
启动Hadoop的分布式文件系统(DFS)和YARN资源管理器
start-dfs.sh
start-yarn.sh
检查Hadoop是否正常运行
使用以下命令查看正在运行的Java进程:
jps
在HDFS中创建一个新的目录"count":
创建一个名为"count"的新目录。
hdfs dfs -mkdir ~/count
更改HDFS的~/count目录的权限,使hadoop用户具有写入权限
hdfs dfs -chmod 777 ~/count
上传txt文件到HDFS的"~/count"目录
hdfs dfs -put /home/hadoop/分布式第三次作业.txt ~/count
cd count/
ls
vim 分布式第三次作业.txt
Hadoop 框架是用于计算机集群大数据处理的框架,所以它必须是一个可以部署在多台计算机上的软件。部署了 Hadoop 软件的主机之间通过套接字 (网络) 进行通讯。
Hadoop 主要包含 HDFS 和 MapReduce 两大组件,HDFS 负责分布储存数据,MapReduce 负责对数据进行映射、规约处理,并汇总处理结果。
Hadoop 框架最根本的原理就是利用大量的计算机同时运算来加快大量数据的处理速度。例如,一个搜索引擎公司要从上万亿条没有进行规约的数据中筛选和归纳热门词汇就需要组织大量的计算机组成集群来处理这些信息。如果使用传统数据库来处理这些信息的话,那将会花费很长的时间和很大的处理空间来处理数据,这个量级对于任何单计算机来说都变得难以实现,主要难度在于组织大量的硬件并高速地集成为一个计算机,即使成功实现也会产生昂贵的维护成本。
Hadoop 可以在多达几千台廉价的量产计算机上运行,并把它们组织为一个计算机集群。
一个 Hadoop 集群可以高效地储存数据、分配处理任务,这样会有很多好处。首先可以降低计算机的建造和维护成本,其次,一旦任何一个计算机出现了硬件故障,不会对整个计算机系统造成致命的影响,因为面向应用层开发的集群框架本身就必须假定计算机会出故障。
Hadoop Distributed File System,Hadoop 分布式文件系统,简称 HDFS。
HDFS 用于在集群中储存文件,它所使用的核心思想是 Google 的 GFS 思想,可以存储很大的文件。
在服务器集群中,文件存储往往被要求高效而稳定,HDFS同时实现了这两个优点。
HDFS 高效的存储是通过计算机集群独立处理请求实现的。因为用户 (一半是后端程序) 在发出数据存储请求时,往往响应服务器正在处理其他请求,这是导致服务效率缓慢的主要原因。但如果响应服务器直接分配一个数据服务器给用户,然后用户直接与数据服务器交互,效率会快很多。
数据存储的稳定性往往通过"多存几份"的方式实现,HDFS 也使用了这种方式。HDFS 的存储单位是块 (Block) ,一个文件可能会被分为多个块储存在物理存储器中。因此 HDFS 往往会按照设定者的要求把数据块复制 n 份并存储在不同的数据节点 (储存数据的服务器) 上,如果一个数据节点发生故障数据也不会丢失。
HDFS 运行在许多不同的计算机上,有的计算机专门用于存储数据,有的计算机专门用于指挥其它计算机储存数据。这里所提到的"计算机"我们可以称之为集群中的节点。
命名节点 (NameNode) 是用于指挥其它节点存储的节点。任何一个"文件系统"(File System, FS) 都需要具备根据文件路径映射到文件的功能,命名节点就是用于储存这些映射信息并提供映射服务的计算机,在整个 HDFS 系统中扮演"管理员"的角色,因此一个 HDFS 集群中只有一个命名节点。
数据节点 (DataNode) 使用来储存数据块的节点。当一个文件被命名节点承认并分块之后将会被储存到被分配的数据节点中去。数据节点具有储存数据、读写数据的功能,其中存储的数据块比较类似于硬盘中的"扇区"概念,是 HDFS 存储的基本单位。
副命名节点 (Secondary NameNode) 别名"次命名节点",是命名节点的"秘书"。这个形容很贴切,因为它并不能代替命名节点的工作,无论命名节点是否有能力继续工作。它主要负责分摊命名节点的压力、备份命名节点的状态并执行一些管理工作,如果命名节点要求它这样做的话。如果命名节点坏掉了,它也可以提供备份数据以恢复命名节点。副命名节点可以有多个。
MapReduce 的含义就像它的名字一样浅显:Map 和 Reduce (映射和规约) 。
大量数据的处理是一个典型的"道理简单,实施复杂"的事情。之所以"实施复杂",主要是大量的数据使用传统方法处理时会导致硬件资源 (主要是内存) 不足。
现在有一段文字 (真实环境下这个字符串可能长达 1 PB 甚至更多) ,我们执行一个简单的"数字符"统计,即统计出这段文字中所有出现过的字符出现的数量:
AABABCABCDABCDE
统计之后的结果应该是:
字符 | 出现次数 |
---|---|
A | 5 |
B | 4 |
C | 3 |
D | 2 |
E | 1 |
统计的过程实际上很简单,就是每读取一个字符就要检查表中是否已经有相同的字符,如果没有就添加一条记录并将记录值设置为 1 ,如果有的话就直接将记录值增加 1。
但是如果我们将这里的统计对象由"字符"变成"词",那么样本容量就瞬间变得非常大,以至于一台计算机可能难以统计数十亿用户一年来用过的"词"。
在这种情况下我们依然有办法完成这项工作——我们先把样本分成一段段能够令单台计算机处理的规模,然后一段段地进行统计,每执行完一次统计就对映射统计结果进行规约处理,即将统计结果合并到一个更庞大的数据结果中去,最终就可以完成大规模的数据规约。
在以上的案例中,第一阶段的整理工作就是"映射",把数据进行分类和整理,到这里为止,我们可以得到一个相比于源数据小很多的结果。第二阶段的工作往往由集群来完成,整理完数据之后,我们需要将这些数据进行总体的归纳,毕竟有可能多个节点的映射结果出现重叠分类。这个过程中映射的结果将会进一步缩略成可获取的统计结果。
我在 IBM 的网站上找到了一篇 MapReduce 文章,地址:https://www.ibm.com/analytics/hadoop/mapreduce 。现在我改编其中的一个 MapReduce 的处理案例来介绍 MapReduce 的原理细节以及相关概念。
这是一个非常简单的 MapReduce 示例。无论需要分析多少数据,关键原则都是相同的。
假设有 5 个文件,每个文件包含两列,分别记录一个城市的名称以及该城市在不同测量日期记录的相应温度。城市名称是键 (Key) ,温度是值 (Value) 。例如:(厦门,20)。现在我们要在所有数据中找到每个城市的最高温度 (请注意,每个文件中可能出现相同的城市)。
使用 MapReduce 框架,我们可以将其分解为 5 个映射任务,其中每个任务负责处理五个文件中的一个。每个映射任务会检查文件中的每条数据并返回该文件中每个城市的最高温度。
例如,对于以下数据:
城市 | 温度 |
---|---|
厦门 | 12 |
上海 | 34 |
厦门 | 20 |
上海 | 15 |
北京 | 14 |
北京 | 16 |
厦门 | 24 |
上述数据的一个映射任务产生的结果如下所示:
城市 | 最高温度 |
---|---|
厦门 | 24 |
上海 | 34 |
北京 | 16 |
假设其他四个映射器任务产生以下结果:
城市 | 最高温度 |
---|---|
厦门 | 17 |
杭州 | 25 |
上海 | 29 |
北京 | 36 |
厦门 | 30 |
杭州 | 17 |
上海 | 31 |
北京 | 35 |
厦门 | 18 |
杭州 | 17 |
上海 | 17 |
北京 | 27 |
厦门 | 28 |
杭州 | 18 |
上海 | 14 |
北京 | 27 |
所有这 5 个结果将被输入到 Reduce 任务中,该任务组合输入结果并输出每个城市的单个值,产生如下的最终结果:
城市 | 最高温度 |
---|---|
厦门 | 30 |
上海 | 34 |
北京 | 36 |
杭州 | 25 |
打个比方,你可以把 MapReduce 想象成人口普查,人口普查局会把若干个调查员派到每个城市。每个城市的每个人口普查人员都将统计该市的部分人口数量,然后将结果汇总返回首都。在首都,每个城市的统计结果将被规约到单个计数(各个城市的人口),然后就可以确定国家的总人口。这种人到城市的映射是并行的,然后合并结果(Reduce)。这比派一个人以连续的方式清点全国中的每一个人效率高得多。
Hadoop分布式文件系统(HDFS)有一系列命令行接口,用于与文件系统进行交互。以下是一些常用的HDFS命令和操作:
创建目录:使用mkdir
命令来创建目录:
hdfs dfs -mkdir /user/hadoop/dirname
查看文件和目录列表:使用ls
命令来查看文件和目录列表:
hdfs dfs -ls /user/hadoop
上传文件:使用put
或copyFromLocal
命令将本地文件上传到HDFS:
hdfs dfs -put localfile /user/hadoop/dirname
或
hdfs dfs -copyFromLocal localfile /user/hadoop/dirname
下载文件:使用get
或copyToLocal
命令将HDFS文件下载到本地:
hdfs dfs -get /user/hadoop/dirname/localfile
或
hdfs dfs -copyToLocal /user/hadoop/dirname/localfile
删除文件或目录:使用rm
命令删除文件,使用rmdir
命令删除空目录,使用-rm -r
命令删除目录及其内容:
hdfs dfs -rm /user/hadoop/dirname/filename
hdfs dfs -rmdir /user/hadoop/dirname
hdfs dfs -rm -r /user/hadoop/dirname
查看文件内容:使用cat
命令查看文件内容:
hdfs dfs -cat /user/hadoop/dirname/filename
移动或重命名文件和目录:使用mv
命令移动或重命名文件和目录:
hdfs dfs -mv /user/hadoop/dirname/filename /user/hadoop/dirname/newfilename
查看文件系统的空间使用情况:使用df
命令查看文件系统的空间使用情况:
hdfs dfs -df
以上是一些基本的HDFS命令,实际上,HDFS提供了许多其他的命令和选项,可以通过查阅Hadoop的官方文档或使用hdfs dfs -help
命令来了解更多信息。
为了获得更好的HDFS系统性能,我们需要进行性能测试和优化。以下是一些常见的HDFS系统性能测试和优化方法:
带宽测试
带宽测试是评估HDFS系统性能的一种方法,它可以测试文件上传和下载的速度。可以使用hadoop jar
命令运行测试,例如:
hadoop jar hadoop-mapreduce-client-jobclient-2.7.1-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 100MB
这个命令将在HDFS系统上写入10个100MB的文件,并记录文件写入时间和带宽。测试完成后,可以查看测试结果并分析优化空间。
内存管理
HDFS系统中的内存管理也是影响性能的重要因素之一。可以通过配置参数来管理内存使用,例如:
通过适当的配置这些参数,可以优化内存使用,提高系统性能。
硬件优化
硬件优化也是提高HDFS系统性能的重要手段之一。可以使用更快的磁盘、更高带宽的网络、更快的CPU等硬件设备来提高系统性能。
数据分布优化
在大规模数据处理中,数据的分布方式也会影响系统性能。例如,如果数据分布不均匀,会导致某些节点的负载过重,从而降低系统性能。因此,需要通过数据分布优化来提高系统性能。
故障恢复优化
HDFS系统中的故障恢复也会影响系统性能。例如,如果在数据节点故障时需要重新复制数据,会降低系统性能。因此,需要通过优化故障恢复机制来提高系统性能。
综上所述,HDFS系统的性能测试和优化需要考虑多个方面,包括带宽、内存、硬件、数据分布和故障恢复等。通过优化这些方面,可以提高HDFS系统的性能,为大数据处理应用提供更好的支持。
分布式HDFS系统作为大数据处理的核心组件之一,在实际应用中面临着一些挑战和问题。以下是一些常见的挑战和问题:
高并发读写:由于大数据处理的数据量很大,因此HDFS系统需要支持高并发读写操作。这会给系统带来很大的压力,需要系统具备较高的性能和可扩展性。
数据安全性:随着大数据应用的不断增加,数据安全性问题也变得越来越重要。分布式HDFS系统需要具备一定的安全性保障机制,例如数据加密、权限控制等。
数据一致性:由于HDFS系统是分布式的,因此在数据写入和读取过程中可能会出现数据一致性问题。系统需要采取一些措施来保证数据的一致性,例如分布式锁、分布式事务等。
硬件故障:分布式HDFS系统包括多个节点,由于硬件故障、网络故障等原因,节点可能会出现故障。系统需要具备高可用性,可以在节点故障时自动切换到备用节点。
负载均衡:在分布式HDFS系统中,不同节点上的数据负载可能会不均衡。系统需要具备一定的负载均衡机制,以保证各节点负载均衡,提高整个系统的性能和可靠性。
大规模数据处理:随着大数据应用场景的扩展,HDFS系统需要处理越来越大规模的数据,这将对系统的性能和可扩展性提出更高的要求。
针对这些挑战和问题,HDFS系统的开发者们正在不断地进行研究和改进,以提高系统的性能和可靠性,为大数据处理应用提供更好的支持。
Hadoop分布式文件系统(HDFS)是大数据处理中常用的分布式文件系统,它与其他分布式文件系统(如Google的GFS,Facebook的Haystack,及开源的Ceph等)在设计理念和功能特性上有一些区别。以下是对这些系统的一些比较:
HDFS vs GFS(Google文件系统):
HDFS vs Haystack(Facebook):
HDFS vs Ceph:
总的来说,HDFS、GFS、Haystack和Ceph等分布式文件系统各有优势,适用于不同的应用场景。HDFS作为Apache Hadoop的一部分,其优势在于处理大规模数据集,特别是在数据分析和机器学习等大数据处理场景中。
Hadoop分布式文件系统(HDFS)在大数据处理中有许多应用案例,下面是一些具体的例子:
Facebook:Facebook是全球最大的社交媒体平台,它每天都会产生和处理海量的数据。这些数据包括用户信息、好友关系、用户行为、图片和视频等。Facebook使用HDFS作为其数据存储和处理的基础设施,以支持对这些数据的实时分析和挖掘。
雅虎:雅虎是早期使用Hadoop和HDFS的公司之一。雅虎使用HDFS来存储和处理其搜索引擎和广告系统产生的大量数据。通过在HDFS上对数据进行分析,雅虎能够改善其搜索引擎的性能,提高广告的定向精度。
LinkedIn:LinkedIn是全球最大的专业社交网络平台,它使用HDFS来存储和处理用户的职业信息、联系人关系和用户行为等数据。通过在HDFS上对这些数据进行分析,LinkedIn能够为用户提供更精确的职业发展建议和更合适的职位推荐。
Netflix:Netflix是全球最大的视频流媒体服务提供商,它每天都需要处理大量的视频内容、用户行为和服务质量等数据。Netflix使用HDFS作为其数据平台的一部分,通过对HDFS中的数据进行分析,Netflix能够提供更好的个性化推荐,改善用户体验,同时优化其网络性能和服务质量。
Twitter:Twitter是全球最大的微博社交平台,它每天都会产生大量的微博、用户行为和社交网络等数据。Twitter使用HDFS来存储和处理这些数据,通过对这些数据的实时分析,Twitter能够发现热点事件,监控公众舆情,同时为用户提供更好的内容推荐。
以上只是HDFS在大数据处理中的一些应用案例,实际上,HDFS已经被广泛应用于电子商务、金融、医疗、科研等许多领域。在这些领域中,HDFS都发挥着重要的角色,帮助企业和组织更好地存储和处理大数据,从而实现数据驱动的决策和优化。