在 Linux 上使用 Hadoop 进行机器学习的实践路线
一、方案总览与适用场景
- 使用 Hadoop MapReduce 直接做机器学习,适合大规模数据的批处理与特征工程,如 线性回归、K-Means 等可并行算法;优点是生态成熟、容错强,缺点是迭代训练慢、交互性差。
- 使用 Hadoop 存储 + Spark MLlib 做机器学习,适合需要多轮迭代、性能更高的场景;HDFS 负责海量数据存储,Spark 负责任务调度与 ML 训练,开发效率高、生态完善。
二、环境准备与 Hadoop 伪分布式部署
- 安装 Java 8(Hadoop 3.x 常用版本):
- 命令示例:sudo apt-get update && sudo apt-get install -y openjdk-8-jdk;验证:java -version
- 下载并解压 Hadoop(示例版本:3.2.1):
- 命令示例:wget https://downloads.apache.org/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
- 解压与重命名:sudo tar -zxvf hadoop-3.2.1.tar.gz -C /usr/local && sudo mv /usr/local/hadoop-3.2.1 /usr/local/hadoop
- 配置环境变量(~/.bashrc 或 /etc/profile):
- 示例:export HADOOP_HOME=/usr/local/hadoop;export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin;source 使其生效
- 伪分布式关键配置(etc/hadoop/ 下):
- core-site.xml:设置 fs.defaultFS 为 hdfs://localhost:9000
- hdfs-site.xml:设置 dfs.replication=1
- mapred-site.xml:设置 mapreduce.framework.name=yarn
- yarn-site.xml:配置 NodeManager 与 ResourceManager 相关参数
- 初始化与启动:
- 格式化 HDFS:hdfs namenode -format
- 启动集群:start-dfs.sh 与 start-yarn.sh
- 验证:jps 应看到 NameNode、DataNode、ResourceManager、NodeManager;Web UI:NameNode 50070、ResourceManager 8088。
三、方案一 使用 Hadoop MapReduce 做机器学习
- 数据准备与上传:
- 将本地数据上传至 HDFS:hadoop fs -mkdir -p /data;hadoop fs -put local.csv /data
- 示例一 线性回归(基于 Hadoop Streaming 的“最小二乘”演示)
- 思路:Mapper 输出 “x y”,Reducer 汇总 Σx、Σy、Σxy、Σx²、n,最后计算斜率与截距
- 命令提交:
- hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar
-input /data/input -output /data/lr_out
-mapper mapper.py -reducer reducer.py
-file mapper.py -file reducer.py
- 示例二 K-Means 聚类(迭代 MapReduce)
- 思路:每轮迭代由 Mapper 计算点到各中心距离并打标签,Reducer 求新中心;重复至收敛
- 步骤:将 vectors 与初始 clusters 上传 HDFS;编译打包(如 KMeans.jar);执行迭代作业;查看 /data/kmeans_out 结果
- 适用说明:MapReduce 适合线性可并行、批处理友好的算法;对需要多次梯度迭代的模型(如深度学习)效率较低。
四、方案二 Hadoop 存储 + Spark MLlib 做机器学习(推荐)
- 安装与配置 Spark(与 Hadoop 共享 HDFS)
- 下载解压 Spark,配置 SPARK_HOME 与 PATH;在 spark-env.sh 中设置 HADOOP_CONF_DIR 指向 Hadoop 配置目录,使 Spark 读写 HDFS
- 提交示例(PySpark + MLlib 逻辑回归):
- 命令:spark-submit --master yarn --deploy-mode client
lr_spark.py hdfs:///data/train.csv hdfs:///data/lr_model
- 核心代码片段(lr_spark.py):
- from pyspark.sql import SparkSession
- from pyspark.ml.feature import VectorAssembler
- from pyspark.ml.classification import LogisticRegression
- spark = SparkSession.builder.appName(“LR”).getOrCreate()
- df = spark.read.csv(“hdfs:///data/train.csv”, header=True, inferSchema=True)
- assembler = VectorAssembler(inputCols=[“f1”,“f2”,“f3”], outputCol=“features”)
- df = assembler.transform(df).select(“features”,“label”)
- lr = LogisticRegression(maxIter=100, regParam=0.01)
- model = lr.fit(df); model.save(“hdfs:///data/lr_model”)
- 适用说明:Spark MLlib 提供 逻辑回归、决策树、随机森林、K-Means 等常用算法,迭代快、API 友好,适合在 HDFS 上做大规模训练与评估。
五、实践建议与常见问题
- 数据组织与格式:优先使用 列式格式(如 Parquet/ORC) 提升 I/O;文本 CSV 需合理设置分隔符与 Schema
- 资源配置:YARN 侧根据数据量与并发度设置 yarn.nodemanager.resource.memory-mb、yarn.scheduler.maximum-allocation-mb;容器内存需覆盖堆外与开销
- 迭代训练优化:MapReduce 训练尽量“增加 map 并行度、减少 shuffle 数据量”;Spark 训练合理设置 分区数、批大小 与 缓存策略
- 开发与调试:先用 小样本本地模式 验证流程,再提交到 YARN;充分利用 日志与 Web UI 定位瓶颈
- 何时选择哪种方案:数据预处理/批处理与可并行统计算法优先 MapReduce;需要多轮迭代、复杂特征与更高性能优先 Spark MLlib;也可组合使用(HDFS 存储 + Spark 训练)