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 在哪”、”临时文件放哪”。
<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 自己怎么跑
副本数、元数据存哪、数据存哪。
<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 跑在什么框架上
从模板复制一份再改:
cp mapred-site.xml.template mapred-site.xml
<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 资源调度配置
<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 用户写权限:
mkdir -p /opt/data/hadoop/{tmp,namenode,datanode}
chown -R hadoop:hadoop /opt/data/hadoop
初始化 NameNode(只有第一次启动需要):
hdfs namenode -format
看到 successfully formatted 就成功了。注意: 格式化会清空 NameNode 元数据目录,已有的数据会丢失。生产环境执行这个操作要极度谨慎。
启动 Hadoop
单机环境分步启动(2.x 推荐,避免依赖问题):
启动 HDFS
./start-dfs.sh
启动 YARN
./start-yarn.sh
启动后,用 jps 确认进程:
jps
应该看到:
NameNode
DataNode
SecondaryNameNode
ResourceManager
NodeManager
少了任何一个,说明对应的服务没起来。
验证 Web UI
- HDFS:
http://localhost:50070(3.x 是 9870) - YARN:
http://localhost:8088
能打开说明服务正常。HDFS 页面能看到 “Live Nodes” 数量,应该 ≥ 1。
HDFS 基本操作
创建目录
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。
解决:
rm -rf /opt/data/hadoop/datanode/*
hdfs namenode -format
./start-dfs.sh
问题2:50070 端口打不开
NameNode 没起来。先 jps 确认有没有 NameNode 进程,再看日志:
tail -100 $HADOOP_HOME/logs/hadoop-*-namenode-*.log
问题3:任务提交后卡住
检查 YARN 资源是否够。yarn-site.xml 里 yarn.nodemanager.resource.memory-mb 设太小,Container 申请不到内存,任务一直等。
问题4:HDFS 一直处于安全模式
DataNode 数量不足或副本数不够。单机环境 dfs.replication 设成 1 了吗?
关闭 Hadoop
./stop-yarn.sh
./stop-dfs.sh