温馨提示×

Hadoop任务如何在Ubuntu上高效执行

小樊
44
2025-11-25 03:20:51
栏目: 智能运维

在 Ubuntu 上高效执行 Hadoop 任务的实用指南

一 环境与基础配置

  • 安装 Java 8(Hadoop 3.x 常用稳定版本),并配置环境变量:
    • 安装:sudo apt update && sudo apt install -y openjdk-8-jdk
    • 配置:export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  • 安装并启用 SSH(伪分布式/集群需要节点间通信与免密登录):
    • 安装:sudo apt install -y openssh-server
    • 免密:ssh-keygen -t rsa && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
  • 下载并解压 Hadoop 3.3.x,设置环境变量:
    • 示例:export HADOOP_HOME=/usr/local/hadoop && export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  • 基础配置要点(位于 $HADOOP_HOME/etc/hadoop):
    • core-site.xml:fs.defaultFS=hdfs://localhost:9000
    • hdfs-site.xml:dfs.replication=1(单机/伪分布式),dfs.namenode.name.dirdfs.datanode.data.dir 指向本地存储目录
    • mapred-site.xml:mapreduce.framework.name=yarn
    • yarn-site.xml:yarn.nodemanager.aux-services=mapreduce_shuffle
  • 初始化与启动:
    • 格式化:hdfs namenode -format
    • 启动:start-dfs.sh && start-yarn.sh
    • 验证:jps 应看到 NameNode、DataNode、ResourceManager、NodeManager;访问 http://localhost:9870(HDFS)与 http://localhost:8088(YARN)。

二 高效执行的关键配置

  • 资源配置(yarn-site.xml)
    • 依据节点内存/CPU 合理设置:
      • yarn.nodemanager.resource.memory-mb:为 NodeManager 分配的总内存(如:8192 MB
      • yarn.nodemanager.resource.cpu-vcores:为 NodeManager 分配的 vCore 数(如:8
    • 调度边界:yarn.scheduler.minimum-allocation-mbyarn.scheduler.maximum-allocation-mb
  • 存储与 I/O(hdfs-site.xml)
    • 块大小:按数据规模与访问模式调整 dfs.blocksize(如:256MB 对应 268435456
    • 存储介质:优先使用 SSD 作为 HDFS 数据目录,提高读写性能
  • 并行度与 JVM
    • 并行度:可按数据量与集群规模设置 mapreduce.job.mapsmapreduce.job.reduces
    • 容器内存:结合容器规格设置 mapreduce.map.memory.mbmapreduce.reduce.memory.mb
    • JVM 堆:通过 mapreduce.map.java.optsmapreduce.reduce.java.opts 设置堆大小(通常略小于容器内存,留出堆外开销)
  • 数据压缩(减少磁盘 I/O 与网络传输)
    • 中间数据:mapreduce.map.output.compress=true
    • 输出数据:mapreduce.output.fileoutputformat.compress=true
  • 数据本地化
    • 适度等待本地数据:mapreduce.job.locality.wait,提升 Map 任务数据本地率,降低网络开销。

三 作业提交与调度

  • 提交作业(MapReduce)
    • 示例:hadoop jar /path/to/your-job.jar com.example.YourJobClass input output
  • 运行时调优
    • 通过命令行覆盖参数:-D mapreduce.job.reduces=200 -D mapreduce.map.output.compress=true
  • 监控与诊断
    • 命令行:yarn application -listyarn application -status <app_id>
    • Web UI:ResourceManager 8088HDFS NameNode 9870
  • 工作流调度
    • 复杂依赖与定时调度建议集成 Apache OozieApache Airflow,与 Hadoop/YARN 协同管理任务生命周期。

四 快速性能调优示例

  • 目标:提升大表扫描与聚合类作业的整体吞吐与稳定性
  • 示例配置片段(按需调整数值)
    • yarn-site.xml
      <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>16384</value>
      </property>
      <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>16</value>
      </property>
      <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>2048</value>
      </property>
      <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>16384</value>
      </property>
      
    • hdfs-site.xml
      <property>
        <name>dfs.blocksize</name>
        <value>268435456</value> <!-- 256MB -->
      </property>
      
    • mapred-site.xml
      <property>
        <name>mapreduce.map.output.compress</name>
        <value>true</value>
      </property>
      <property>
        <name>mapreduce.output.fileoutputformat.compress</name>
        <value>true</value>
      </property>
      <property>
        <name>mapreduce.job.reduces</name>
        <value>200</value>
      </property>
      <property>
        <name>mapreduce.map.memory.mb</name>
        <value>4096</value>
      </property>
      <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>8192</value>
      </property>
      <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmx3072m</value>
      </property>
      <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmx6144m</value>
      </property>
      <property>
        <name>mapreduce.job.locality.wait</name>
        <value>5000</value>
      </property>
      
    • 提交示例
      hadoop jar your-job.jar com.example.YourJobClass \
        -D mapreduce.job.reduces=200 \
        -D mapreduce.map.output.compress=true \
        input output
      
    • 调优要点
      • 合理设置 reduce 数量(通常与 reduce 阶段目标并行度、数据倾斜程度相关)
      • 容器内存与 JVM 堆配比建议为:堆 ≈ 容器内存的 75%–85%
      • 结合 数据本地化压缩 减少网络与 I/O 开销。

0