算法 (Algorithm)


Review


Tip

  • 工作中遇到的问题,踩过的坑,学习的点滴知识

Share

  1. share .super().thisDoc

视频

陈大惠老师:色情泛滥对现代人的伤害


袋鼠云

自己没遇到过的问题,考虑一下别人有没有遇到过,如果有的话,那就去学习,如果没有,说明这个问题本身可能有问题——简单地说,就是“抄”

设计产品思路


Flink x

  • 离现实时数据采集工具

image.png

  • 原理
    • 数据传输 InputChannel | OutputResult
    • 伪装成两个Format 对数据进行 采集与存储的工作

image.png

  • 数据采集这一块 有一些亮点 (后期加入生态圈)

image.png


Flink CDC

  • 是变更数据获取的缩写 (Change Data Capture
  • 将源数据 (Source)的变动同步到一个或者多个目的地 (Sink)
    • 再同步的过程中可以对数据进行一些额外操作 (GROUP BY | JOIN | ...
  • 解决: 对同一份数据多次下沉的场景,解决传统方式对一份数据多次分发的操作
  • 比如落地: Redis | Elasticsearch | ClickHouse

image.png

实现模式

主动查询

  • 在数据源表中 保存上次更新的时间戳跟版本号
  • 下游通过不断查询和上次记录做对比,来确定数据是否有变动,是否需要同步

  • 优点:不涉及底层 binlog 的采集与解析 (减少数据传输过程)

  • 缺点:下游需要不断查询对数据库 Service 有压力

    事件接收

  • 通过触发器 Trigger 或者 日志的操作记录该事件 (例如 Transaction logBinary logWrite-ahead log

  • 源数据发生改变后附加在 Trigger 或者 LOG(Binlog) 中
  • 下游通过数据库底层的协议订阅并消费这些事件,对数据库的变动做回放的效果 达到数据的同步工作

  • 优点:可以减少对数据库 Service 的压力,实时性比较高

  • 缺点:针对于 LOG 需要有对应的解析工具参与解析 (CanalDataxDebezium),学习成本高

image.png

使用方法

输入 Debezium 等数据流进行同步

  • 特点:做到处理的解耦工作 | 对于数据的处理得到的解耦合

    相当于是 DBServer -> Debezium -> Kafka -> Flink -> TransSink

  • 缺点:个人感觉维护量大、学习成本高

直接对接上游数据库进行数据同步

  • 特点:学习成本小、无需考虑内部细节(内部都做了封装、开箱即用)

    相当于是 DBServer -> Flink CDC ->TransSink

  • 缺点:不透明化、内聚、数据安全需要考虑 (类似做一些加密操作)

参考链接


Flink On Yarn

image.png


FLINK 上传与加载用户依赖的策略

  • 在 Java 中类加载器 是 双亲委派机制

    双亲委派机制暴露的问题

  • 通过一个类的完全限定名来判断并加载类

  • FLINK 集群中运行着整个 FLINK 的框架代码,用户程序作为客体需要加载自己的依赖
  • 根据双亲委派机制 会派送给父加载器去加载依赖,当父加载器加载到错误的依赖时,进而引发异常

双亲委派机制源码

  1. protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
  2. synchronized (getClassLoadingLock(name)) {
  3. // First, check if the class has already been loaded
  4. Class<?> c = findLoadedClass(name);
  5. if (c == null) {
  6. try {
  7. if (parent != null) {
  8. c = parent.loadClass(name, false);
  9. } else {
  10. c = findBootstrapClassOrNull(name);
  11. }
  12. } catch (ClassNotFoundException e) {
  13. // ClassNotFoundException thrown if class not found
  14. // from the non-null parent class loader
  15. }
  16. if (c == null) {
  17. // If still not found, then invoke findClass in order
  18. // to find the class.
  19. c = findClass(name);
  20. }
  21. }
  22. if (resolve) {
  23. resolveClass(c);
  24. }
  25. return c;
  26. }
  27. }

Chid - First 类加载器

  1. protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
  2. Class<?> c = this.findLoadedClass(name);
  3. if (c == null) {
  4. String[] var4 = this.alwaysParentFirstPatterns;
  5. int var5 = var4.length;
  6. for(int var6 = 0; var6 < var5; ++var6) {
  7. String alwaysParentFirstPattern = var4[var6];
  8. if (name.startsWith(alwaysParentFirstPattern)) {
  9. return super.loadClass(name, resolve);
  10. }
  11. }
  12. try {
  13. c = this.findClass(name);
  14. } catch (ClassNotFoundException var8) {
  15. c = super.loadClass(name, resolve);
  16. }
  17. }
  18. if (resolve) {
  19. this.resolveClass(c);
  20. }
  21. return c;
  22. }
  • 整体是有一个过滤器
  • 在过滤器的逻辑体内 (Child-First
  • 不是向原先的 parent.loadClassfindClass ,而是先 findClassloadClass

    Other

  • Flink 中支持的两种类加载器 (Parent - FirstChid - First)都是 URLClassLoader 子类

修改 类加载器 方式

  • 修改配置文件参数

    • Flink尝试从应用程序隐藏类路径中的许多依赖项。
    • 这有助于减少应用程序代码和类路径中的依赖关系之间的依赖关系冲突。
      1. classloader.resolve-order : child-first / parent-first
  • 修改源代码

image.png
image.png


  • Flink 类加载器

image.png

  • JVM 类加载器

image.png


参考链接


Other

解决

  • Linux - git: command not found

    1. Centos下使用: yum install git -y 或者 yum install -y git
    2. Ubuntu/Debian下使用: apt-get install git -y
  • Connect: network is unreachable

    1. https://blog.csdn.net/liukun321/article/details/6662950
  • Yum: Loader plugins : fastestmirror

    1. https://blog.csdn.net/totxian/article/details/45191091
    2. https://blog.csdn.net/u010520146/article/details/85220785
  • Could not retrieve mirrorlist

    1. https://jingyan.baidu.com/article/6c67b1d6f492d62786bb1e45.html
  • Failed to connect to xx :Network is unreachable

    1. https://blog.csdn.net/qq_28641401/article/details/96305174
  • AUTHENTICATING FOR org.freedesktop.systemd1.manage-units

  • Failed to restart network.service: Access denied ```java [panel@panel5-2 ~]$ service network restart Restarting network (via systemctl): ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units === Authentication is required to manage system services or units. Authenticating as: Cloud User (gsadmin) Password: polkit-agent-helper-1: pam_authenticate failed: Authentication failure ==== AUTHENTICATION FAILED === Failed to restart network.service: Access denied See system logs and ‘systemctl status network.service’ for details.
    1. [FAILED]

[panel@panel5-2 ~]$ sudo service network restart Restarting network (via systemctl): [ OK ]

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/667110/1617533837765-2fad1447-4833-4642-a2a7-aa056a8e50b7.png#align=left&display=inline&height=400&margin=%5Bobject%20Object%5D&name=image.png&originHeight=799&originWidth=1202&size=104679&status=done&style=none&width=601)
  2. ```shell
  3. # 查看文件大小
  4. du -sh xxx
  5. # 查看用户
  6. cat /etc/passwd
  7. # 查看网卡
  8. nmcli d
  9. # 重启网关
  10. 7.x 以下 : service network restart
  11. 7.x + : systemctl restart network
  12. 8.x : nmcli c reload [DEVICE]

centos8重启网卡命令nmcli
linux network配置


通过源码理解Java类加载机制与双亲委派模型