在不同版本号hdfs集群之间转移数据

    最简单的办法就是把src集群的数据导到本地,然后起还有一个进程将本地数据传到des集群上去。

只是这有几个问题:

  • 效率减少
  • 占用本地磁盘空间
  • 不能应付实时导数据需求
  • 两个进程须要协调,复杂度添加


    更好的办法是在同一个进程内一边读src数据,一边写des集群。只是这相当于在同一个进程空间内载入两个版本号的hadoop jar包。这就须要在程序中使用两个classloader来实现。 

    下面代码能够实现classloader载入自己定义的jar包,并生成须要的Configuration对象:
Java代码
  • 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();
URL[] jarUrls = new URL[1];
jarUrls[0]=newFile(des_jar_path).toURI().toURL();
ClassLoader jarloader = newURLClassLoader(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来构造一个自己定义的构造函数 

    代码段例如以下:

Java代码
  • 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;
  • }
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
         returnpathname.getName().endsWith(".jar");
      }
      };
      File[] jars = newFile(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] = newFile("hadoop-0.20.205.jar")
      ClassLoader jarloader = newURLClassLoader(jarUrls, null);
     return jarloader;
}
Java代码
  • 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);
  • }
HBaseProxy.java
public HBaseProxy(Stringhbase_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(Stringfield, 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集群之间转移数据的更多相关文章

  1. Hadoop(四)HDFS集群详解

    前言 前面几篇简单介绍了什么是大数据和Hadoop,也说了怎么搭建最简单的伪分布式和全分布式的hadoop集群.接下来这篇我详细的分享一下HDFS. HDFS前言: 设计思想:(分而治之)将大文件.大 ...

  2. adoop(四)HDFS集群详解

    阅读目录(Content) 一.HDFS概述 1.1.HDFS概述 1.2.HDFS的概念和特性 1.3.HDFS的局限性 1.4.HDFS保证可靠性的措施 二.HDFS基本概念 2.1.HDFS主从 ...

  3. HDFS集群优化篇

    HDFS集群优化篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统级别优化 1>.优化文件系统(推荐使用EXT4和XFS文件系统,相比较而言,更推荐后者,因为XF ...

  4. HDFS集群PB级数据迁移方案-DistCp生产环境实操篇

    HDFS集群PB级数据迁移方案-DistCp生产环境实操篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 用了接近2个星期的时间,终于把公司的需要的大数据组建部署完毕了,当然,在部 ...

  5. sqoop将oracle数据导入hdfs集群

    使用sqoop将oracle数据导入hdfs集群 集群环境: hadoop1.0.0 hbase0.92.1 zookeeper3.4.3 hive0.8.1 sqoop-1.4.1-incubati ...

  6. HDFS集群中DataNode的上线与下线

    在HDFS集群的运维过程中,肯定会遇到DataNode的新增和删除,即上线与下线.这篇文章就详细讲解下DataNode的上线和下线的过程. 背景 在我们的微职位视频课程中,我们已经安装了3个节点的HD ...

  7. vivo 万台规模 HDFS 集群升级 HDFS 3.x 实践

    vivo 互联网大数据团队-Lv Jia Hadoop 3.x的第一个稳定版本在2017年底就已经发布了,有很多重大的改进. 在HDFS方面,支持了Erasure Coding.More than 2 ...

  8. 【Redis】集群故障转移

    集群故障转移 节点下线 在集群定时任务clusterCron中,会遍历集群中的节点,对每个节点进行检查,判断节点是否下线.与节点下线相关的状态有两个,分别为CLUSTER_NODE_PFAIL和CLU ...

  9. HDFS集群balance(2)-- 架构概览

    转载请注明博客地址:http://blog.csdn.net/suileisl HDFS集群balance,对应版本balance design 6 如需word版本,请QQ522173163联系索要 ...

随机推荐

  1. C# c++ 传递函数指针

    C#和c++之间相互传递函数指针 在C++和C#之中都有很多callback method,可以相互调用吗,怎么传递,是我表弟的问题. 1.定义c++ dll ,导出方法 // sort.cpp : ...

  2. FireMonkey Style Designer

    http://docwiki.embarcadero.com/RADStudio/Berlin/en/FireMonkey_Style_Designer http://docwiki.embarcad ...

  3. scrum经验

    Scrum是基于过程控制理论的经验方法,倡导自组织团队:其运行框架核心是迭代增量型并行开发,也是“适应性”的软件开发方法.Scrum提供了高度可视化的用于管理软件开发复杂性管理的敏捷项目管理的实践框架 ...

  4. (1)前言——(10)jquery项目的历史(History of the jQuery project)

    This book covers the functionality and syntax of jQuery 1.6.x, the latest version at the time of wri ...

  5. 浅谈MySQL 数据库性能优化

    MySQL数据库是 IO 密集型的程序,和其他数据库一样,主要功能就是数据的持久化以及数据的管理工作.本文侧重通过优化MySQL 数据库缓存参数如查询缓存,表缓存,日志缓存,索引缓存,innodb缓存 ...

  6. asp.net iis URLRewrite 实现方法详解

    原文 asp.net iis URLRewrite 实现方法详解 实现非常简单首先你要在你的项目里引用两个dll:actionlessform.dll.urlrewriter.dll,真正实现重写的是 ...

  7. 基于visual Studio2013解决面试题之0302链表中找倒数k项节点

     题目

  8. Python string replace 方法

    Python string replace   方法 方法1: >>> a='...fuck...the....world............' >>> b=a ...

  9. TComponent,TControl,TWinControl,TGraphic的DefineProperties赏析与说明(不懂)

    先观赏一下最后的实现效果: object Form1: TForm1 Left = Top = Width = Height = Caption = 'Form1' Color = clBtnFace ...

  10. Android和java平台 DES加密解密互通程序及其不能互通的原因

    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通.就是加密的结果不一样 ...