Hadoop学习笔记 -1 - MuxiaoWF跳到主要内容

Hadoop学习笔记 -1

Hadoop学习笔记 -1 创建Hadoop集群

周日 3月 01 2026
2427 字 · 10 分钟

Hadoop是什么

海量数据都应经过:先存起来,再将数据拿出来进行计算,并得到结果的过程。但是如果只使用MySQL等数据库将这海量数据存起来,再执行SQL语句进行统计,大概率会因为数据量过大而直接卡死。Hadoop就是一套专门用于大数据处理的工具,其内部由多个组件构成。可以将它理解为应用和大数据之间的一个中间层。

以前我们只需要从一台服务器里读写数据,但一台服务器的储存是有限度的,不可能将所有数据都存放在一台服务器上。因此我们需要在多台服务器里读写数据,但是也不可能每个服务器里只有一个文件,如此巨大的文件的打开读取都费劲。因此我们可以将大文件切分成一个个的小的数据块(也就是block),这样既方便读写又方便备份处理;而这些存放数据的服务器就叫做datanode

那么这个负责切分和存储数据的分布式软件,HDFS(全名 Hadoop Distributed File System),也就是 Hadoop 的分布式文件系统。

HDFS

HDFS

现在我们处理好了如何存储数据,接下来应当选择如何才能高效地处理数据。Hadoop的MapReduce是处理数据的核心,它同样将数据切分split成多个小块,将这些小块交给不同的节点进行处理(Map),最后将处理结果汇总起来(Reduce)。

MapReduce

MapReduce

接下来就又有新的问题,MapReduce如何分配数据任务给不同的机器进行处理?YARN(Yet Another Resource Negotiator)是负责统一调度计算资源的调度器,YARN将需要计算的任务抽象为一个个“容器Container”,然后通过“资源申请+协调调度”的方式,将任务分配到一台台计算机上去完成计算任务。

YARN

YARN

Hive是一个SQL和MapReduce之间的中间层,它可以将类似SQL的语句转化成map和reduce任务,减少写map()和reduce()代码的工作量。

MapReduce会将中间计算结果缓存在硬盘上,以减少计算资源的消耗,但是将计算结果缓存在硬盘上会带来多次硬盘读写的损耗,因此Spark将中间计算结果优先缓存在内存中,以优化性能。同时Spark可以通过Hive on Spark的中间层,让Hive也可以运用Spark。

左Hive 右Spark

左Hive 右Spark

由于Hive on Spark会带来性能损耗,因此又有Spark SQL来直接替代Hive。

至此,对于离线数据(批次处理数据)已经可以正常处理,如果需要处理实时在线数据(来一个处理一个),则可以使用Flink(分钟级别)和Hbase(毫秒级别)。

实战安装

通过这小节,我们将安装Hadoop并配置如下图的三台不同功能的服务器节点。

三台功能不同的服务器

三台功能不同的服务器

前言准备

这里使用VMware和Ubuntu虚拟机进行接下来的准备,各软件的下载安装请自行完成,vmwareUbuntu清华镜像

安装完成后向VMware中使用经典配置添加虚拟机光盘,这里应当注意第一次安装分配多点内存防止安装卡住(操作完之后可以调小一点)

虚拟机配置

虚拟机可能的配置

配置完成后,进入虚拟机,安装Ubuntu,这里也是傻瓜式就好了。安装完成后,右键打开命令行尝试获取root权限,并尝试安装Java(不要用他的命令!!!)。

命令1

命令1

但是但是但是!!!!这里不要被骗了,使用命令apt-get install openjdk-8-jdk来安装jdk,使用他的会没有后面使用的jps

输入sudo -isudo -s命令,然后输入你的用户密码。这两个命令都会让你以root用户的身份启动一个新的shell会话。-i选项会模拟一个完整的root登录,而-s选项只是简单地以root身份启动一个shell。

同时直接在命令前加sudo也可以是使用root用户执行

使用xshell连接虚拟机

接下来使用xshell连接虚拟机,xshell下载

开启虚拟机,先使用命令sudo apt install net-tools安装net-tools,并输入ifconfig命令查看IP地址(不是ipconfig)

ifconfig

ifconfig

同时使用命令sudo apt install openssh-server安装openssh-server以启动ssh服务

接下来进行xshell配置,输入上方获得的IP地址并记得在用户身份验证中输入Ubuntu的账号和密码

xshell配置

xshell配置

点击连接即可

xshell连接成功

xshell连接成功

接下来都在xshell中操作就好了,这样方便复制粘贴。

使用root账号输入nano /etc/default/useradd将文件中的SHELL=/bin/sh改为SHELL=/bin/bash修改创建用户时默认使用bash创建shell

tips:在nano中,按住Ctrl+O并输入回车可以保存,按住Ctrl+X可以退出

配置hadoop

前往hadoop清华镜像站下载hadoop并直接拖到虚拟机中(可能需要apt install lrzsz)传输完成后可以使用ll命令列出文件。

hadoop下载

hadoop下载

使用tar -zxf hadoop-3.4.3.tar.gz -C /usr/local解压文件,解压后可以使用cd /usr/local/hadoop-3.4.3进入解压后的文件夹。这里先创建一个没有root权限的hadoop用户:

创建hadoop用户

创建hadoop用户(不用管那个密码警告)

这时候使用su - hadoop即可进入hadoop用户,需要注意的是,如果在hadoop用户下不能执行sudo命令,需要转换用户使用(没有添加到sudo组中,限制其权限以保证后续安全性)。

配置文件

使用nano /usr/local/hadoop-3.4.3/etc/hadoop/hadoop-env.sh命令配置环境变量,在最后添加:export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"(记得修改为自己的Java路径)

使用nano /usr/local/hadoop-3.4.3/etc/hadoop/core-site.xml命令配置HDFS,在标签内输入下述配置(注意下面的ip地址请修改为虚拟机IP地址):

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.80.128:8020</value><!--修改为虚拟机IP地址,端口默认8020-->
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
</configuration>

使用nano /usr/local/hadoop-3.4.3/etc/hadoop/hadoop-env.sh命令添加环境变量(直接写在最上面即可)

Terminal window
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop-3.4.3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs

使用nano ~/.bashrc命令添加环境变量(直接写在最上面即可)

Terminal window
export HADOOP_HOME=/usr/local/hadoop-3.4.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

环境变量配置

环境变量配置

后可以使用source ~/.bashrc命令使环境变量生效。

配置从节点

接下来使用虚拟机克隆克隆多出两个虚拟机作为从节点(内存可以调的比主节点小一点),再分别使用ifconfig查看获取到两个IP地址。同时记得使用nano /usr/local/hadoop-3.4.3/etc/hadoop/core-site.xml命令配置HDFS,将fs.defaultFS下的值修改为各自虚拟机的IP地址。

在主节点使用nano /usr/local/hadoop-3.4.3/etc/hadoop/workers命令配置workers文件,指出从节点的IP地址

192.168.80.128 主节点IP
192.168.80.129 从节点1
192.168.80.130 从节点2

接着使用nano /usr/local/hadoop-3.4.3/etc/hadoop/hdfs-site.xml命令配置三台虚拟机的配置文件:

<configuration>
<property>
<name>dfs.datanode.data.dir</name>
<value>700</value><!-- 设置数据目录的权限为 700(只有所有者有读写执行权限)-->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/nn</value><!-- NameNode 存储元数据的目录路径 -->
</property>
<property>
<name>dfs.datanode.data.hosts</name>
<value>192.168.80.128,192.168.80.129,192.168.80.130</value><!-- 允许访问 HDFS 的 DataNode 主机列表,指定集群中所有 DataNode 的 IP地址 -->
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value><!-- HDFS 数据块大小设置块大小为 256MB(268435456 字节),默认值为 128MB -->
</property>
<property>
<name>dfs.datanode.handle.count</name>
<value>100</value><!-- 设置每个 DataNode 可以同时打开的文件句柄数 -->
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/dn</value><!-- DataNode 存储实际数据的目录路径 -->
</property>
</configuration>

在主节点运行sudo mkdir -p /data/dnsudo mkdir -p /data/nn命令,创建namenode和datanode的数据目录。在另外两个节点运行sudo mkdir -p /data/dn命令,创建datanode的数据目录(从节点不用创建namenode的数据目录)。

打通SSH

打通ssh,使主节点和从节点之间可以无密码ssh连接。在三个节点均输入ssh-keygen -t rsa -b 4096并不断按回车,创建rsa密钥对。之后输入三次ssh-copy-id + IP命令(IP替换成三个节点的IP地址,包括自己),将分发密钥到其他节点。

ssh配置

ssh配置

注意是在每个节点都输入4条语句。

输入完成后可以尝试使用命令ssh加上其他节点的IP地址进行测试连接

tips:可以使用ctrl+d退出当前用户的登录即退出ssh从而返回

启动

先在三个节点均使用chown -R hadoop:hadoop /usr/local/hadoop-3.4.3chown -R hadoop:hadoop /data将文件权限改为hadoop所有。这时候所有hadoop的文件都是hadoop用户所有,所以需要使用su - hadoop进入hadoop用户才能继续接下来的操作。

继续使用/usr/local/hadoop-3.4.3/bin/hadoop namenode -format格式化namenode(hadoop namenode -format应该也可以,如果设置好了环境变量的话)。

接下来就可以使用/usr/local/hadoop-3.4.3/bin/hadoop version(或hadoop version)简单检查一下是否配置成功,并在主节点使用/usr/local/hadoop-3.4.3/bin/start-dfs.sh(或start-dfs.sh)启动namenode和datanode(从节点会自动启动datanode),关闭可以使用/usr/local/hadoop-3.4.3/bin/stop-dfs.sh(或stop-dfs.sh)。

接下来使用jps命令查看namenode和datanode的状态。正常情况下,主节点会显示NameNode,SecondaryNameNode和DataNode,从节点会显示DataNode。

主节点

主节点jps

从节点

从节点jps

tips: 如果在之前已经创建过集群,又再次使用/usr/local/hadoop-3.4.3/bin/hadoop namenode -format格式化namenode,运行发现缺少了datanode/namenode,则可能需要rm -rf /data/dn/*清空数据目录,再重新启动。(或着使用命令备份一下mv /data/dn /data/dn.bak再创建一个新的空目录mkdir -p /data/dn

之后在真机上浏览器可以使用192.168.80.128:9870fs.defaultFS里设置的,即主机IP加9870端口)进行测试连接HDFS。

测试连接

测试连接

单独启动节点

上述为启动所有节点,也可以单独启动节点。单独启动节点需要在对应节点使用hdfs --deamon start|status|stop namenode启动/查看状态/停止namenode,将前面的namenode改为datanode可以启动/查看状态/停止datanode。


感谢您的阅读!如果可以,给俺点些关注吧~

Hadoop学习笔记 -1

周日 3月 01 2026
2427 · 10 分钟
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00