最近花了些许时间开始系统性整理下大数据相关的技术点,首先从最为常用的Hadoop开始进行梳理。
什么是Hadoop
最早是歌于2003年发表过一篇分布式文件存储系统的论文,其中提到了关于分布式文件存储的设计思想。后来这套设计思想被程序员们所吸收,最终产生了Apache顶级的开源项目 Hadoop。
简单来说Hadoop就是一套分布式文件存储系统,支持将一份大文件拆解成多份小文件,然后分布存储在不同的机器磁盘上。同时还能支持文件在多台机器上的读写能力。相当于提供了一种通过网络去调度多台机器磁盘空间的系统能力。
ps:我们有的时候会习惯说hdfs,其实其全称就是Hadoop Distributed File System,下边我会统一使用hdfs这个说法来进行表述。
HDFS的架构图
HDFS采用 master/slave 架构。一个HDFS集群包含一个单独的NameNode和多个DataNode。
NameNode作为master服务,它负责管理文件系统的命名空间和客户端对文件的访问。NameNode会保存文件系统的具体信息,包括文件信息、文件被分割成具体block块的信息、以及每一个block块归属的DataNode的信息。对于整个集群来说,HDFS通过NameNode对用户提供了一个单一的命名空间。
DataNode作为slave服务,在集群中可以存在多个。通常每一个DataNode都对应于一个物理节点。DataNode负责管理节点上它们拥有的存储,它将存储划分为多个block块,管理block块信息,同时周期性的将其所有的block块信息发送给NameNode。
下图为HDFS系统架构图,主要有三个角色,Client、NameNode、DataNode。
-
Namenode:namenode是一个名称节点,是hdfs的大脑,它维护着文件系统的目录树。
-
Secondarynode:第二个名字节点,用于备份,一旦namenode挂掉,那么secondarynode就补上。
-
Datanode:data节点用来存储数据。
-
Client:用来读写数据的客户端。
其实你会发现hdfs的存储设计思路与很多后续的分布式存储系统都比较类似,都是会有 “数据地址” + “原始数据” 两者拆分的设计思路(例如B+树,K8s的元数据存储等)
从下边这张图来看,我们简单梳理出hdfs的读写流程:
写文件流程
从namenode节点获取出文件需要分散到哪些datanode节点进行存储,然后client端进行分片写入到各个datanode上。
读文件流程
也是从namenode节点获取出文件分片散落在哪些datanode节点上,然后也是在client端去对各个datanode节点进行读取访问。
好了看到这里你应该对hdfs已经有一个简单大概的了解了吧。那么下边不妨试试搭建一套简单的单机版本hdfs体验下吧。
基于Mac-Mini m2环境搭建单机HDFS
首先你需要安装好jdk8基本环境,这一步很简单,我这边直接先跳过了。记得要将JAVA_HOME变量设置好,因为后边配置hdfs的时候需要用到。
1.进入网址Apache Hadoop,选择最新版本Hadoop,选择binary download。
下载完成后解压到本地指定目录,然后配置环境变量。
vim ~/.zprofile
打开 zprofile,添加以下内容,注意这里的HADOOP_HOME写自己主机上的安装路径。
export HADOOP_HOME=/Users/linhao/env/hadoop-3.3.6/
export HADOOP_INSTALL=$HADOOP_HOMEexport HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOMEexport 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
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
接着我们需要修改hadoop的配置文件,关于hadoop的配置文件,主要存放在etc的目录下,如下图所示:
这里面需要修改的文件主要有:
- hadoop-env.sh
用于配置hadoop的环境变量,这里主要是export一个JAVA_HOME的地址即可。
export JAVA_HOME=/Users/linhao/env/jdk8/jdk1.8.0_411.jdk/Contents/Home
- core-site.xml
一些扩展配置,例如hdfs格式化namenode的地址。
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/Users/linhao/env/hdfs/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
</configuration>
- hdfs-site.xml
配置下节点的数量,由于是单机部署,所以简单配置为1即可。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
- yarn-site.xml
配置一些yarn的属性
<configuration>
<!-- Site specific YARN configuration properties -->
<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.hostname</name>
<value>127.0.0.1</value>
</property>
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PERPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
完成以上步骤后,我们来对namenode进行初始化,执行以下命令:
hdfs namenode -format
如果输出如下所示,则表示初始化正常。
接下来我们来启动hdfs的所有节点,如下所示:
linhao@linhaodemini hadoop % start-all.sh
WARNING: Attempting to start all Apache Hadoop daemons as linhao in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [linhaodemini]
2024-09-28 22:33:02,520 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting resourcemanager
Starting nodemanagers
如果一切顺利的话,我们可以打开浏览器,访问 http://localhost:9870。
至此,hadoop的单机版本环境就算安装成功了。
可能遇到的问题
-
在mac环境进行免密登录会遇到问题的话,可以参考这篇文章:www.cnblogs.com/miracle-lun…
-
启动出现 ERROR: Unable to write in xxx/logs. Aborting,参考这篇文章即可:blog.csdn.net/zhangvalue/…