大数据开发学了半年找不到工作?我踩过的Hive数据倾斜、Spark小文件、Flink背压坑,附参数

🔑 关键词:大数据开发学习路线,Hive数据倾斜,Spark小文件合并,Flink背压排查,大数据培训

📖 摘要:一个业余数据民工的踩坑记录:Hive数据倾斜、Spark小文件合并、Flink背压排查,附具体参数和步骤,也夹杂我报培训班、凌晨心悸、被运维骂的私人经历。

别问我大数据怎么学,先说我凌晨三点心悸那次

图片

我 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 分钟,我坐在工位看进度条,像看心电图。后来处理步骤:

  1. explain 看 stage,发现 reduce 只有 1 个,因为 hive.exec.reducers.bytes.per.reducer 默认 256MB,但空 key 和热点 key 全冲一个 reducer。
  2. 对空 key 加随机后缀:concat(nvl(shop_id,'null'), '_', cast(rand()*100 as int)),但这样会丢结果,要再聚合一次。逻辑有漏洞,我当时没想全,后来补了个子查询。
  3. 小表 join 大表,开 hive.auto.convert.join=truehive.mapjoin.smalltable.filesize=25000000。如果小表超过 25MB,别硬开,容易 OOM。
  4. 热点 key 单独抽出来,比如 shop_id 在 3 个测试店铺里,先过滤,再 union all 回去。
  5. 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=truespark.sql.adaptive.coalescePartitions.enabled=truespark.sql.adaptive.advisoryPartitionSizeInBytes=128MB
  • 强制 shuffle 分区别用默认 200,我一般按数据量算:10GB 数据 / 128MB ≈ 80,但我会设 120 到 200,留余量。小数据 1GB 以下我设 20,宁可少一点。
  • 写入前 repartition(partitionCol, floor(rand()*N)) 这种别乱用,会搞出更多小文件。更稳的是 coalesce,但 coalesce 不能增分区,只能减。
  • Hive 侧兜底:hive.merge.mapfiles=truehive.merge.mapredfiles=truehive.merge.size.per.task=256000000hive.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。改法:

图片

  1. 先别动并行度,看 numRecordsInPerSecondnumRecordsOutPerSecond,还有 checkpoint 的 alignment 时间。我的 checkpoint interval 60000ms,timeout 600000ms,min-pause 30000ms,其实已经算宽松。
  2. 把 sink 改成 500 条一批,开 rewriteBatchedStatements=true,MySQL URL 加 useServerPrepStmts=false。QPS 从 230 到 2100。这个参数有坑,MySQL 5.7 和 8.0 表现不一样。
  3. Kafka 消费者 max.poll.records=500,别默认 500?默认就是 500,我改到 200 反而稳。你看,又是矛盾。
  4. 背压没消,但 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 文章,照样得试。逻辑有漏洞就有漏洞吧,能跑通比正确重要,至少对我是这样。

🏷️ 标签: