最近 用户提交了一个问题 说他的jar包里明明包含相关的类型 但是在提交Flink作业的时候 却报出classnotfound的错误

查看之后发现 这里是flink的一个没有说的太明白的地方

用户的代码之所以报错 是因为在代码中引用了mapreduce相关的东西

我们知道 flink会在生成jobGraph的时候就解析所有需要序列化的类型 这里就涉及需要解析mapReduce的类型 比如Text

但是用户明明打进去了呀 怎么还是找不到

这就涉及flink的类加载机制 flink对于自己的代码 采用默认的java的类加载机制 但是对于用户的代码 使用了自定义的FlinkClassLoader

好吧 这就是问题所在 因为在解析序列化类型的时候 flink会传入默认的类加载器 这个类加载器不包含用户代码 所以在寻找的时候 显然是找不到

知道了问题的症结所在 解决起来却不完美

方案1:将相关的依赖放入lib目录,即加入flink的类加载器

方案2:用户提交作业的时候,动态的将用户的类加入默认的类加载器

以上两个方法都可以解决问题,但缺点也是明显的:

方案1的缺点在于需要频繁的更新flink的lib目录,方案2的缺点在于打破了Flink的类加载机制,使得用户不能独立的使用不同版本的依赖。

至于最终的选择的方案,就需要根据平台具体的情况判断了,目前我们选择的是放入lib包,避免classpath热加载导致不可预知的问题。

不过也简单实验了下热加载的方案。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List; /**
* to add the jar to this jvm classpath dynamically, but no need to unload the class because jvm will decide when
* to unload the class
*/
public class ClassloaderUtil { private static final Logger LOG = LoggerFactory.getLogger(ClassloaderUtil.class);
private static Method addURL;
private static URLClassLoader system; static {
try {
addURL = URLClassLoader.class.getDeclaredMethod("addURL",
new Class[]{URL.class});
addURL.setAccessible(true); system = (URLClassLoader) ClassLoader.getSystemClassLoader();
} catch (Exception ex) {
LOG.error("Fail to load classloader staff.", ex);
}
} public static void addToClasspath(File file, List<URL> classpath) {
addToClasspath(file);
for (URL url : classpath) {
addToClasspath(url);
}
} public static void addToClasspath(String file) {
addToClasspath(new File(file));
} public static void addToClasspath(File file) {
try {
addToClasspath(file.toURL());
} catch (Exception ex) {
LOG.error("Fail to dynamically add classpath.", ex);
}
} public static void addToClasspath(URL url) {
try {
addURL.invoke(system, new Object[]{url});
LOG.info("Dynamically add classpath [{}]", url);
} catch (Exception ex) {
LOG.error("Fail to dynamically add classpath.", ex);
}
}
}

参考了https://blog.csdn.net/treeroot/article/details/631490

Flink的序列化与flink-hadoop-compatibility的更多相关文章

  1. Hadoop Compatibility in Flink

    18 Nov 2014 by Fabian Hüske (@fhueske) Apache Hadoop is an industry standard for scalable analytical ...

  2. Flink(三)Flink开发IDEA环境搭建与测试

    一.IDEA开发环境 1.pom文件设置 <properties> <maven.compiler.source>1.8</maven.compiler.source&g ...

  3. Flink学习笔记:Flink API 通用基本概念

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  4. Flink(一)Flink的入门简介

    一. Flink的引入 这几年大数据的飞速发展,出现了很多热门的开源社区,其中著名的有 Hadoop.Storm,以及后来的 Spark,他们都有着各自专注的应用场景.Spark 掀开了内存计算的先河 ...

  5. Flink学习笔记-新一代Flink计算引擎

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  6. Flink 源码解析 —— Flink JobManager 有什么作用?

    JobManager 的作用 https://t.zsxq.com/2VRrbuf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  7. Flink 源码解析 —— Flink TaskManager 有什么作用?

    TaskManager 有什么作用 https://t.zsxq.com/RZbu7yN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- ...

  8. [转帖]Flink(一)Flink的入门简介

    Flink(一)Flink的入门简介 https://www.cnblogs.com/frankdeng/p/9400622.html 一. Flink的引入 这几年大数据的飞速发展,出现了很多热门的 ...

  9. flink初识及安装flink standalone集群

    flink architecture 1.可以看出,flink可以运行在本地,也可以类似spark一样on yarn或者standalone模式(与spark standalone也很相似),此外fl ...

随机推荐

  1. Vue 生产环境部署

    简要:继上次搭建vue环境后,开始着手vue的学习;为此向大家分享从开发环境部署到生产环境(线上)中遇到的问题和解决办法,希望能够跟各位VUE大神学习探索,如果有不对或者好的建议告知下:*~*! 一. ...

  2. 北京Uber优步司机奖励政策(12月26日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. Python 获取windows管理员权限办法

    from __future__ import print_function import ctypes, sys, os def is_admin(): try: return ctypes.wind ...

  4. Java: Replace a string from multiple replaced strings to multiple substitutes

    Provide helper methods to replace a string from multiple replaced strings to multiple substitutes im ...

  5. Fiddler使用总结(一)

    Fiddler基础知识 .Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. .代理就 ...

  6. 【Extremely Basic Words for Listening】word list

    [Extremely Basic Words for Listening]word list updated continuously recite count: 0 careless exercis ...

  7. Python-3.6 安装pycrypto 2.6

    最近接触公司后台管理系统的开发,其中涉及到加密模块pycrypto. 重点来了!!!!敲黑板!!!! pycrypto在PyCharm中跟其他的模块不一样,pip install pycrypto安装 ...

  8. vs2008 c#项目调试dll源码,问题:“若要调试此模块,请将其项目生成配置更改为“调试”模式” 的解决方案

    情况: 1:有程序 Trans.exe 的vs2008 c#源码:Trans.exe项目里引用了 Water.dll: 2:有Water.dll的项目源码: 3:想在Trans.exe里调试Water ...

  9. HADOOP docker(六):hive简易使用指南

    前言1.hive简介1.1 hive组件与相应功能:1.2 hive的表类型1.3 分区表1.3 分隔符1.4 hive的数据存储2.数据类型2.1 基本数据类型2.1 复杂数据类型2.3 NULL3 ...

  10. [leetcode-693-Binary Number with Alternating Bits]

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...