Hadoop集群搭建与Java电商项目面试指南

Hadoop集群搭建完整教程

1. 基础环境准备

1.1 硬件配置建议

  • 节点类型:建议采用1个NameNode+2个DataNode的最小集群架构,每个节点配置8核CPU、32GB内存、500GB存储空间(HDD或SSD)。
  • 网络要求:确保节点间带宽≥1Gbps,延迟≤1ms,建议使用内网IP互通。
  • 操作系统:推荐CentOS 7/8或Ubuntu 20.04 LTS,关闭防火墙(生产环境需配置安全组规则)。

1.2 软件依赖安装

  • Java环境:安装OpenJDK 11或Oracle JDK 11,配置JAVA_HOME环境变量。
    1. # CentOS示例
    2. sudo yum install java-11-openjdk-devel
    3. echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk" >> ~/.bashrc
    4. source ~/.bashrc
  • SSH免密登录:在NameNode生成密钥对并分发至DataNode。
    1. ssh-keygen -t rsa
    2. ssh-copy-id user@datanode1
    3. ssh-copy-id user@datanode2

2. Hadoop集群部署

2.1 版本选择与下载

  • 推荐使用Hadoop 3.3.x版本(兼容HDFS Federation与YARN资源隔离),从官网下载二进制包或通过包管理器安装。
    1. wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
    2. tar -xzf hadoop-3.3.6.tar.gz -C /opt/

2.2 核心配置文件

  • hadoop-env.sh:指定Java路径与堆内存。
    1. export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
    2. export HADOOP_HEAPSIZE=4096 # NameNode建议4GB以上
  • core-site.xml:配置HDFS与YARN的默认访问地址。
    1. <configuration>
    2. <property>
    3. <name>fs.defaultFS</name>
    4. <value>hdfs://namenode:9000</value>
    5. </property>
    6. <property>
    7. <name>hadoop.tmp.dir</name>
    8. <value>/opt/hadoop/tmp</value>
    9. </property>
    10. </configuration>
  • hdfs-site.xml:设置副本数与块大小。
    1. <property>
    2. <name>dfs.replication</name>
    3. <value>2</value> # 根据节点数调整
    4. </property>
    5. <property>
    6. <name>dfs.blocksize</name>
    7. <value>134217728</value> # 128MB
    8. </property>
  • mapred-site.xml:启用YARN作为资源管理器。
    1. <property>
    2. <name>mapreduce.framework.name</name>
    3. <value>yarn</value>
    4. </property>
  • yarn-site.xml:配置资源调度参数。
    1. <property>
    2. <name>yarn.nodemanager.resource.memory-mb</name>
    3. <value>24576</value> # 24GB
    4. </property>
    5. <property>
    6. <name>yarn.scheduler.maximum-allocation-mb</name>
    7. <value>20480</value> # 单任务最大内存
    8. </property>

2.3 集群启动与验证

  1. 格式化NameNode(首次启动时执行):
    1. hdfs namenode -format
  2. 启动服务
    1. # 在NameNode执行
    2. start-dfs.sh
    3. start-yarn.sh
    4. # 或使用systemd管理(推荐生产环境)
  3. 验证状态
    1. hdfs dfsadmin -report # 查看节点状态
    2. jps # 检查进程(NameNode/DataNode/ResourceManager/NodeManager)

3. 集群优化实践

  • 数据本地化:通过yarn.scheduler.minimum-allocation-mb控制任务内存,减少网络传输。
  • 小文件合并:使用Hadoop Archive(HAR)或CombineFileInputFormat优化存储。
  • 监控告警:集成Ganglia或Prometheus+Grafana,设置磁盘使用率>80%的告警规则。

Java电商项目面试技巧

1. 项目经验表达方法

1.1 架构设计能力

  • 高频问题:如何设计高并发订单系统?
    • 回答要点
      • 分层架构:Controller→Service→DAO,使用异步消息(如Kafka)解耦订单创建与支付。
      • 数据库分库分表:按用户ID哈希分片,支持水平扩展。
      • 缓存策略:Redis存储商品库存,使用Lua脚本保证原子性。
        1. // Redis库存扣减示例
        2. public boolean deductStock(Long productId, int quantity) {
        3. String key = "product:stock:" + productId;
        4. String script = "if (tonumber(redis.call('get', KEYS[1])) >= tonumber(ARGV[1])) " +
        5. "then return redis.call('decrby', KEYS[1], ARGV[1]) " +
        6. "else return 0 end";
        7. Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),
        8. Collections.singletonList(key), String.valueOf(quantity));
        9. return result != null && result >= 0;
        10. }

1.2 性能优化案例

  • 问题:如何优化电商首页加载速度?
    • 解决方案
      • 静态资源CDN加速,动态接口使用Nginx缓存。
      • 数据库查询优化:添加商品分类索引,避免SELECT *
      • 异步加载:非核心数据(如推荐商品)通过AJAX延迟加载。

2. 技术深度考察点

2.1 分布式事务

  • 场景:订单支付与库存扣减的原子性。
  • 方案对比
    | 方案 | 适用场景 | 缺点 |
    |———————|———————————————|——————————|
    | TCC | 强一致性要求 | 实现复杂 |
    | 本地消息表 | 最终一致性 | 依赖定时任务 |
    | Saga模式 | 长事务流程 | 补偿逻辑开发量大 |

2.2 并发控制

  • 问题:如何防止超卖?
    • 实现方式
      • 数据库乐观锁:UPDATE product SET stock=stock-1 WHERE id=? AND stock>=1
      • 分布式锁:Redisson的RLock或Zookeeper节点。
        1. // Redisson分布式锁示例
        2. RLock lock = redissonClient.getLock("order_lock_" + productId);
        3. try {
        4. lock.lock(10, TimeUnit.SECONDS);
        5. if (productService.checkStock(productId, quantity)) {
        6. orderService.createOrder(...);
        7. }
        8. } finally {
        9. lock.unlock();
        10. }

3. 面试常见问题

  • Q1:Hadoop与Spark的区别?
    • A:Hadoop基于磁盘存储,适合离线批处理;Spark基于内存计算,支持迭代算法与实时流处理。
  • Q2:电商系统如何保证数据一致性?
    • A:核心交易采用强一致性(如Seata分布式事务),非核心数据允许最终一致性(如MQ异步更新)。
  • Q3:如何设计秒杀系统?
    • A
      1. 前端限流:按钮置灰+验证码。
      2. 队列削峰:将请求写入Kafka,按QPS限流消费。
      3. 库存预热:提前加载至Redis,使用DECR原子操作。

总结

Hadoop集群搭建需重点关注网络配置、参数调优与监控体系,而Java电商项目面试需通过具体案例体现架构设计与问题解决能力。建议开发者结合实际项目,准备3-5个核心问题(如分布式锁、分库分表)的详细回答,并掌握Hadoop生态工具(如Hive、HBase)的基本原理。