首页 文章 精选 留言 我的

精选列表

搜索[资源紧张],共10008篇文章
优秀的个人博客,低调大师

曾经的独角兽 Docker,如今资金紧张

Docker曾经是商业软件的佼佼者,2015 年估值达到 10 亿美元,但根据 CNBC 的报导,如今,Docker 却在努力筹集急需的资金。 报导称,5 月被任命为 CEO 的Rob Bearden 近日向员工写了一封电子邮件,在信中透露希望公司能获得更多资金帮助。 “我们一直在与投资者合作,以确保获得更多的融资,以继续执行我们的战略”,Rob 在信中写到:“我想分享一下我们的现状,我们目前正在与两名投资者进行积极谈判,并正在确定最终条款。” 尽管 Docker 可能够获得额外的资金,但它是另一家在早期筹集大量资金后发现自己处境不妙的公司。Docker 使得容器技术被广泛普及,但是 Docker 的核心软件是开源的,任何人都可以免费下载并修改,这也就意味着这一部分核心无法在商业上获利,Docker销售的产品可以帮助企业管理部署,但收入没有像高价值订阅软件厂商那样获得大幅增长。 目前 Docker 发言人拒绝置评。

优秀的个人博客,低调大师

别紧张,你只是缺少这个demo

关注我,一个脑回路氢气的程序员,总有一些神奇的想法,最近有问题的老铁,可以下方评论区回复我或者私信我,想要学习什么知识,大家一起努力 概念 JDK动态代理与静态代理是相对的,静态代理是在编译期就确定了代理类和被代理类的关系,且生成代理类。而且静态代理要求被代理的接口必须有其实现,因为代理类实现接口方法实际上是调用接口实现类的方法实现的。而动态代理是在运行期利用JVM的反射机制生成代理类,这里是直接生成类的字节码,然后通过类加载器载入JAVA虚拟机执行。 demo 不做赘述,直接上demo。 被代理类接口 public interface ISubject { void doSomething(); } 被代理类实现 public class SubjectImpl implements ISubject { @Override public void doSomething() { System.out.println("doSomething..."); } } InvocationHandler工具类 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; ​ public class JDKDynamicProxy implements InvocationHandler{ ​ private Object target; ​ public JDKDynamicProxy(){ } ​ public JDKDynamicProxy(Object target){ this.target=target; } ​ public <T>T getProxy(){ System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); // return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } ​ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before..."); Object result=method.invoke(target,args); System.out.println("after..."); return result; } } 测试类 public class TestProxy { ​ public static void main(String[] args) { System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true"); ​ ISubject subject=new JDKDynamicProxy(new SubjectImpl()).getProxy(); //ISubject subject= (ISubject) Proxy.newProxyInstance(subjectImpl.getClass().getClassLoader(),subjectImpl.getClass().getInterfaces(),new JDKDynamicProxy(subjectImpl)); //ISubject subject= (ISubject) Proxy.newProxyInstance(ISubject.class.getClassLoader(),new Class[]{ISubject.class},new JDKDynamicProxy(subjectImpl)); subject.doSomething(); } } 运行结果 before... doSomething... after... 生成的代理类文件 // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // ​ package com.sun.proxy; ​ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; ​ public final class $Proxy0 extends Proxy implements ISubject { private static Method m1; private static Method m3; private static Method m2; private static Method m0; ​ public $Proxy0(InvocationHandler var1) throws { super(var1); } ​ public final boolean equals(Object var1) throws { try { return (Boolean)super.h.invoke(this, m1, new Object[]{var1}); } catch (RuntimeException | Error var3) { throw var3; } catch (Throwable var4) { throw new UndeclaredThrowableException(var4); } } ​ public final void doSomething() throws { try { super.h.invoke(this, m3, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } ​ public final String toString() throws { try { return (String)super.h.invoke(this, m2, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } ​ public final int hashCode() throws { try { return (Integer)super.h.invoke(this, m0, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } ​ static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object")); m3 = Class.forName("ISubject").getMethod("doSomething"); m2 = Class.forName("java.lang.Object").getMethod("toString"); m0 = Class.forName("java.lang.Object").getMethod("hashCode"); } catch (NoSuchMethodException var2) { throw new NoSuchMethodError(var2.getMessage()); } catch (ClassNotFoundException var3) { throw new NoClassDefFoundError(var3.getMessage()); } } } 原理 流程 获取代理类——调用Proxy.newProxyInstance获取代理类的Class实例getProxyClass0(loader, intfs)获取代理类实例的构造方法,并确保其访问权限final Constructor cons = cl.getConstructor(constructorParams)利用反射机制调用构造方法,返回代理类实例,参数是调用Proxy.newProxyInstance时传进来的InvocationHandler实例h 。cons.newInstance(new Object[]{h}) 方法实现前面利用反射机制调用代理类的构造方法时传入了InvocationHandler实例h ,代理类$Proxy0的构造方法如下: public $Proxy0(InvocationHandler var1) throws { super(var1); } ​这是调用父类的构造函数,并传入参数h。所以在获取到代理类实例并执行方法时如测试类的subject.doSomething(),实际调用的是代理类内的doSomething(),如下所示。 public final void doSomething() throws { try { super.h.invoke(this, m3, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } } ​所以JDK动态代理的接口方法实现逻辑是完全由InvocationHandler实例的invoke方法决定的 。 获取代理类的Class实例探究 getProxyClass0(loader, intfs)方法 private static Class<?> getProxyClass0(ClassLoader loader, Class<?>... interfaces) { if (interfaces.length > 65535) { throw new IllegalArgumentException("interface limit exceeded"); } ​ // If the proxy class defined by the given loader implementing // the given interfaces exists, this will simply return the cached copy; // otherwise, it will create the proxy class via the ProxyClassFactory return proxyClassCache.get(loader, interfaces); } ​在Proxy类getProxyClass0(loader, intfs)方法中并无核心代码,主要是方法最后一行去缓存对象中获取代理类实例。 java.lang.reflect.WeakCache 类private static final WeakCache<ClassLoader, Class<?>[], Class<?>> proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory()); ​proxyClassCache是Proxy类的静态变量,调用WeakCache类的构造函数初始化时,传入keyFactory和proxyClassFactory两个实例。注意WeakCache对象的数据结构包含两级键值。接下来就进入WeakCache类的get方法查看一番。 WeakCache类get方法代码 public V get(K key, P parameter) { Objects.requireNonNull(parameter); expungeStaleEntries(); Object cacheKey = CacheKey.valueOf(key, refQueue); // lazily install the 2nd level valuesMap for the particular cacheKey ConcurrentMap<Object, Supplier<V>> valuesMap = map.get(cacheKey); if (valuesMap == null) { ConcurrentMap<Object, Supplier<V>> oldValuesMap = map.putIfAbsent(cacheKey, valuesMap = new ConcurrentHashMap<>()); if (oldValuesMap != null) { valuesMap = oldValuesMap; } } ​ // create subKey and retrieve the possible Supplier<V> stored by that // subKey from valuesMap Object subKey = Objects.requireNonNull(subKeyFactory.apply(key, parameter)); Supplier<V> supplier = valuesMap.get(subKey); Factory factory = null; ​ while (true) { if (supplier != null) { // supplier might be a Factory or a CacheValue<V> instance V value = supplier.get(); if (value != null) { return value; } } // else no supplier in cache // or a supplier that returned null (could be a cleared CacheValue // or a Factory that wasn't successful in installing the CacheValue) ​ // lazily construct a Factory if (factory == null) { factory = new Factory(key, parameter, subKey, valuesMap); } ​ if (supplier == null) { supplier = valuesMap.putIfAbsent(subKey, factory); if (supplier == null) { // successfully installed Factory supplier = factory; } // else retry with winning supplier } else { if (valuesMap.replace(subKey, supplier, factory)) { // successfully replaced // cleared CacheEntry / unsuccessful Factory // with our Factory supplier = factory; } else { // retry with current supplier supplier = valuesMap.get(subKey); } } } } ​get方法核心代码解释获取一级和二级键。 //根据类加载器计算一级键 cacheKey=f(loader); Object cacheKey = CacheKey.valueOf(key, refQueue); ​ //根据接口计算二级键 subKey=g(interfaces); Object subKey = Objects.requireNonNull(subKeyFactory.apply(key, parameter)); ​注意这里的subKeyFactory是Proxy初始化WeakCache类对象proxyClassCache时的入参new KeyFactory();KeyFactory是Proxy的内部类。不妨进入apply简单看一下:@Override public Object apply(ClassLoader classLoader, Class<?>[] interfaces) { switch (interfaces.length) { case 1: return new Key1(interfaces[0]); // the most frequent case 2: return new Key2(interfaces[0], interfaces[1]); case 0: return key0; default: return new KeyX(interfaces); } } ​循环 接下来是一个while循环,第一次循环前factory和supplier都为null ,所以循环体内只是做了一些初始化的工作,并将factory赋值给了supplier(Factory类是WeakCache的内部类,且继承了Supplier类)。第二次循环时,执行V value = supplier.get(),实际上就是调用factory.get()方法获取动态代理类的Class实例 。factory.get()方法方法完整代码如下: @Override public synchronized V get() { // serialize access // re-check Supplier<V> supplier = valuesMap.get(subKey); if (supplier != this) { // something changed while we were waiting: // might be that we were replaced by a CacheValue // or were removed because of failure -> // return null to signal WeakCache.get() to retry // the loop return null; } // else still us (supplier == this) ​ // create new value V value = null; try { value = Objects.requireNonNull(valueFactory.apply(key, parameter)); } finally { if (value == null) { // remove us on failure valuesMap.remove(subKey, this); } } // the only path to reach here is with non-null value assert value != null; ​ // wrap value with CacheValue (WeakReference) CacheValue<V> cacheValue = new CacheValue<>(value); ​ // try replacing us with CacheValue (this should always succeed) if (valuesMap.replace(subKey, this, cacheValue)) { // put also in reverseMap reverseMap.put(cacheValue, Boolean.TRUE); } else { throw new AssertionError("Should not reach here"); } ​ // successfully replaced us with new CacheValue -> return the value // wrapped by it return value; } ​第4行代码Supplier supplier = valuesMap.get(subKey)通过subKey获取方才的supplier也就是factory。然后在第18行调用了valueFactory.apply方法创建动态代理类并将结果赋值给变量value。 valueFactory是初始化WeakCache对象调用构造方法时传入的参数 即Prxoy的内部类ProxyClassFactory对象。 ProxyClassFactory类进入apply方法 public Class<?> apply(ClassLoader loader, Class<?>[] interfaces) { Map<Class<?>, Boolean> interfaceSet = new IdentityHashMap<>(interfaces.length); for (Class<?> intf : interfaces) { /* * Verify that the class loader resolves the name of this * interface to the same Class object. */ Class<?> interfaceClass = null; try { interfaceClass = Class.forName(intf.getName(), false, loader); } catch (ClassNotFoundException e) { } if (interfaceClass != intf) { throw new IllegalArgumentException( intf + " is not visible from class loader"); } /* * Verify that the Class object actually represents an * interface. */ if (!interfaceClass.isInterface()) { throw new IllegalArgumentException( interfaceClass.getName() + " is not an interface"); } /* * Verify that this interface is not a duplicate. */ if (interfaceSet.put(interfaceClass, Boolean.TRUE) != null) { throw new IllegalArgumentException( "repeated interface: " + interfaceClass.getName()); } } ​ String proxyPkg = null; // package to define proxy class in int accessFlags = Modifier.PUBLIC | Modifier.FINAL; ​ /* * Record the package of a non-public proxy interface so that the * proxy class will be defined in the same package. Verify that * all non-public proxy interfaces are in the same package. */ for (Class<?> intf : interfaces) { int flags = intf.getModifiers(); if (!Modifier.isPublic(flags)) { accessFlags = Modifier.FINAL; String name = intf.getName(); int n = name.lastIndexOf('.'); String pkg = ((n == -1) ? "" : name.substring(0, n + 1)); if (proxyPkg == null) { proxyPkg = pkg; } else if (!pkg.equals(proxyPkg)) { throw new IllegalArgumentException( "non-public interfaces from different packages"); } } } ​ if (proxyPkg == null) { // if no non-public proxy interfaces, use com.sun.proxy package proxyPkg = ReflectUtil.PROXY_PACKAGE + "."; } ​ /* * Choose a name for the proxy class to generate. */ long num = nextUniqueNumber.getAndIncrement(); String proxyName = proxyPkg + proxyClassNamePrefix + num; ​ /* * Generate the specified proxy class. */ byte[] proxyClassFile = ProxyGenerator.generateProxyClass( proxyName, interfaces, accessFlags); try { return defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length); } catch (ClassFormatError e) { /* * A ClassFormatError here means that (barring bugs in the * proxy class generation code) there was some other * invalid aspect of the arguments supplied to the proxy * class creation (such as virtual machine limitations * exceeded). */ throw new IllegalArgumentException(e.toString()); } } ​该方法前边包括一些校验、计算出访问标志和包名、代理类定名 ,然后在73行创建代理类的字节码文件,并defineClass0将字节码文件加载到虚拟机和返回代理类的Class实例。 如上就是第一次创建代理类的大致流程。 个人公众号:Java架构师联盟,每日更新技术好文

优秀的个人博客,低调大师

投资者为何紧张不安?

英特尔CEO科再奇 英特尔在智能手机领域掉了队,而PC行业又长期处在青黄不接的下降通道内,它需要为其芯片找一个全新的市场,因为芯片业务是它最重要的业务。 英特尔周一给出了它的答案:汽车,更准确地说是自动驾驶汽车。 英特尔打算以153亿美元的价格收购自动驾驶汽车技术公司Mobileye,这项收购交易的规模在公司历史上排在第二位。 Uber、Alphabet和其他许多公司都认为自动驾驶汽车是未来的发展方向,英特尔想从中分一杯羹,同时也为实现这一目标贡献自己的力量。 就像PC上面贴着的“Intel Inside”标签代表着优秀的品质和崇高的地位一样,英特尔希望其芯片产品能够在另一个产品领域获得同样的地位,让它每年能够卖出数千万件芯片。 这是一项合理的战略,英特尔积极开拓新业务的做法值得肯定。 唯一的问题是,英特尔在收购方面的纪录可不太好。它在1997年至2002年期间即互联网泡沫泛滥的时候收购了大约40家公司。后来,英特尔又大手笔收购了几家公司比如2010年斥资77亿美元收购安全公司McAfee。但是最终的结果却是:减计数亿美元的资产,裁掉数以万计的员工,变卖以前收购的资产。与此同时,英特尔的主营业务始终过分依赖于PC和服务器市场。 长期关注英特尔的投资者都清楚这一点,这也是他们对这项收购交易感到忧虑的部分原因,加上投资者认为英特尔为Mobileye支付的溢价太高,因此英特尔股票周一下跌了大约2%。 一系列失败的收购交易 事实证明,英特尔在互联网泡沫泛滥时疯狂地收购最终演变成了一场灾难。英特尔花了数十亿美元去收购Wind River和Dialogic等公司,希望能够进入智能手机市场,但是事与愿违,它还是没能在智能手机领域站稳脚跟,最终将其无线业务的价值减计了6亿美元。最后,它在2006年将其移动业务卖给了Marvell。 2010年,英特尔以14亿美元的价格收购了英飞凌的无线业务。最早的几款iPhone所用的处理器就是由英飞凌供应的,当时业内人士普遍认为英特尔可以凭借这项交易在智能手机行业占有一席之地。然而不久之后,苹果却把芯片供应商换成了高通,这对英特尔来说可谓釜底抽薪。直到去年才传出消息称,苹果的新款iPhone将采用英特尔的无线调制解调器硬件。 而有些收购交易却令人百思不解,比如收购McAfee的交易似乎跟公司的核心处理器业务完全不搭边。6年过去了,这家公司的价值几乎被砍了一半。最后,英特尔以44亿美元的交易卖掉了McAfee的控股股份。 下一场数据革命将会是视觉数据 英特尔CEO布莱恩·科再奇(Brian Krzanich)周一早上对媒体表示,Mobileye是不同的,他说自己需要让投资者认识到英特尔看重的是自动驾驶汽车能够收集的“视觉数据”。 他说:“下一场数据革命将会是视觉数据。这些自动驾驶汽车可以看见世界,就像我们在寻找事物的时候,视觉数据也变得非常重要了,这是一项全新的业务和一个全新的数据管理领域。” 他说:“这一点在此时此刻很重要,看一看你们现在所做的事,或许到2020年或者2021年的时候,你们就能跟汽车交谈了,因此我们需要参与进来。我们需要推动这个平台向前发展,推动自动驾驶汽车行业的发展,我们坚信我们可以在这个领域发挥出巨大的影响力。” 科再奇还说,他在处理公司失败的收购资产方面保持着良好的纪录,在将McAfee资产剥离之前,McAfee-Intel Security已经实现了盈利。他说,他会像以前一样让Mobileye的管理层直接向他汇报,Mobileye的CEO齐夫·阿维拉姆(Ziv Aviram)将继续领导这部分业务。 虽然Mobileye是英特尔在业务多元化方面进行的最大一笔投资,但这并非公司的唯一一项多元化投资。在过去的几年里,英特尔还在无人机、虚拟现实和物联网等领域进行了大量投资。 鉴于英特尔的收购纪录不太好和公司在向PC和服务器处理器之外的其他领域拓展业务时面临着诸多的挑战,科再奇肩上的担子可不轻。 本文转自d1net(转载)

优秀的个人博客,低调大师

阿里云HybridDB for PG 空间紧张的解法 - 冷热分离、空间锁定、分区、压缩

标签 PostgreSQL , Greenplum , HybridDB for PG 背景 数据库空间不够用怎么办? HDB PG是分布式数据库,空间不够用,扩容呗。但是用户如果不想扩容呢?还有哪些处理方法? 例子 1 查看当前已使用空间 查看数据库空间使用,表的空间使用,索引的空间使用等。 postgres=# select datname,pg_size_pretty(pg_database_size(datname)) from pg_database order by pg_database_size(datname) desc; datname | pg_size_pretty -----------+---------------- postgres | 32 MB template1 | 31 MB template

优秀的个人博客,低调大师

Flink 面试指南 | 终于要跟大家见面了,我有点紧张。(附思维导图)

面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂。但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒? 之前社区帮大家汇总了目前 15 家重量级公司的招聘需求更新在社区招聘帖,也收到了很多同学的反馈: “投了一堆简历,但是都没面试机会”“面试官说是想招高阶人才”“**哎,感觉像我这种毕业年限短,公司又是小公司,本科也不太好的,找工作太难了**” 最后只能总结: “我不优秀,我连面试机会都没有” 也太南南南了! 那么究竟怎么积累技术实力,成为 Flink 高级开发,拿下心仪公司的 offer 呢?小松鼠征集了 Flink 用人主管的核心诉求并提供一份超级清晰、实用的学习路径。虽然我们都不会读心术,但破解面试难题也有思路可寻! Tips:2020 Flink 最新招聘信息查看请见下方链接,内推或有招聘需求的公司可联系小松鼠(微信ID:Ververica2019)投递 JD~ 2020 最新 Flink 招聘岗位汇总:https://juejin.im/post/5df9e25fe51d4557f5450274 01 了解用人主管的需求 在收集招聘信息时小松鼠了解到用人主管的核心需求以及面试了部分同学之后的感受,总结下来主要分为以下方面: 经验都偏少,缺乏复杂场景的历练 在用 Flink 做数据开发,但没有底层修改经验 想招比较高阶的对 Flink 底层有深入研究的同学,但是高阶的太难找 需要有深入研究、改造经验的也可以,独立完成问题排查与任务调优 请注意关键词!「复杂场景历练」、「底层修改经验」、「高阶」、「问题排查与调优」,这是当前大多数岗位对 Flink 开发同学的预期,相当于划重点呐!除了解用人主管的核心需求外,我们也需要结合自身基础,找对合适的岗位方向。 02 找对岗位方向 小松鼠总结了市面上大多数招聘内容,对这些岗位进行分析并整合,可以看到如下表格内容。总体上分为3个方向: (不完全统计,仅供参考) 众所周知,平台开发或底层引擎开发都需要对 Flink 有钻研精神,需要持续专注地深耕,对技术深度、技术原理掌握甚至是源码能力要求都较高。 相对而言,业务类的开发则更关注具体应用场景,大多是在平台的基础上进行业务场景的应用开发,对底层、源码的要求相对较低。 总体上,无论选择哪种技术方向,扎实的语言功底都是基础,而对开源社区的贡献、对 Flink 生态有深入了解等都将成为 blingbling 的加分项。 03 从小白到 Flink 高级开发,应该掌握哪些技术? 如果你了解到自己与用人主管的核心需求存在哪些差异,或者有自己倾向的岗位方向,那么恭喜你已成功完成心理建设。第三部分,小松鼠邀请了 Apache Flink PMC 程鹤群(军长)来帮大家解决“从小白到 Flink 高级开发,应该掌握哪些技术?”这个核心问题,此处感谢 Apache Flink PMC 伍翀(云邪)的反馈与建议。 首先,送你一份 X-mind!公众号后台回复关键字「面试」,可以下载 PDF 版本~ 然后,我们来了解这份思维导图的构成以及如何使用。 1.专治无从下手 根据 Flink 相关招聘岗位要求,我们将重点分为以下部分: 大数据基础理论 SQL & Table Runtime Flink 生态 Flink 实战 整合了当前 Flink 面试岗位中涉及的绝大多数知识点,并分为五大板块。除了 SQL & Table、Runtime 等硬核内容外,生态以及实战是面试中需要重点关注的内容。 2.没有问题的思维导图不是好题库 从问题开始,每块内容都以问题的形式帮你回顾可能考察的知识点。 不仅是 Flink,思维导图对面试中可能涉及的数据基础理论也整理成问题供大家参考。 难易分明,Flink 生态以及实战部分不仅是重点也是大部分难点所在,脑图中相应部分也用笑脸标示,难易程度一眼分明。 希望这份思维导图能够对你有所帮助!大家可以结合之前的 Flink 知识图谱一起学习,效果更佳哦~ Flink 社区知识图谱:https://ververica.cn/developers/special-issue/ 04 跟 5 位大厂同学聊了聊,他们分享了 10 道真题 面试跟从小到大我们经历的大大小小的考试异曲同工,虽然可以临时抱佛脚,可最核心最重要的还是技术实力。下面分享 10 道真题,都来自于生产环境经验丰富的大厂同学,希望对大家面试有所帮助。此处感谢五位同学! BTW,以下真题仅供大家参考,开拓思路,切不可本末倒置,将真题作为面试准备的唯一法宝。 ▼ 真题集 ▼ 1.阐述 Flink 如何处理反压,相比 Storm,Spark Streaming 提供的反压机制,描述其实现有什么不同? 2.阐述流处理引擎提供的三种数据处理语义,解释 Flink Checkpoint 机制如何保证 Flink 程序结果的 Exactly-Once 语义,描述如何通过两阶段提交协议提供端到端的 Exactly-Once 保证?结合 Kafka 如何构建端到端的 Exactly-Once 处理? 3.阐述 Flink 提供的容错机制,解释分布式快照 Chandy Lamport 算法逻辑,剖析 Flink Checkpoint 具体实现流程? 4.如何处理 Flink 作业频繁重启问题? 5.如何优化大状态的 Flink 作业? 6.如何排查 Flink Checkpoint 超时问题? 7.如何处理 Flink 作业中的数据倾斜问题? 8.Flink 反压机制,如何排查反压瓶颈在哪,及如何处理反压问题? 9.哪种 join 可以满足单个流断流的时候仍然能够保证正确的 join 到数据? 10.watermark 是怎么生成和传递的? 以上。真题集部分还有后续,下期更新~我们的目标是“Flink 学得好,工作容易找”!无论您是面试者想要帮忙内推还是企业用人主管想要招聘,欢迎联系小松鼠(微信ID:Ververica2019)。 点击下方链接可查看 2020 社区最新招聘信息汇总~https://juejin.im/post/5df9e25fe51d4557f5450274

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册