别问我大数据怎么学,先说我凌晨三点心悸那次
我 2021 年从郑州跑到杭州,报了个所谓包就业的大数据班,学费 26800,分 12 期,每期 2233。教室在滨江,楼下沙县,我连续 41 天吃葱油拌面,吃到看见酱油就反胃。那会儿每天敲 Hive SQL 到凌晨 2 点半,右手腕腱鞘炎,贴 8 毛钱一张的膏药,心跳快得像 Flink 背压时任务堆在 checkpoint。后来我面了 17 家公司,12 家问 Flink,9 家问 Spark,只有 3 家认真问 Hadoop 原理。这个数字不权威,就是我自己的记录,但我拿它当一个偏见:2025 年还从 Hadoop 权威指南第一章啃起,可能不是勤奋,是绕路。
但我也不是让你不学 Hadoop。HDFS 默认块 128MB,副本 3,NameNode 堆一般给小公司 4G 到 8G,这些你总得知道,不然面试官问小文件为什么压 NameNode,你只能傻笑。Hadoop 3.3.6 配 Hive 3.1.3,元数据库 MySQL 8.0,这个组合我装过 6 次,前 5 次都死在 guava 版本冲突。有人说用 CDH,我劝你别,至少别在生产随便用,CM 6.3.2 之后社区版已经停更,出了问题你搜到的帖子可能还是 2019 年。这话有偏见,我知道。
Hive 数据倾斜:我那个 90 分钟卡在 reduce 99% 的夜班
真实案例:一张订单表 8.7 亿行,按 shop_id 分组,其中 3 个测试店铺占了 42% 数据。Hive SQL 跑到 reduce 99%,卡了 90 分钟,我坐在工位看进度条,像看心电图。后来处理步骤:
- 先
explain看 stage,发现 reduce 只有 1 个,因为hive.exec.reducers.bytes.per.reducer默认 256MB,但空 key 和热点 key 全冲一个 reducer。 - 对空 key 加随机后缀:
concat(nvl(shop_id,'null'), '_', cast(rand()*100 as int)),但这样会丢结果,要再聚合一次。逻辑有漏洞,我当时没想全,后来补了个子查询。 - 小表 join 大表,开
hive.auto.convert.join=true,hive.mapjoin.smalltable.filesize=25000000。如果小表超过 25MB,别硬开,容易 OOM。 - 热点 key 单独抽出来,比如 shop_id 在 3 个测试店铺里,先过滤,再 union all 回去。
- 调
hive.exec.reducers.max=999,不是越大越好,我设 999 后 YARN 队列排队 27 个 application,被运维骂。
最后那个任务从 92 分钟降到 23 分钟。不一定都是参数功劳,有一半是数据被我过滤了。你看,这就是业余和生产的区别。
Spark 小文件合并:参数我贴出来,但你别照抄
Spark 3.5.1 写 Hive 表,如果按天分区,一天 1440 个文件,每个 8KB 到 300KB,Hive 查询会想死。我的做法:
- 写之前开 AQE:
spark.sql.adaptive.enabled=true,spark.sql.adaptive.coalescePartitions.enabled=true,spark.sql.adaptive.advisoryPartitionSizeInBytes=128MB。 - 强制 shuffle 分区别用默认 200,我一般按数据量算:10GB 数据 / 128MB ≈ 80,但我会设 120 到 200,留余量。小数据 1GB 以下我设 20,宁可少一点。
- 写入前
repartition(partitionCol, floor(rand()*N))这种别乱用,会搞出更多小文件。更稳的是coalesce,但 coalesce 不能增分区,只能减。 - Hive 侧兜底:
hive.merge.mapfiles=true,hive.merge.mapredfiles=true,hive.merge.size.per.task=256000000,hive.merge.smallfiles.avgsize=16000000。这俩 16MB 和 256MB 是默认附近,我改过,能合并,但不是实时。 - 如果已经有一堆小文件,用
ALTER TABLE ... CONCATENATE只对 RCFile/ORC 有用,TextFile 不行。我踩过,白等 40 分钟。 - 最后我写了个 Airflow 任务,每天凌晨 2 点跑
insert overwrite到新分区,302 个小文件变成 11 个。老板没夸我,因为报表还是卡,卡的原因是 BI 工具每次都 select *。
Flink 背压:别一上来就加并行度,我胃疼了一周
Flink 1.18.1 那套作业,Kafka 12 个分区,source 并行度 12,下游 sink 并行度 4,结果背压红成一片。我一开始把全局并行度从 4 调到 16,TaskManager 从 2 台 8G 加到 4 台 16G,checkpoint 还是超时。后来看 Web UI 的 BackPressure 页面,发现是 sink 写 MySQL 太慢,batch size 500,每条 insert 一次,QPS 只有 230。改法:
- 先别动并行度,看
numRecordsInPerSecond和numRecordsOutPerSecond,还有 checkpoint 的alignment时间。我的 checkpoint interval 60000ms,timeout 600000ms,min-pause 30000ms,其实已经算宽松。 - 把 sink 改成 500 条一批,开
rewriteBatchedStatements=true,MySQL URL 加useServerPrepStmts=false。QPS 从 230 到 2100。这个参数有坑,MySQL 5.7 和 8.0 表现不一样。 - Kafka 消费者
max.poll.records=500,别默认 500?默认就是 500,我改到 200 反而稳。你看,又是矛盾。 - 背压没消,但 checkpoint 从失败 14 次降到 1 次。我那天胃疼,喝了三九胃泰,不是广告,是真喝。
我的偏见:大数据培训班最值钱的是那套虚拟机,不是老师
我不推荐一上来买 2 万以上的课。你真想学,先在自己电脑装:VMware 或 VirtualBox,开 3 台 CentOS 7.9,每台 2 核 4G,Hadoop 3.3.6,Hive 3.1.3,Spark 3.5.1,Flink 1.18.1,Kafka 3.6.1。装完跑一个 100 万行 CSV,用 Hive 建外部表,Spark 读 Hive,Flink 从 Kafka 读 JSON 写 MySQL。这套跑通,比你背 200 道面试题有用。但注意,3 台 4G 虚拟机可能卡到你怀疑人生,我当年给一台加到 8G,风扇像要起飞。
如果你问我大数据开发到底学什么,我的答案是:SQL 占 50%,调参排错占 30%,Java/Python 占 15%,剩下 5% 是跟运维吵架。这个比例不科学,但我干了 3 年,感觉差不多。别信什么“零基础 6 个月年薪 30 万”,我同班 37 个人,6 个月后还在数据行业的 9 个,其中 4 个是运维,2 个是 BI,只有 3 个写 Spark/Flink。这个数据只代表我们那个班,不是行业报告,但它让我对包就业广告生理性反感。
最后,如果你正在卡 Hive 倾斜、Spark 小文件、Flink 背压,先别急着报课。把报错贴出来,把 explain、Spark UI、Flink Web UI 截图,把参数一行行改。大数据这行,很多时候不是你不会,是你不知道那个参数藏在哪。我到现在也经常搜,搜到 2017 年的 CSDN 文章,照样得试。逻辑有漏洞就有漏洞吧,能跑通比正确重要,至少对我是这样。