0%

Hadoop 配置实践:从零开始搭建单机环境

Hadoop 单机环境搭建:配置文件、启动命令、验证方法,照着做就能跑

Hadoop 的配置,关键不在改参数,在于搞清楚”每个文件是管什么的、改了什么会影响什么”。

四个核心配置文件,各管一摊:

文件 管什么
core-site.xml Hadoop 核心配置——HDFS 地址、临时目录
hdfs-site.xml HDFS 配置——副本数、元数据目录、数据目录、Web UI 端口
mapred-site.xml MapReduce 配置——用 YARN 跑、任务内存
yarn-site.xml YARN 配置——资源调度、节点管理

配置文件:四个文件,照着改就行

配置文件都在 $HADOOP_HOME/etc/hadoop/ 目录下。

1. core-site.xml——Hadoop 的”总入口”

告诉 Hadoop “HDFS 在哪”、”临时文件放哪”。

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
<!-- HDFS 地址:NameNode 跑在哪台机器、哪个端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- 临时文件目录(需手动创建) -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/tmp</value>
</property>
</configuration>

关键点: fs.defaultFS 写对了,Hadoop 才能找到 NameNode。单机用 localhost,集群用主机名。

2. hdfs-site.xml——HDFS 自己怎么跑

副本数、元数据存哪、数据存哪。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>
<!-- 副本数:单机测试必须设 1,生产环境设 3 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- NameNode 元数据存哪 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/hadoop/namenode</value>
</property>
<!-- DataNode 数据存哪 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/hadoop/datanode</value>
</property>
<!-- Web UI 端口:2.x 是 50070,3.x 是 9870 -->
<property>
<name>dfs.namenode.http-address</name>
<value>localhost:50070</value>
</property>
<!-- SecondaryNameNode 通信端口(2.7.x 专属:50090) -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>localhost:50090</value>
</property>
<!-- 允许 HDFS 递归删除目录(测试环境开启) -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>

关键点: dfs.replication 在单机必须设 1,不然 DataNode 只有一个节点,存不了 3 份,NameNode 会一直卡在安全模式。

3. mapred-site.xml——MapReduce 跑在什么框架上

从模板复制一份再改:

1
cp mapred-site.xml.template mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>
<!-- 配置jobTracker的主机名或者ip、端口 还可以配置TaskTracker-->
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<!-- 指定 MapReduce 运行在 YARN 上(2.7.x 核心配置) -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 历史服务器地址(查看任务历史) -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>localhost:10020</value>
</property>
<!-- 历史服务器 HTTP UI 端口 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>localhost:19888</value>
</property>
<!-- 单个 Map 任务内存限制 -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<!-- 单个 Reduce 任务内存限制 -->
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
</configuration>

关键点: mapreduce.framework.name 不设成 yarn,MapReduce 会跑在本地模式,不会用 YARN 调度。

4. yarn-site.xml——YARN 资源调度配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<configuration>
<!-- 启用 YARN 对 MapReduce 洗牌(Shuffle)的支持 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- ResourceManager 主机地址(2.7.x 默认为 localhost) -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
<!-- ResourceManager HTTP UI 端口(2.7.x 专属:8088,与 3.x 一致) -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>localhost:8088</value>
</property>
<!-- NodeManager 分配给容器的物理内存上限 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<!-- 单个容器最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<!-- 单个容器最大内存 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
</configuration>

关键点: yarn.nodemanager.aux-services 不配,MapReduce 的 Shuffle 跑不起来,Reduce 拿不到 Map 的输出数据。

创建目录 + 初始化 NameNode

配置文件里写的目录(/opt/data/hadoop/ 下的)要手动创建,并给 Hadoop 用户写权限:

1
2
mkdir -p /opt/data/hadoop/{tmp,namenode,datanode}
chown -R hadoop:hadoop /opt/data/hadoop

初始化 NameNode(只有第一次启动需要):

1
hdfs namenode -format

看到 successfully formatted 就成功了。注意: 格式化会清空 NameNode 元数据目录,已有的数据会丢失。生产环境执行这个操作要极度谨慎。

启动 Hadoop

单机环境分步启动(2.x 推荐,避免依赖问题):

1
2
3
4
5
# 启动 HDFS
./start-dfs.sh

# 启动 YARN
./start-yarn.sh

启动后,用 jps 确认进程:

1
2
3
4
5
6
7
jps
# 应该看到:
# NameNode
# DataNode
# SecondaryNameNode
# ResourceManager
# NodeManager

少了任何一个,说明对应的服务没起来。

验证 Web UI

  • HDFS:http://localhost:50070(3.x 是 9870)
  • YARN:http://localhost:8088

能打开说明服务正常。HDFS 页面能看到 “Live Nodes” 数量,应该 ≥ 1。

HDFS 基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建目录
hdfs dfs -mkdir /test

# 上传文件
hdfs dfs -put localfile.txt /test/

# 查看文件列表
hdfs dfs -ls /test/

# 查看文件内容
hdfs dfs -cat /test/localfile.txt

# 下载文件
hdfs dfs -get /test/localfile.txt ./

常见问题

问题1:启动后 DataNode 进程缺失

hadoop.tmp.dir 权限不对,或者格式化 NameNode 后 DataNode 的数据目录残留了旧的 namespaceID。

解决:

1
2
3
rm -rf /opt/data/hadoop/datanode/*
hdfs namenode -format
./start-dfs.sh

问题2:50070 端口打不开

NameNode 没起来。先 jps 确认有没有 NameNode 进程,再看日志:

1
tail -100 $HADOOP_HOME/logs/hadoop-*-namenode-*.log

问题3:任务提交后卡住

检查 YARN 资源是否够。yarn-site.xmlyarn.nodemanager.resource.memory-mb 设太小,Container 申请不到内存,任务一直等。

问题4:HDFS 一直处于安全模式

DataNode 数量不足或副本数不够。单机环境 dfs.replication 设成 1 了吗?

关闭 Hadoop

1
2
./stop-yarn.sh
./stop-dfs.sh

欢迎关注我的其它发布渠道