开发者学堂课程【2020版大数据实战项目之DMP广告系统(第四阶段):框架搭建_配置文件工具类思路介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/679/detail/11800
框架搭建_配置文件工具类思路介绍
内容介绍:
一、课前介绍
二、创建配置
三、配置生成表
四、工具的设计思路
一、课前介绍
介绍过 config 的加载。接下来正式使用 config ,使用方式比较难,通过这一小节可以知道,在真正项目开发的时候,该怎么去加载配置文件,以及配置文件的工具类。优化代码应该写成什么样。第一步,创建一个配置文件,叫做 spark ,配置文件是为 spark 准备的,放一些创建 spark 所使用的参数,这是第一步。第二步我们简单讲解一下参数大概是什么内容。第三步导入配置,读取配置的工具,刚才已经导入过,所以这一步,就不再赘述。第四步,配置文件的工具,就是读取配置文件工具的设计思路。第五步,创建配置文件工具类,这个视频会比较长,而且东西会相当的难,这段代码其实是很有实力的,所以,按部就班的去完成内容。
二、创建配置
配置文件叫做 spark.conf ,提前把这些内容拷贝一下。进入到 idea 当中,在 resources 下创建一个新的 file ,叫做 spark.conf 。把刚才复制的内容放进来,这时配置文件就已经搞定了。这里面都是为 spark 准备的一些参数,这些名字也就对应了 spark 的参数名,这里很多参数,这些参数也没有时间一个一个去说,那么进入到笔记当中,大致看一下内容。
三、配置列成表
Spark.worker. Timeout 。是 master 和 worker 之间进行通信,有时 worker 可能会因为不可抗力的因素,比如说机器爆炸了,闪电刚好落下来砸中机器,机器跪了, worker 就没有办法继续提供服务。所以 master 要有一定的机制淘汰某些已经跪掉的 worker , master 和 worker 之间会有心跳包的保持, master 多长时间没有收到 worker 的心跳包,就认为 worker 已经失效了。是通过参数进行配置的。
spark.network. Timeout 。比 timeout 更大范围的 timeout ,也是超时时间,这个超时时间是 worker 跟 excute之间的通信,不同的 execute 之间的通信。不同的 block manager之间的通信,他们的网络通信时长,超时时间都由参数进行相应的控制。
Spark. Cores.max 。 spark 有可能把任务给部署到集群当中,集群会有一些管理工具,集群当中管理集群的机器, spark 能申请到多少个 cpu 核心,就是这个参数进行控制。
Spark. Task. Maxfailures 首先 spark 本身是支持弹性容错,就是说某一个 task 失败,不会把整个 job 都挡掉,所以 spark 会有能够容忍的最大的失败数,最大的失败数,其实就是 Task. Maxfailures , Maxfailures 设置的就是最大允许多少任务失败,如果超过这个数,那么 spark 就得把整个 job 给关掉。
Spark.speculation 就是推测执行的意思, hadoop 当中也支持推测执行,比如说有十个任务同时在运行,有一个 task 比别人都慢,这个时候就可能会再去跑一份 task ,哪个快,我就按照谁的结果。这个机制叫做推测执行。
Spark.drive.allowmutilplecontext 。后面是完全没有意义的。一般不要这样去做,只在必不可免的情况下,只在实在没有办法时,才设置这个参数,这个参数的意思是,是否允许多个 contacts ,默认情况下是不允许的,如果允许多个,那么这些 contact 也只有一个活动,所以没有意义。
Spark.serializer 。是需要画工具的意思。
Spark.buffer.pagesize 。这个参数比较重要,但是一般情况下不会设置它,它也比较难,在读取磁盘或者读取内存时,是按页读的,就是一页一页地读,这个东西就叫做 page 。为什么要有buffer.pagesize 是因为 spark 自己编写了一套管理内存的工具,是在什么时候加入的呢?在钨丝计划的时候,前面我也讲过,有一个钨丝计划,让 spark 可以使用对外内存,对外内存也叫做 unsafe 内存。大家要注意一般情况下不给普通开发者使用的,要自己去管理内存,它没有相应的垃圾回收机制,第一步就是一些参数。在真的用到的时候,还要再进行查询。
四、配置工具的设计思路
第三步是去导入 maven 还有 typesafe 的 config 。我们说一说配置工具的设计思路。去具体的写配置工具。首先要想一个问题,在设计一个工具的时候,应该做什么。一般情况下初学者,也包括刚工作的时候,假如说在设计一个新东西的时候,一定会犯一个错误,就是提笔就上。原因比较多方面,一方面可能是这些东西没有经验,所以不知道应该去规避哪些问题。还有一方面可能是着急。第一步有很多人会选择直接就写工具,其实第一步应该缓下来,让自己静下来去想一想,这个工具是干什么用的,你的需求是什么,一定要先想清楚这一件事。即使不能把整个流程设计好,把结构设计好,但一定要想清楚需求是什么。如果没有办法想清楚这一点,设计出来的东西是不会好的。那所有的初学者,包括一些工作了七八年的人在设计出来的东西还是不尽人意,就是因为没有想清楚这个东西要怎么用。
首先,就是为了去读取配置文件。要让一个工具类去读取配置文件,而不是在代码的某个地方自己去读取是因为我们要解耦,第一,是要解耦,第二,是要复用。使用 typesafe.config 这样的工具来加载配置文件。加载的配置文件在 sparksession 创建的时候使用。 看到都是 spark 的配置,既然已经明确了需求,那就实现这个需求大致有几种方式。
第一种方式,就是在配置文件当中有好多项,第一项,是Key ,是 val ,大概十项左右。像第一种做法,可以直接通过 config 一个一个去读,是比较自然的选择方式,但是不是特别好。还有一种配置方式加载的方式,可以直接通过隐式转换,为 spark station 设置配置。比如说在创建 sparksession 对象的时候,能调用 loud consider 的方法,为 spark station 加载。那么在代码里面所写的东西就很少。把这两个方式给大家总结一下。
首先第一种,创建 spark session 的时候,还是先明确需求,现在的需求就是创建提供工具类加载配置文件,最终目的是创建 spark session 对象的时候使用。接下来我们再去看一看两种方式。
方式一,可以在创建 sparksession 的时候使用这样的方式。
Sparksession.config(“...”,config get...
Config(“...”,config get...)
有几个参数,就要写几行这种没有用的代码。
还有一种方式,
Sparksession.loadconfig().getorcreate() 希望通过这个方法,直接把所有该加载的配置全都加载出来。那么就不需要多写一行代码,直接把所有的参数全都加载下,那大家觉得哪种方式好呢?有人说第一种,我不能说第一种不好,因为第一种足够简单,但是还要再挑战一下自我,写一点难的东西。所以工具类,就选择第二种方式。第二种方式相对比较难,大家要注意啊, Spark session ,本来没有 load config 这个方法,现在想编写一个 load config 方法,给 spark session 去使用,该怎么去编写。如何动态的为 spark session 类加一个方法叫做 load concent ,前面在 scala 部分学过一个知识点,叫演示转换。在演示转换的时候,可以把 spark session 转成其他的类,一个类当中只要有了 config 的方法,就可以了。这就是要做的功能,通过隐式转换来做,这个部分选择这样的方式原因很简单,scala 有很多自己独有的特性,这些特性非常好用,也是 scala 最核心的特性,其中有一个叫做隐式转换,任何其他的语言当中都没有的。大家要知道,或者有的是没有它的高级。 scala 的隐式转换真的特别厉害,所以我们要去了解它。