Hadoop跨集群数据拷贝工具DISTCP内部源码实现分析

distcp流程分析 背景 distcp可用于跨集群或集群内目录的复制,distcp参数不同复制的结果差别较大。本文结合官网及源码,对distcp流程进行分析,并结合测试给出验证。 使用 1. shell 目标目录父目录不存在时,可以自动建立多层目标目录。 1. 文件复制 文件复制时,相当于cp,因为hdfs无法并行写。将a.txt复制并重命令为a_bak.txt $ hadoop distcp \ hdfs://c... 阅读详情

概述


DISTCP(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具,是Hadoop用户常用的命令之一。它使用Map/Reduce实现大量文件拷贝分发,错误处理和恢复,以及报告生成。它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方。 DISTCP的源码可以在Hadoop工程源码的hadoop-tools工程中找到,代码量不算大,主流程代码在org.apache.hadoop.tools和org.apache.hadoop.tools.mapred两个包中,笔者由于在工作中有需求要通过MR实现备份海量HDFS数据,因此研究了一波DISTCP源码并仿照它实现了自己的代码,实测在千兆网络中可以3~4小时内拷贝几TB的数据,这篇文档会介绍DISTCP的工作主流程,通过分析工具的代码也有助于我们更好的理解MR编程框架,并可以对HDFS文件系统有一个初步的了解。


注:笔者当前使用的hadoop版本是2.7.2

 

◇◆◇◆◇

用法


DISTCP最常用在集群之间的拷贝:


Bash#  hadoop distcphdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo


这条命令会把nn1集群的/foo/bar目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务,然后每个MapTask分别执行从nn1到nn2的拷贝操作。

 

DISTCP在支持跨集群拷贝的主功能上还支持很多额外的功能选项,丰富了用户的选择,主要的选项如下索引,但是我们这里分析源码的时候,会忽略这些额外的功能选项的源码,只看主体的数据拷贝功能实现,只要读懂了主体功能,其它的额外分支只需在这基础上研读就很方便了。


标识

描述

备注

-p[rbugp]

Preserve
   r: replication number
   b: block size
   u: user
   g: group
   p: permission

修改次数不会被保留。并且当指定 -update 时,更新的状态不会被同步,除非文件大小不同(比如文件被重新创建)

-i

忽略失败


这个选项会比默认情况提供关于拷贝的更精确的统计,同时它还将保留失败拷贝操作的日志,这些日志信息可以用于调试。最后,如果一个map失败了,但并没完成所有分块任务的尝试,这不会导致整个作业的失败

-log <logdir>

记录日志到 <logdir>

DistCp为每个文件的每次尝试拷贝操作都记录日志,并把日志作为map的输出。如果一个map失败了,当重新执行时这个日志不会被保留

-m <num_maps>

同时拷贝的最大数目 指定了拷贝数据时map的数目。请注意并不是map数越多吞吐量越大

-overwrite

覆盖目标

如果一个map失败并且没有使用-i选项,不仅仅那些拷贝失败的文件,这个分块任务中的所有文件都会被重新拷贝

-update

如果源和目标的大小不一样则进行覆盖

这不是"同步"操作。执行覆盖的唯一标准是源文件和目标文件大小是否相同;如果不同,则源文件替换目标文件

-f <urilist_uri>

使用<urilist_uri> 作为源文件列表

这等价于把所有文件名列在命令行中。 urilist_uri 列表应该是完整合法的URI

 

◇◆◇◆◇

源代码与过程分析


阅读源码可以从工程中org.apache.hadoop.tools包里的DistCp类开始入手,DistCp的构造方法先处理了一下输入参数(即上面说到的额外功能选项)、读入配置项以及做了hadoop初始化工作,这里的东西不用过多关注,它不会影响我们读懂源码。


 

public DistCp(Configuration configuration, DistCpOptions    inputOptions) throws Exception {

    Configuration    config = new Configuration(configuration);

       config.addResource(DISTCP_DEFAULT_XML);

       setConf(config);

    this.inputOptions    = inputOptions;

this.metaFolder      = createMetaFolderPath();

}

 


在DistCp类中,有一个有用的方法接口public int run(String[] argv),实际上当我们运行工具进行HDFS数据跨集群拷贝时,就是通过这个方法调度运行的,这个方法也很简单,只是对路径等做一些检查以及对execute()方法做异常处理,而execute方法则是任务执行方法。

 

在execute()方法中,会调用createAndSubmitJob()创建MR任务,准备数据,设定数据输入格式,并把任务提交到hadoop集群运行,最后等待任务执行完毕。于是我们可以看到,主体功能实现就在createAndSubmitJob()这个函数体里,工程中其它的各个类无非都是为这个函数接口服务的。下面就是createAndSubmitJob()的代码,这里删除了一些不影响阅读的源码,只留下主体功能流程。


 

public Job createAndSubmitJob() throws Exception    {

    Job    job = null;

    try    {

      synchronized(this)    {

           metaFolder = createMetaFolderPath();

        jobFS    = metaFolder.getFileSystem(getConf());

        job =    createJob();

}

      if    (!inputOptions.shouldUseDiff()) {

           createInputFileListing(job);

}

         job.submit();

         submitted = true;

    } finally    {

      if    (!submitted) {

           cleanup();}

    return    job;

}

 

 

接下来我们就可以分析一下createAndSubmitJob()中各行分别实现了什么功能,下面我们一个部分一个部分的分析。

 

metaFolder:


metafolder是DISTCP工具准备元数据的地方,在createMetaFolderPath()中会结合一个随机数生成一个工作目录,在这个目录中迟点会通过getFileListingPath()生成fileList.seq文件,然后往这个文件中写入数据,这是一个SequenceFile文件,即Key/Value结构的序列化文件,这个文件里将存放所有需要拷贝的源目录/文件信息列表。其中Key是源文件的Text格式的相对路径,即relPath;而Value则记录源文件的FileStatus格式的org.apache.hadoop.fs.FileStatus信息,这里FileStatus是hadoop已经封装好了的描述HDFS文件信息的类,但是DISTCP为了更好的处理数据,重新继承并封装了CopyListingFileStatus类,其描述如下图1,不过我们其实可以认为这里的Value就是FileStatus即可。metafolder目录中的fileList.seq最终会作为参数传递给MR任务中的Mapper。






 

private Path createMetaFolderPath() throws Exception    {

    Configuration    configuration = getConf();

    Path    stagingDir = JobSubmissionFiles.getStagingDir(

            new    Cluster(configuration), configuration);

    Path    metaFolderPath = new Path(stagingDir,   PREFIX + String.valueOf(rand.nextInt()));

    if    (LOG.isDebugEnabled())

      LOG.debug("Meta    folder location: " + metaFolderPath);

       configuration.set(DistCpConstants.CONF_LABEL_META_FOLDER,    metaFolderPath.toString());

    return    metaFolderPath;

}



Job:


这个Job定义的就是我们的MapReduce任务了,在hadoop中每个任务都要定义一个Job,在Job中设定任务的输入输出、任务名字和运行逻辑等东西,DISTCP工具的Job在createAndSubmitJob()方法中的job = createJob()实现。实现源码如下:





 

private Job createJob() throws IOException {

    String    jobName = "distcp";

    String    userChosenName = getConf().get(JobContext.JOB_NAME);

    if    (userChosenName != null)

      jobName    += ": " + userChosenName;

    Job    job = Job.getInstance(getConf());

       job.setJobName(jobName);

       job.setInputFormatClass(DistCpUtils.getStrategy(getConf(),    inputOptions)); 

       job.setJarByClass(CopyMapper.class);

       configureOutputFormat(job);                                                    

 

       job.setMapperClass(CopyMapper.class);

       job.setNumReduceTasks(0);

       job.setMapOutputKeyClass(Text.class);

       job.setMapOutputValueClass(Text.class);

       job.setOutputFormatClass(CopyOutputFormat.class);                             

       job.getConfiguration().set(JobContext.MAP_SPECULATIVE,    "false");              

       job.getConfiguration().set(JobContext.NUM_MAPS,   

                     String.valueOf(inputOptions.getMaxMaps()));                      

 

    if    (inputOptions.getSslConfigurationFile() != null) {

         setupSSLConfig(job);

    }

 

       inputOptions.appendToConf(job.getConfiguration());

    return    job;

}

 

 

这里面的源码已经是很清晰的,跟常规MR任务的设定差不多,我们主要关注以下两行。


●   job.setInputFormatClass(DistCpUtils.getStrategy(getConf(),inputOptions));

●   job.setMapperClass(CopyMapper.class);


我们在设置MapReduce输入格式的时候,会调用上面第一行这样一条语句,这条语句保证了输入文件会按照我们预设的格式被读取。setInputFormatClass里设定了Mapper的数据读取格式,也就是由getStrategy(getConf(), inputOptions)得到,进到这个函数里面,可以看到最终Mapper数据输入格式由UniformSizeInputFormat.class这个类定义的,而这个类继承自InputFormat.class,MR中所有的输入格式类都继承自InputFormat,这是一个抽象类。


InputFormat抽象类仅有两个抽象方法:


●   List<InputSplit>getSplits(),获取由输入文件计算出输入分片(InputSplit),解决数据或文件分割成片问题。

●   RecordReader<K,V>createRecordReader(),创建RecordReader,从InputSplit中读取数据,解决读取分片中数据问题。


通过InputFormat,Mapreduce框架可以做到:验证作业输入的正确性;将输入文件切割成逻辑分片(InputSplit),一个InputSplit将会被分配给一个独立的MapTask;提供RecordReader实现,读取InputSplit中的“K-V对”供Mapper使用。

 

在DISTCP中,UniformSizeInputFormat继承了InputFormat并实现了数据读入格式,它会读取metafolder中fileList.seq序列化文件的内容,并根据用户设定的map数和拷贝总数据量进行分片,计算出分多少片,最终提供“K-V”对供Mapper使用。这个类的源码实现并不复杂,加上注释一共也才100多行,很容易就能读懂。

 

CopyMapper.class中则定义了每个map的工作逻辑,也就是拷贝的核心逻辑,任务提交到hadoop集群中运行时每个map就是根据这个逻辑进行工作的,通过setMapperClass设定。这里要注意的是DISTCP任务只有map没有reduce,因为只需要map就可以完成拷贝数据的工作。CopyMapper的源码实现在org.apache.hadoop.tools.mapred这个包中,CopyMapper里最核心实现是setup()和map()这两个方法,这两个方法其实也是MR中Mapper的固有通用方法,setup()中完成map方法的一些初始化工作,在DISTCP中,这个方法里会设定对端的目标路径,并做一些参数设置和判断工作,源码(删掉了参数设置部分)如下:





 

public void setup(Context context) throws IOException,    InterruptedException {

conf = context.getConfiguration();

 

       targetWorkPath = new Path(conf.get(DistCpConstants.CONF_LABEL_TARGET_WORK_PATH));

    Path    targetFinalPath = new Path(conf.get(

            DistCpConstants.CONF_LABEL_TARGET_FINAL_PATH));

    targetFS =    targetFinalPath.getFileSystem(conf);

 

    if    (targetFS.exists(targetFinalPath) &&    targetFS.isFile(targetFinalPath)) {

         overWrite = true; // When target is an existing file,    overwrite it.

    }

}

 

 

而map()方法,内容较多,我们可以看其接口如下:


●   public void map(Text relPath,CopyListingFileStatus sourceFileStatus,           Context context) throws IOException,InterruptedException


从输入参数可以看出来,这其实就是对上面分析过的UniformSizeInputFormat类里分片后的数据里的每一行进行处理,每行里存放的就是“K-V”对,也就是fileList.seq文件每行的内容。Map方法体前半部分有一大堆代码内容,其实都是一些准备和判断工作,为后面的拷贝服务,最终的拷贝动作发生在copyFileWithRetry(description,sourceCurrStatus, target, context, action, fileAttributes)这个函数中,进入这个函数一直往里面读,就能看到数据最终通过常用的Java输入输出流的方式完成点对点拷贝,最后拷贝方法源码如下:

 




 

long copyBytes(FileStatus sourceFileStatus, long    sourceOffset,

      OutputStream    outStream, int bufferSize, Mapper.Context    context)

      throws    IOException {

    Path    source = sourceFileStatus.getPath();

    byte    buf[] = new byte[bufferSize];

    ThrottledInputStream    inStream = null;

    long    totalBytesRead = 0;

 

    try    {

      inStream    = getInputStream(source, context.getConfiguration());

      int    bytesRead = readBytes(inStream, buf, sourceOffset);

      while    (bytesRead >= 0) {

           totalBytesRead += bytesRead;

        if    (action == FileAction.APPEND) {

             sourceOffset += bytesRead;

        }

           outStream.write(buf, 0, bytesRead);

           updateContextStatus(totalBytesRead, context, sourceFileStatus);

           bytesRead = readBytes(inStream, buf, sourceOffset);

      }

         outStream.close();

         outStream = null;

    } finally    {

      IOUtils.cleanup(LOG,    outStream, inStream);

    }

    return    totalBytesRead;

}

 

 

元数据生成(createInputFileListing):


前面提到在metafolder目录中会生成fileList.seq文件,而这个文件是怎么生成以及文件里面保存些什么内容呢?这个逻辑就在createInputFileListing(job)中完成的,源码如下。首先由getFileListingPath()方法创建一个空的seq文件,然后由buildListing()方法往这个seq文件写入数据,数据写入的整体逻辑就是遍历源路径下所有目录和文件,把每个文件的相对路径和它的CopyListingFileStatus以“K-V”对的形式写入fileList.seq每行中,最终就得到Mapper的输入了。





 

protected Path createInputFileListing(Job    job) throws IOException {

    Path    fileListingPath = getFileListingPath();

    CopyListing    copyListing = CopyListing.getCopyListing(job.getConfiguration(),

           job.getCredentials(), inputOptions);

    copyListing.buildListing(fileListingPath,    inputOptions);

    return    fileListingPath;

}

 

 

◇◆◇◆◇

Finally


最终完成任务以后,在finally里,要做一些清理工作,也就是删除在前面创建出来的metafolder,这里非常简单,也就是一个删除文件夹的逻辑,我们就不贴源码了。

sqoop数据ETL工具初探 研究背景 最近实习项目需要使用到kylin建立数据立方体,kylin是一个基于hive的OLAP系统,主要功能是可以通过预计算的方式将存储在hdfs上的文件设定为多维立方体缓存到HBase中,将需要的查询结果作为数据立方体预先存储在hbase中,是一种以空间换时间的快速查询方法。 甲方公司目前使用的是mysql存储数据,并且数据会定期删除。目前需要考虑使用工具将mysql中的数据导入到Hive中,... 阅读详情

相关推荐

Hadoop DistCp 使用详解与原理分析

摘要 DistCp是Hadoop内置的分布式数据拷贝工具,基于MapReduce实现跨集群/目录的高效数据同步。相比单机hadoop fs -cp的串行拷贝,DistCp通过多Mapper并行处理大幅提升性能。本文详细解析DistCp的核心功能与使用场景: 基本用法:支持单/多源拷贝、文件列表指定、增量同步(-update)和删除多余文件(-delete) 三种拷贝模式:增量更新(-update)、全量覆盖(-overwrite)、原子提交(-atomic) 关键参数: 并行控制(-m设置Mapper数)

主要分享大数据相关的知识,如Spark、Hudi 278

测试工具——Distcp工具深入分析

引言   DistCp命令是hadoop用户最常使用的命令之一,它位于hadoop tools包中,代码不多,约1300多行,主要用于在两个HDFS集群之间快速拷贝数据。DistCp工具代码结构清晰易懂,通过分析该工具的代码有助于我们更好的理解MR编程框架,并可以对hdfs文件系统有一个初步的了解。   用法   DistCp使用方法如下表所示: ...

weixin_34336526的博客 742

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 866

Distcp方式

一、概述       DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方。二、使用DistCp  DistCp最常用于在集群之间的拷贝:hadoop dist...

大数据姐姐 2万+

《解锁GCC版本选择的奥秘:从入门到精通》

GCC 版本的选择是一项复杂而关键的决策,犹如一场精心策划的战略布局,贯穿于软件开发的整个生命周期。从项目需求与兼容性的深度考量,到性能与稳定性的权衡抉择,再到硬件与系统适配的精准对接,每一个环节都紧密相连,相互影响。在游戏开发行业,对性能的极致追求促使开发者青睐较新的 GCC 版本,以实现更流畅的游戏体验和更震撼的视觉效果;科学计算领域则依赖于 GCC 版本对复杂数学运算的高效优化,以应对大规模数据处理的挑战;嵌入式开发行业因硬件资源的限制和对稳定性的严苛要求,通常选择经过长期验证的稳定版本;

zheng_ruiguo的专栏 1419

HDRnet——双边滤波和仿射变换的摇身一变

layer层数越多,下采样得到的图越小,low-level features的好处是最后的grid会更coarser,最后的特征图的感受野也越多,非线性更好,表达力更强。所以最终grid是5维的[B,in*out,n,H,W],permute之后是[B,H,W,n,in*out],B是batchsize,n表示对guide的量化级数,in*out表示每个cell的变换系数。这部分的处理对象是低分辨率图,利用CNN进行特征提取(局部和全局),最后fuse得到grid,这里面包含了变换的系数。

zcg1942的博客 1578

百TB级数据拷贝distcp性能调优

文章目录百TB级数据拷贝distcp性能调优背景拷贝方式速度问题启动慢同步慢收尾慢调优措施慢启动问题distcp参数调优数据倾斜问题慢节点问题机房带宽问题其它实际测试 百TB级数据拷贝distcp性能调优 背景 配合集群迁移,需要迁移6PB数据 迁移安排在当天天任务完成之后开启操作,9点-10点 需要在晚上17点之前完成当天增量数据迁移(5-8小时完成120TB数据同步) 拷贝方式 全量数据约6P...

weichanhua的博客 4890

Unity插件UniWebView实战:UGUI动态调整内嵌网页尺寸与交互优化

本文详细解析了如何在Unity游戏中使用UniWebView插件实现内嵌网页的动态尺寸适配与深度交互。核心在于利用Reference Rect Transform属性,将网页窗口精准绑定至UGUI控件,并随其动态调整。文章进一步探讨了通过消息系统与JavaScript执行实现Unity与网页的双向通信,并提供了加载优化、过渡动画及事件拦截等实用技巧,助力开发者打造无缝、流畅的游戏内网页体验。

earth的博客 276

hadoop distcp hftp hdfs跨集群拷贝常见问题归总

在工作中遇到部门间数据合作,需跨不同版本集群拷贝数据,从hadoop 2.6.0-cdh5.7.0 拷贝数据到hadoop 2.7.1, 记录所碰到的问题及解决方案。 distcp基础用法 比如拷贝A集群(src集群)的A1目录到B集群(dest集群)的B1目录, 1.同版本集群拷贝(hdfs协议): 在dest集群(目标集群)运行命令: hadoop distcp hdfs://10.190....

独孤一剑 6939

ESP8266入门(一)固件烧录及常见问题分析

为了实现对数据的远程收集和分析,偶然间发现了esp8266这个模块,对此进行了深入的学习,可是在学习之初遇到了大量的问题,这个系列文章就为大家讲讲我遇到的坑以及解决办法,还有esp8266如何连上oneNet云平台的方法。因为我用的是esp8266nodemcu,可以直接连接usb进行烧录,如果用模块的话接线就比较麻烦,可以去搜搜看.

Jerryxuzherui的博客 8956

WiFi信道状态信息 基于Intel 5300的CSI Tool 安装及使用(一)

经过半个月的坎坷安装过程,连Windows系统都没装过的本人终于颤颤巍巍把CSI TOOL装好了,下面记录一下适于我所使用设备的安装过程。设备:一台THINKPAD X201,一台师兄借的华硕主板的台式机首先,如果你和我一样对linux其实一窍不通的话,建议先反复看教程里的安装代码,照猫画虎很难一步实现的,中途一定会有这或那的问题需要解决,所以该了解的基础linux指令还是要了解,起码安装过程中的那些指令可以去查一查。.........

Silver_777的博客 2万+

告别数据迁移噩梦:Apache Hadoop分布式存储迁移全攻略

你是否还在为传统存储向分布式系统迁移时的效率低下、数据丢失风险而头疼?本文将以Apache Hadoop的DistCp(分布式拷贝)工具为核心,带你掌握从规划到监控的完整迁移流程,解决90%的企业级数据迁移痛点。读完本文你将获得:3种迁移模式对比、5个性能优化技巧、7步故障排查指南,以及生产环境验证的实战脚本。 ## 为什么选择Hadoop DistCp? Apache Hadoop作为分布式...

gitblog_00737的博客 837

【功能安全】【AutoSAR】程序流监控机制

目录 一、程序流执行的常见故障 二、程序流的监控机制 1、监控功能的实现 2、三种监督机制 a、生命监测机制 b、截止时间监测机制 c、逻辑程序流监测机制 一、程序流执行的常见故障 与程序流相关的故障,在ISO26262中第六章附录D中定义如下: — 执行阻塞; — 死锁; — 活锁; — 执行时间的不正确分配; — 软件要素间的不正确同步。 二、程序流的监控机制 1、监控功能的实现 AutoSAR中对程序流的监控功能的实现主要有“看门狗”栈(Watchdog Stack).

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4519

Tensile:LinkedIn开源的TensorFlow与Spark互操作数据桥接方案

在AI工程化实践中,跨框架数据互通是核心挑战之一——Spark擅长大规模列式处理,TensorFlow专注张量计算,二者间缺乏标准化的数据契约。本文围绕TensorFlow与Spark互操作这一基础技术命题,解析基于Apache Arrow与Protocol Buffers构建的轻量级桥接机制原理,阐明其如何通过统一schema定义、逻辑分片对齐和零拷贝内存布局,实现类型安全、可追溯、可扩展的数据流转。该方案规避了TFRecord类型失真与MLlib稀疏向量不可逆等典型缺陷,显著提升训练数据加载稳定性与调试

weixin_34221775的博客 312

Coze智能体开发:工作流教程之解析文件概述

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 1794

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

如何解决Hadoop Connection Refused和FileNotFoundException问题

本文以使用URLStreamHandler来将Hadoop文件系统中的文件显示的标准输出的例子,来讲解如何定位和解决Connection Refused和FileNotFoundException问题。本例子中使用的Hadoop 2.7.3版本。

Bob Liu的程序人生 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

hadoop distcp踩坑记

distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。 1、在nn1上执行 hadoop distcp hdfs://source-nn1:9000/user/xxx.txt hdfs://dest-nn1:9000/ ...

B11050101的博客 7154

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Apache Hadoop DistCP(分布式拷贝)示例

在这个例子中,我们将向您展示如何使用分布式复制工具在Hadoop的集群/集群内设置中复制大型文件。DistCP是Apache Hadoop上下文中的Distributed Copy(分布式拷贝)的缩写。 它基本上是一个工具,可以使用在我们需要复制大量的数据/文件在集群内/集群设置。 在后台,DisctCP使用MapReduce分发和复制数据,这意味着操作分布在集群中的多个可用节点上。 这使得它更有效和有效的复制工具。

纸上得来终觉浅,绝知此事要躬行 4418

HDFS跨集群的数据迁移

迁移之前需要先考虑的事: 迁移总数据量 新老集群之间的最大带宽,在减少业务影响条件下最多可以使用多少带宽 在迁移过程中如何限制使用带宽 在迁移过程中,哪些文件可能发生删除、新增数据的情况。 迁移过程中,那些目录可能会发生新增文件的情况 迁移后的数据一致性校验 迁移后HDFS文件权限与老集群保持一致 迁移方案: 1.迁移数据量评估 通过hdfs dfs -du -h /命令查看各目录总数据量。按照业务划分,统计各业务数据的总量 2.指定迁移节奏 因为数据量大,而且带宽有限,所以在HDFS文件变化之前全部迁

weixin_44976835的博客 5708

springboot工程提交distcp报错CopyOutputFormat not found解决办法

问题描述 在用springboot工程提交distcp.execute()任务时,YARN报错如下: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.xxx.hadoop.tools.mapr...

王小禾 751

跨集群拷贝Distcp性能测试

distcp+shell脚本实现跨集群数据迁移

m0_46168848的博客 4132

CDH不同集群之间hive/impala数据迁移(hadoop distcp)

##get_hive_db_tables.sh #!/bin/bash ##脚本位置 where_src_table_info="/home/hadoopap/test_mv_kd/create_hive_table" ##查询大数据所有的database hive -e " show databases; exit ;" | grep -v default | grep -v test > ${where_src_table_info}/databases.txt if [ ! -d .

hcq_lxq的博客 2101

distcp 源码解析

为什么80%的码农都做不了架构师?>>> ...

weixin_34050389的博客 357

工欲善其事必先利其器——番外篇 Distcp工具深入分析

引言 DistCp命令是hadoop用户最常使用的命令之一,它位于hadoop tools包中,代码不多,约1300多行,主要用于在两个HDFS集群之间快速拷贝数据。DistCp工具代码结构清晰易懂,通过分析该工具的代码有助于我们更好的理解MR编程框架,并可以对hdfs文件系统有一个初步的了解。   用法 DistCp使用方法如下表所示: OPTIONS: -p[rbu

langtaosha的专栏 1364
上一篇: 给Java说句公道话---转自王垠http://www.yinwang.org/blog-cn/2016/01/18/java
下一篇: Webservice学习笔记
github_zwl
博客等级 码龄11年 300粉丝 171原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值