写点什么

我的大数据学习总结

作者:Geek-yan
  • 2023-12-23
    北京
  • 本文字数:1867 字

    阅读完需:约 6 分钟

学习的体系

在开始学习大数据时,我参考过许多学习路线的建议,但觉得直接照搬别人的学习顺序未必适合自己。最后结合工作需要和个人经历,我制定了一套适合自己的学习路线:开始学习 Linux 命令和系统基本概念。然后分别学习 Java、Python 以及 Scala 这几种在大数据开发中常用的编程语言。然后着重学习 Hadoop 核心技术如 HDFS 和 MapReduce;接触数据库 Hive 后,学习数据流技术 Kafka 和分布式协调服务 Zookeeper。深入研究 Yarn 和求执行引擎 Spark。此外还了解其他技术如 HBase、Sqoop 等。同时学习计算机网络知识和操作系统原理。后面再系统学习关系数据库 MySQL 和数据仓库理论。学习分布式原理和架构也很重要。这个学习顺序参考了我之前的工作和学习经历情况后订定。需要注意,大数据领域的技术很多很广,如 Flink 也值得研究。本人给出的仅作为一个参考案例,学习者还需结合实际情况选择合适的学习路径。


学习难点与总结(例举)

这里举一个我学习 Spark 时遇到的难点例子, alongside 相关代码。学习难点:Spark 中 RDD 的转换和行动操作在开始学习 Spark 时,理解 RDD 的转换和行动操作是一个难点。RDD 本身是一个不可变的分布式数据集,它支持两类基础操作:转换操作(transformation):转换 RDD 会产生新的 RDD。例如:map、filter、 flatMap 等。行动操作(action):RDD 的转换操作是惰性计算的,只有在行动操作时才会真正触发任务的执行。这给我带来一定困惑:RDD 转换不会执行计算,它们会记录要运行的操作而不运行它们。那么转换产生的 RDD 是存储在 Driver 还是 Executor 中?当有多个转换操作时,它们如何串联执行?行动操作什么时候和怎样触发转换操作的执行?为了解答这些问题,我打印日志观察执行过程,并写了以下代码测试:


// 创建一个RDD val rdd = spark.sparkContext.parallelize(1 to 1000)
// 转换操作val mapRDD = rdd.map(_ * 2) val filterRDD = mapRDD.filter(_ < 100)
// 行动操作 filterRDD.collect.foreach(println)
复制代码


通过观察日志,我看到转换操作记录在 Driver 中而不执行,直到 collect 触发,此时串行所有转换操作在 Executor 上执行。这样解答了我之前的疑问,也巩固了 RDD 基本概念。这个例子帮助我理解 Spark 的运行机制。


再比如我学习 SparkSQL 时遇到的难点例子。学习难点: SQL on RDD 与 SQL on Dataset/DataFrame 的区别。在学习 SparkSQL 时,我发现它支持两种 SQL 查询方式:使用 SQL 对 RDD 进行查询,以及使用 SQL 对 Dataset/DataFrame 进行查询。区分两个概念变得很重要。为了理解区别,我编写了以下代码进行测试:


// 使用RDDval rdd = spark.sparkContext.parallelize(  Seq(("a", 1), ("b", 2), ("c", 3)))
// 注册RDD为临时表rdd.toDF("key", "value").createOrReplaceTempView("table")
// SQL查询spark.sql("SELECT key, value FROM table WHERE value > 1")
// 使用Dataset val df = Seq( ("a", 1), ("b", 2), ("c", 3)).toDF("key", "value")
// SQL查询df.createOrReplaceTempView("table")spark.sql("SELECT key, value FROM table WHERE value > 1")
复制代码


通过观察执行计划,我发现:对 RDD 进行 SQL 查询,内部需要进行对象-关系映射的转换。而 DataFrame/Dataset 由结构化数据表示,可以直接支持 Catalyst 优化执行计划。这解答了我 SQL 两种方式执行效率的不同之处。这个实践例子帮助我真正理解了 SparkSQL 的运作机制。


再比如如何进行大数据的实时计算和分析。以实时交易数据分析为例,需要对每笔交易进行实时计算和分析,找出异常交易模式。这里使用 Spark Streaming 来处理这个需求:设置 Spark Streaming 环境,创建 StreamingContext 对象,设置批处理时间窗口为 1 秒


SparkConf conf = new SparkConf().setAppName("TransactionAnalysis");  JavaStreamingContext jssc = new JavaStreamingContext(conf, Durations.seconds(1));
复制代码


从 Kafkatopic 中读取交易数据流


JavaInputDStream<String> transactionData = KafkaUtils.createStream(jssc, "localhost:2181","transaction-group", topic);
复制代码


对每笔记录进行结构化,解析成 Case 类对象


JavaDStream<Case> transactions = transactionData.map(record -> {  //解析记录返回Case对象  return new Case(/*fields*/);  });
复制代码


实时计算策略,如交易额是否超过一定阈值等


JavaDStream<Case> result = transactions.mapPartitions(iter -> {  //每批次数据内实时分析  while(iter.hasNext()) {    Case t = iter.next();    //计算策略    checkPolicy(t);  }});
复制代码


最后将结果写回其他存储系统如 Redis。

总结

感谢这次分享的机会,它让我对数据与技术 review 了一遍并且有了新的认识。我对大数据还有很深的兴趣,未来还会继续研究相关领域。


用户头像

Geek-yan

关注

还未添加个人签名 2023-12-20 加入

还未添加个人简介

评论

发布
暂无评论
我的大数据学习总结_Geek-yan_InfoQ写作社区