腾讯云EMR搭建Spark与Hadoop集群完全指南:从零构建生产级大数据平台
一、腾讯云EMR概述:为什么选择托管式大数据平台
弹性MapReduce是腾讯云基于云原生技术与开源Hadoop生态打造的一站式大数据处理平台。它整合了Hadoop、Hive、Spark、HBase、Presto、Flink等众多开源组件,用户可以在数分钟内创建安全可靠的专属Hadoop集群。EMR的核心价值在于将复杂的集群部署、软件安装、配置调优、监控运维等工作全部托管化,让大数据工程师能够聚焦于业务逻辑而非基础设施。
在腾讯云EMR的体系架构中,集群运行在CVM云服务器之上,底层存储可以选择HDFS或直接对接COS对象存储。这种灵活的存算架构使得用户既可以使用传统的Hadoop分布式文件系统,也可以采用存算分离的现代数据湖方案。EMR on CVM是当前最主流的部署形态,通过控制台即可完成从集群创建到任务提交的全流程操作。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
二、集群规划:打好地基才能盖高楼
2.1 地域与可用区选择
地域是集群部署的物理数据中心所在位置,不同地域间的云服务器内网不互通。集群创建后无法更改地域,因此需要谨慎选择。选择地域时应遵循三个原则:靠近业务数据源以降低访问延迟、靠近用户群体以减少网络开销、考虑数据合规与灾备需求。
可用区层面,EMR支持单可用区部署与跨可用区高可用部署两种模式。跨可用区部署将服务与管理角色合理分配到多个可用区,当某个可用区发生故障时,其他可用区仍可正常提供服务。对于生产环境,强烈建议开启跨可用区部署。跨可用区部署支持两种策略:平均策略采用主可用区加第二可用区的部署方案,均衡策略则采用主可用区加第二可用区加均衡可用区的三可用区互备方案。
2.2 节点类型与规格选型
EMR集群定义了五种节点类型,每种类型承担不同的职责。Master节点是集群的管理节点,负责调度与协调,主要部署NameNode、ResourceManager、HMaster等进程。非高可用模式下数量为1,高可用模式下数量为2。Master节点建议选择内存较大的实例规格,推荐内存不低于16GB,磁盘建议使用云盘以保证稳定性。
Core节点是计算与存储节点,HDFS中的数据全部存储于此。Core节点扩容后不允许缩容,因此需要合理规划初始规模。非高可用模式下数量不少于2,高可用模式下不少于3。Core节点的存储容量建议不少于500GB。
Task节点是纯计算节点,不存储数据,计算数据来自Core节点或COS。Task节点可以随时扩容和缩容,是实现集群弹性伸缩的关键。Common节点为高可用集群的Master节点提供数据共享同步与容错服务,主要部署ZooKeeper、JournalNode等组件。Router节点用于分担Master节点负载或作为任务提交机。
2.3 高可用架构设计
生产级EMR集群必须开启高可用模式。在高可用架构下,Master节点数量为2,Core节点数量不少于3,Common节点数量不少于3。这种架构确保了NameNode、ResourceManager等核心组件的主备切换能力。当主Master节点异常时,备Master节点可以快速接管服务,保障集群的持续可用。
除了节点级别的高可用,EMR还支持跨可用区的高可用部署。将集群节点分布在不同可用区,可以有效应对机房级别的故障。创建集群时在区域与硬件配置步骤中即可选择跨可用区部署。需要注意的是,跨可用区部署需要确保各可用区有充足的资源配额。
三、控制台创建集群:四步完成部署
通过EMR控制台创建集群需要完成软件配置、区域与硬件配置、基础配置和确认配置信息四个步骤。
3.1 软件配置
登录EMR控制台后,在EMR on CVM集群列表页单击创建集群。软件配置阶段首先选择地域。集群类型选择Hadoop集群,这是最通用的大数据集群类型。应用场景默认为默认场景,如果业务需要ZooKeeper协调服务、HBase列式存储、Presto交互式查询或Kudu快速分析,可以选择对应的场景。
产品版本决定了组件版本组合。例如EMR-V2.7.0包含Hadoop 2.8.5和Spark 3.2.1。若需要Spark 3.x的新特性,应选择EMR-V3.5.0及以上版本。部署组件环节,务必勾选Spark组件。如果后续需要使用Hive进行数据仓库建设,也需要一并勾选。
Kerberos模式默认关闭,开启后集群中的开源组件将以Kerberos安全模式启动。对于需要严格安全认证的生产环境,建议开启。依赖组件模式允许当前集群使用已有集群的组件。软件配置还支持通过JSON文件在集群启动前修改组件的配置参数。
3.2 区域与硬件配置
计费模式支持包年包月和按量计费两种。包年包月预付N个月费用,单价更低;按量计费按使用时长付费,开通时需冻结2小时费用。对于长期运行的 production 集群,包年包月更为经济。
可用区配置决定集群节点的物理分布。集群网络需设置私有网络VPC,EMR集群各节点将部署在该VPC内。集群外网默认开启Master节点的外网IP,用于SSH登录和外网访问组件WebUI。安全组具有防火墙功能,用于控制CVM的网络访问。如果没有现成安全组,EMR会自动创建。
节点配置环节,分别为Master、Core、Task等节点选择实例规格与数量。存储类型支持标准云存储和性能云存储。每个节点的存储容量默认为100GB,可按100GB倍数调整。开启高可用后,节点数量会自动满足HA要求。
3.3 基础配置与确认
基础配置阶段设置集群名称、登录方式(密码或密钥)、项目归属等。确认配置信息页面会展示所有配置清单,核对无误后勾选服务条款,单击立即购买。集群创建过程通常需要数分钟,当集群列表中集群状态显示为运行中时,表示创建成功。
四、连接集群与验证环境
4.1 登录方式
EMR集群支持两种登录方式:WebShell控制台登录与SSH远程登录。WebShell方式最为便捷,在EMR控制台的集群详情页,单击对应云服务器右侧的登录即可进入命令行界面。用户名默认为root,密码为创建集群时设置的密码。
SSH登录适用于Linux/Mac OS本地环境。通过Master节点的外网IP,使用SSH命令连接:[root@local ~]# ssh root@$master_public_ip。生产环境中建议使用密钥对进行认证,提高安全性。
4.2 切换Hadoop用户与验证组件
登录后,首先切换到Hadoop用户以执行大数据相关操作:[root@172 ~]# su hadoop。Spark安装在/usr/local/service/spark目录下。验证Spark安装:[hadoop@172 root]$ cd /usr/local/service/spark && ./bin/spark-submit --version。验证Hadoop安装:[hadoop@172 root]$ hadoop version。
HDFS文件系统操作:[hadoop@172 root]$ hadoop fs -ls /。YARN资源管理验证:[hadoop@172 root]$ yarn node -list。这些基本命令可以确认集群各组件正常运行。
五、提交Spark任务:从Hello World到生产作业
5.1 使用Maven构建Spark应用
推荐使用Maven管理Spark工程。在本地新建Maven工程:mvn archetype:generate -DgroupId=com.example -DartifactId=spark-wordcount -DarchetypeArtifactId=maven-archetype-quickstart。
在pom.xml中添加Spark核心依赖:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.8</version>
</dependency>
</dependencies>添加打包插件以生成包含所有依赖的JAR包:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals><goal>single</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>5.2 编写WordCount示例
创建Java类实现经典的WordCount:
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;
import java.util.Arrays;
public class WordCount {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("WordCount");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile(args[0]);
JavaPairRDD<String, Integer> counts = lines
.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
.mapToPair(word -> new Tuple2<>(word, 1))
.reduceByKey(Integer::sum);
counts.saveAsTextFile(args[1]);
sc.close();
}
}5.3 提交任务到YARN集群
将打包好的JAR上传到EMR集群的Master节点。使用spark-submit提交任务:
[hadoop@172 spark]$ ./bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 4 \
--executor-memory 2g \
--executor-cores 2 \
--class com.example.WordCount \
/path/to/wordcount.jar \
/input/data.txt \
/output/result--master yarn指定运行在YARN上,--deploy-mode cluster表示Driver运行在集群中。--num-executors、--executor-memory、--executor-cores控制资源分配。任务提交后,可以通过YARN ResourceManager WebUI或命令行查看任务状态:[hadoop@172 root]$ yarn application -list。
六、EMR与COS对象存储深度集成
6.1 开启对象存储授权
EMR集群默认集成了Hadoop-COS工具。在创建集群的基础配置页面需要开启对象存储授权。开启后,EMR实例会通过绑定的服务角色EMR_QCSRole获取访问COS的临时密钥。这种方式比固定密钥更安全。
如果集群已创建但未开启COS授权,可以在集群详情页单击授权按钮完成操作。授权需要创建EMR服务相关角色。在访问管理控制台,选择新建角色,角色载体选择腾讯云产品服务,产品服务选择弹性MapReduce。
6.2 使用Hadoop命令读写COS
开启COS授权后,可以通过Hadoop命令直接操作COS中的数据。上传文件到COS:[hadoop@10 hadoop]$ hadoop fs -put /local/file.txt cosn://$bucketname/path/。查看COS文件:[hadoop@10 hadoop]$ hadoop fs -ls cosn://$bucketname/。读取COS文件进行Spark分析:[hadoop@10 spark]$ ./bin/spark-submit --master yarn ./wordcount.py cosn://$bucketname/input.txt cosn://$bucketname/output。
6.3 存算分离架构的优势
将数据存储在COS而计算在EMR集群,构成了典型的存算分离架构。这种架构带来几个核心优势:计算与存储独立伸缩,Task节点可以根据计算需求弹性扩缩容而数据不受影响;COS提供高可用、低成本的存储服务;同一份数据可以被多个EMR集群同时分析。腾讯云EMR Spark引擎针对存算分离场景做了深度优化,在海量文件场景下的写入性能可提升10倍以上。
数据迁移方面,腾讯云EMR支持通过COS中转迁移数据,也支持自建HDFS通过DistCp方式迁移。DistCp方式需要实现自建集群与腾讯云EMR集群的网络互通。
七、性能调优:让Spark与Hadoop发挥极致性能
7.1 Spark核心参数调优
Spark性能调优的核心在于合理配置executor资源与并行度。关键参数包括:spark.executor.memory控制每个executor的内存大小,spark.executor.cores控制每个executor的CPU核数,spark.sql.shuffle.partitions控制shuffle分区数。
推荐配置原则:每个executor的cores不宜超过5个,避免过多线程竞争导致GC压力;executor内存与cores的比例建议保持在2GB至4GB per core;shuffle分区数设置为总核心数的2到3倍。EMR控制台支持通过配置管理功能修改Spark参数,维度范围可选择集群维度或节点维度。
7.2 YARN资源调度优化
YARN是Hadoop生态的资源调度平台。YARN资源分配优化的核心是合理配置队列资源与调度策略。腾讯云EMR对YARN在云原生容器化环境下的性能做了专门优化。通过优化AM节点选择策略和扩展标签表达式语法,提升了任务稳定性和资源利用率。
YARN配置修改通过EMR控制台的集群服务进入YARN组件,选择配置管理。修改yarn-site.xml中的关键参数,如yarn.nodemanager.resource.memory-mb、yarn.scheduler.maximum-allocation-mb等。
7.3 EMR智能管家与AI调优
EMR提供了智能管家TCInsight,结合AI技术实现数据采集、异常识别、根因分析、集群治理与成本优化。通过智能管家的配置中心,可以按需调整策略参数。Spark SQL AI调优功能利用智能算法和机器学习技术优化查询性能。目前支持Spark引擎的SQL调优。在EMR控制台左侧菜单中选中智能管家,进入异常中心或配置中心即可使用。
7.4 HDFS性能优化
HDFS读写性能可以通过增加DataNode节点数量、优化Block大小配置、启用Short-Circuit Local Reads功能等多维度提升。采用HDFS Federation技术将集群划分为多命名空间,可有效提升扩展性和可用性。针对数据倾斜问题,建议采用随机前缀分发或自定义Partitioner等方案。
八、集群监控、告警与弹性伸缩
8.1 监控体系
EMR控制台提供全面的监控能力。集群列表页可以查看集群运行状态、核心服务指标、核心节点指标以及节点负载TOP10。进入集群详情页,可以查看HDFS、YARN、Hive、ZooKeeper、Spark、HBase、Trino等各服务的监控信息。节点监控涵盖监控概览、节点列表和节点热点图。
日志管理方面,EMR支持通过关键词搜索集群核心服务日志和节点系统日志,无需登录节点即可快速查看服务关键日志。这对于故障排查极为高效。
8.2 告警配置
通过云监控控制台可以配置EMR集群的告警策略。在告警策略页面单击创建。配置基本信息、告警规则和通知模板。告警规则可以针对CPU使用率、内存使用率、磁盘使用率、HDFS容量、YARN任务失败率等指标设置阈值。当EMR发生异常时,告警策略能够及时通知运维人员。
8.3 弹性伸缩
EMR支持Task节点与Router节点的弹性伸缩。在集群详情页的资源管理中选择扩容。开启自动伸缩功能后,可以设置伸缩策略,根据负载自动增加或减少节点数量。弹性伸缩使集群能够应对业务波峰波谷,既保证计算能力又节约成本。
Core节点扩容后不允许缩容,因此Core节点的规模需要基于数据量做长期规划。Task节点则可以作为弹性资源灵活调整。
九、常见问题与排障思路
9.1 NameNode故障排查
NameNode是HDFS的核心组件,其元数据管理功能异常将导致整个集群不可用。排查时需重点检查内存使用情况和磁盘空间状态。通过日志分析定位具体原因。
9.2 ResourceManager故障处理
ResourceManager负责YARN的资源调度。故障时首先检查ResourceManager进程状态,查看日志中的错误信息。确认ZooKeeper集群是否正常,因为HA模式下ResourceManager依赖ZooKeeper进行主备选举。
9.3 数据丢失恢复
除利用HDFS备份机制外,应建立定期数据备份制度。COS作为数据湖存储时,可以利用COS的多版本与跨地域复制功能增强数据保护。
十、总结与最佳实践建议
腾讯云EMR极大地降低了Hadoop与Spark集群的部署门槛。通过本文的梳理,读者应能掌握从集群规划、控制台创建、组件验证、任务提交到性能调优与监控运维的完整链路。几点核心建议:生产环境务必开启高可用与跨可用区部署;合理规划Core节点规模避免后期无法缩容;充分利用COS实现存算分离降低存储成本;善用EMR智能管家的AI调优能力提升性能;配置完善的监控告警保障集群稳定运行。
常见问题解答
问:EMR集群创建后能否修改地域或可用区?
答:地域在集群创建后无法更改,可用区也无法直接更改。因此创建集群前需要仔细规划地域与可用区。如需更换,只能重新创建集群并迁移数据。
问:Core节点扩容后为什么不能缩容?
答:Core节点存储了HDFS中的数据块。为了保证数据安全,扩容Core节点后不允许缩容。如果需要弹性伸缩计算资源,应使用Task节点。
问:如何在EMR集群中使用Python提交Spark任务?
答:登录集群切换到Hadoop用户,进入/usr/local/service/spark目录。编写Python脚本后通过spark-submit提交:【hadoop@10 spark]$ ./bin/spark-submit --master yarn ./wordcount.py cosn://$bucketname/input cosn://$bucketname/output。
问:EMR集群与COS集成时需要额外配置吗?
答:创建集群时在基础配置页面开启对象存储授权即可。EMR已默认集成Hadoop-COS。授权后EMR通过临时密钥访问COS,无需配置固定密钥。
问:如何调整EMR集群中Spark组件的配置参数?
答:在EMR控制台的集群服务列表中选择Spark,单击配置管理。可以修改spark-defaults.conf等配置文件中的参数,维度范围可选择集群维度或节点维度。
问:EMR集群的监控告警如何配置?
答:在云监控控制台的告警配置页面创建告警策略。配置告警规则(如CPU、内存、磁盘、HDFS容量等指标阈值)和通知模板。当指标触发阈值时,系统会通过短信、邮件等方式通知运维人员。





