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环境变量。# CentOS示例sudo yum install java-11-openjdk-develecho "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk" >> ~/.bashrcsource ~/.bashrc
- SSH免密登录:在NameNode生成密钥对并分发至DataNode。
ssh-keygen -t rsassh-copy-id user@datanode1ssh-copy-id user@datanode2
2. Hadoop集群部署
2.1 版本选择与下载
- 推荐使用Hadoop 3.3.x版本(兼容HDFS Federation与YARN资源隔离),从官网下载二进制包或通过包管理器安装。
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gztar -xzf hadoop-3.3.6.tar.gz -C /opt/
2.2 核心配置文件
- hadoop-env.sh:指定Java路径与堆内存。
export JAVA_HOME=/usr/lib/jvm/java-11-openjdkexport HADOOP_HEAPSIZE=4096 # NameNode建议4GB以上
- core-site.xml:配置HDFS与YARN的默认访问地址。
<configuration><property><name>fs.defaultFS</name><value>hdfs://namenode:9000</value></property><property><name>hadoop.tmp.dir</name><value>/opt/hadoop/tmp</value></property></configuration>
- hdfs-site.xml:设置副本数与块大小。
<property><name>dfs.replication</name><value>2</value> # 根据节点数调整</property><property><name>dfs.blocksize</name><value>134217728</value> # 128MB</property>
- mapred-site.xml:启用YARN作为资源管理器。
<property><name>mapreduce.framework.name</name><value>yarn</value></property>
- yarn-site.xml:配置资源调度参数。
<property><name>yarn.nodemanager.resource.memory-mb</name><value>24576</value> # 24GB</property><property><name>yarn.scheduler.maximum-allocation-mb</name><value>20480</value> # 单任务最大内存</property>
2.3 集群启动与验证
- 格式化NameNode(首次启动时执行):
hdfs namenode -format
- 启动服务:
# 在NameNode执行start-dfs.shstart-yarn.sh# 或使用systemd管理(推荐生产环境)
- 验证状态:
hdfs dfsadmin -report # 查看节点状态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脚本保证原子性。
// Redis库存扣减示例public boolean deductStock(Long productId, int quantity) {String key = "product
" + productId;String script = "if (tonumber(redis.call('get', KEYS[1])) >= tonumber(ARGV[1])) " +"then return redis.call('decrby', KEYS[1], ARGV[1]) " +"else return 0 end";Long result = redisTemplate.execute(new DefaultRedisScript<>(script, Long.class),Collections.singletonList(key), String.valueOf(quantity));return result != null && result >= 0;}
- 回答要点:
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节点。// Redisson分布式锁示例RLock lock = redissonClient.getLock("order_lock_" + productId);try {lock.lock(10, TimeUnit.SECONDS);if (productService.checkStock(productId, quantity)) {orderService.createOrder(...);}} finally {lock.unlock();}
- 数据库乐观锁:
- 实现方式:
3. 面试常见问题
- Q1:Hadoop与Spark的区别?
- A:Hadoop基于磁盘存储,适合离线批处理;Spark基于内存计算,支持迭代算法与实时流处理。
- Q2:电商系统如何保证数据一致性?
- A:核心交易采用强一致性(如Seata分布式事务),非核心数据允许最终一致性(如MQ异步更新)。
- Q3:如何设计秒杀系统?
- A:
- 前端限流:按钮置灰+验证码。
- 队列削峰:将请求写入Kafka,按QPS限流消费。
- 库存预热:提前加载至Redis,使用
DECR原子操作。
- A:
总结
Hadoop集群搭建需重点关注网络配置、参数调优与监控体系,而Java电商项目面试需通过具体案例体现架构设计与问题解决能力。建议开发者结合实际项目,准备3-5个核心问题(如分布式锁、分库分表)的详细回答,并掌握Hadoop生态工具(如Hive、HBase)的基本原理。