在不同版本号hdfs集群之间转移数据
在不同版本号hdfs集群之间转移数据
只是这有几个问题:
- 效率减少
- 占用本地磁盘空间
- 不能应付实时导数据需求
- 两个进程须要协调,复杂度添加
更好的办法是在同一个进程内一边读src数据,一边写des集群。只是这相当于在同一个进程空间内载入两个版本号的hadoop jar包。这就须要在程序中使用两个classloader来实现。
下面代码能够实现classloader载入自己定义的jar包,并生成须要的Configuration对象:
- URL[] jarUrls = new URL[1];
- jarUrls[0]=new File(des_jar_path).toURI().toURL();
- ClassLoader jarloader = new URLClassLoader(jarUrls, null);
- Class Proxy = Class.forName("yourclass", true, jarloader);
- Configuration conf = (Configuration)Proxy.newInstance();
可是因为在生成HTable对象时。须要使用这个conf对象,而载入这个conf对象的代码本身是由默认的classloader载入的,也就是0.19.2的jar包。
所以在以上代码最后一行所强制转换的Configuration对象仍然是0.19.2版本号的。
那怎么办呢?
琢磨了一会,发现假设要实现以上功能,必须将生成HTable对象,以及以后的全部hbase操作都使用这个新的classloader。因此这个新的classloader必须载入除了0.19.2的jar包外全部须要用到的jar包,然后把全部操作都封装进去。在外面用反射来调用。
这种话。通常构造函数都不为空了。因此须要用到Constructor来构造一个自己定义的构造函数
代码段例如以下:
- main.java
- void init(){
- ClassLoader jarloader = generateJarLoader();
- Class Proxy = Class.forName("test.writer.hbasewriter.HBaseProxy", true, jarloader);
- Constructor con = Proxy.getConstructor(new Class[]{String.class, String.class, boolean.class});
- Boolean autoflush = param.getBoolValue(ParamsKey.HbaseWriter.autoFlush, true);
- proxy = con.newInstance(new Object[]{path, tablename, autoflush});
- }
- void put(){
- ...
- while((line = getLine()) != null) {
- proxy.getClass().getMethod("generatePut",String.class).invoke(proxy, line.getField(rowkey));
- Method addPut = proxy.getClass().getMethod("addPut",
- new Class[]{String.class, String.class, String.class});
- addPut.invoke(proxy, new Object[]{field, column, encode});
- proxy.getClass().getMethod("putLine").invoke(proxy);
- }
- }
- ClassLoader generateJarLoader() throws IOException {
- String libPath = System.getProperty("java.ext.dirs");
- FileFilter filter = new FileFilter() {
- @Override
- public boolean accept(File pathname) {
- if(pathname.getName().startsWith("hadoop-0.19.2"))
- return false;
- else
- return pathname.getName().endsWith(".jar");
- }
- };
- File[] jars = new File(libPath).listFiles(filter);
- URL[] jarUrls = new URL[jars.length+1];
- int k = 0;
- for (int i = 0; i < jars.length; i++) {
- jarUrls[k++] = jars.toURI().toURL();
- }
- jarUrls[k] = new File("hadoop-0.20.205.jar")
- ClassLoader jarloader = new URLClassLoader(jarUrls, null);
- return jarloader;
- }
- HBaseProxy.java
- public HBaseProxy(String hbase_conf, String tableName, boolean autoflush)
- throws IOException{
- Configuration conf = new Configuration();
- conf.addResource(new Path(hbase_conf));
- config = new Configuration(conf);
- htable = new HTable(config, tableName);
- admin = new HBaseAdmin(config);
- htable.setAutoFlush(autoflush);
- }
- public void addPut(String field, String column, String encode) throws IOException {
- try {
- p.add(column.split(":")[0].getBytes(), column.split(":")[1].getBytes(),
- field.getBytes(encode));
- } catch (UnsupportedEncodingException e) {
- p.add(column.split(":")[0].getBytes(), column.split(":")[1].getBytes(),
- field.getBytes());
- }
- }
- public void generatePut(String rowkey){
- p = new Put(rowkey.getBytes());
- }
- public void putLine() throws IOException{
- htable.put(p);
- }
总之,在同一个进程中载入多个classloader时一定要注意,classloader A所载入的对象是不能转换成classloader B的对象的,当然也不能使用。
两个空间的相互调用仅仅能用java的基本类型或是反射。
很多其它精彩内容请关注:http://bbs.superwu.cn
关注超人学院微信二维码:
关注超人学院java免费学习交流群:
在不同版本号hdfs集群之间转移数据的更多相关文章
- Hadoop(四)HDFS集群详解
前言 前面几篇简单介绍了什么是大数据和Hadoop,也说了怎么搭建最简单的伪分布式和全分布式的hadoop集群.接下来这篇我详细的分享一下HDFS. HDFS前言: 设计思想:(分而治之)将大文件.大 ...
- adoop(四)HDFS集群详解
阅读目录(Content) 一.HDFS概述 1.1.HDFS概述 1.2.HDFS的概念和特性 1.3.HDFS的局限性 1.4.HDFS保证可靠性的措施 二.HDFS基本概念 2.1.HDFS主从 ...
- HDFS集群优化篇
HDFS集群优化篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统级别优化 1>.优化文件系统(推荐使用EXT4和XFS文件系统,相比较而言,更推荐后者,因为XF ...
- HDFS集群PB级数据迁移方案-DistCp生产环境实操篇
HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...
- sqoop将oracle数据导入hdfs集群
使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...
- HDFS集群中DataNode的上线与下线
在HDFS集群的运维过程中,肯定会遇到DataNode的新增和删除,即上线与下线.这篇文章就详细讲解下DataNode的上线和下线的过程. 背景 在我们的微职位视频课程中,我们已经安装了3个节点的HD ...
- vivo 万台规模 HDFS 集群升级 HDFS 3.x 实践
vivo 互联网大数据团队-Lv Jia Hadoop 3.x的第一个稳定版本在2017年底就已经发布了,有很多重大的改进. 在HDFS方面,支持了Erasure Coding.More than 2 ...
- 【Redis】集群故障转移
集群故障转移 节点下线 在集群定时任务clusterCron中,会遍历集群中的节点,对每个节点进行检查,判断节点是否下线.与节点下线相关的状态有两个,分别为CLUSTER_NODE_PFAIL和CLU ...
- HDFS集群balance(2)-- 架构概览
转载请注明博客地址:http://blog.csdn.net/suileisl HDFS集群balance,对应版本balance design 6 如需word版本,请QQ522173163联系索要 ...
随机推荐
- iOS开发--in house发布和安装(ipa重新签名)
in house从字面意思理解就是‘内部的’,in house版本的ipa就是一个用于公司内部使用或测试的一个苹果应用程序安装包. 作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要 ...
- POJ 2187 Beauty Contest 凸包
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27276 Accepted: 8432 D ...
- 设计模式模式适配器(Adapter)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模 ...
- 怎样学好C++语言
昨天写了一篇怎样学好C语言,就有人回复问我怎样学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家实用.首先,由于怎样学好C语言中谈到了算法和系统,所以这里就仅仅谈C++语言. C++是最难 ...
- <转载>div+css布局教程之div+css常见布局结构定义
在使用div+css布局时,首先应该根据网页内容进行结构设计,仔细分析和规划你的页面结构,你可能得到类似这样的几块: 页面层容器.页面头部.标志和站点名称.站点导航(主菜单).主页面内容.子菜单.搜索 ...
- Mac os 进行Android开发笔记(1)
1> MAC OS Android环境搭建: 2>MAC OS 配置 Andoid ADB: 3>MAC OS 上进行Android真机调试: Android 开发环境搭建: 点击 ...
- android调用音乐播放器,三种方
小弟想请问一下.怎样在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了.主要是有两种方法,可是都不是我想要的. 第一种是.使用mp3音乐文件的uri.和intent,进行调用.可是这样 ...
- 树后台数据存储(採用webmethod)
树后台数据存储 关于后台数据存储将集中在此篇解说 /* *作者:方浩然 *日期:2015-05-26 *版本号:1.0 */ using System; using System.Collection ...
- asp.net笔试题
1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成 ...
- 【ASP.NET Web API教程】2.4 创建Web API的帮助页面
原文:[ASP.NET Web API教程]2.4 创建Web API的帮助页面 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 ...