首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在hdfs和S3之间传输文件的有效方法

在hdfs和S3之间传输文件的有效方法
EN

Stack Overflow用户
提问于 2022-06-04 19:54:08
回答 1查看 55关注 0票数 -1

我正在寻找在S3和hdfs之间传输文件的有效方法。在我的项目中,ozzie作业是kickedoff,它处理文件,创建tmp文件,然后进入关键部分,作业必须获得动物园管理员锁,然后执行一些操作。它在获取锁后执行的操作之一是将文件从hdfs移动到S3。由于动物园管理员锁在适当的位置,我们有很少的作业不能获得动物园管理员锁,因为超时。为了确保没有作业因为超时问题而失败,我正在努力提高文件传输的效率。我也不能消除动物园管理员的锁。我用的是InterProcessMutex锁。

我试过几种方法。

方法1: -我尝试使用apache使用下面的更改,该项目不使用maven错误构建。

代码语言:javascript
复制
final String[] args = new String[4];
          args[0] = "-overwrite";
           args[1] = "-pb";
            args[2] = source.toString();
            args[3] = destination.toString();
            LOGGER.info("Copying contents");
            DistCp distCp = null;
            try {
                DistCpOptions distCpOptions = new DistCpOptions.Builder(source, destination)
                       .withSyncFolder(true)
                        .withCRC(true)
                        .withOverwrite(true)
                       .build();
                distCp = new DistCp(configuration, distCpOptions);
            } catch (final Exception e) {
                throw new IOException("An Exception occured while creating a distCp object", e);
            }
           LOGGER.info("Copying contents of source path {} to destination path {} ", source, destination);
           final int distCopyExitCode = distCp.run(args);

错误:为了纠正这个错误,我看到了添加番石榴-11.0.2 maven依赖项的建议,但没有解决这个问题。有什么办法解决这个问题吗?

代码语言:javascript
复制
java.lang.NoClassDefFoundError: org/apache/hadoop/thirdparty/com/google/common/base/Preconditions
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.apache.hadoop.tools.DistCpOptions$Builder.<init>(DistCpOptions.java:530)

方法2:
I遇到了aws S3Distcp工具,它在hdfs和S3之间传输文件,但是我没有找到S3Distcp java。使用S3Distcp的一种方法是在EMR集群中创建一个步骤,从而从EMR开始。(https://docs.aws.amazon.com/code-samples/latest/catalog/java-emr-emr-add-steps.java.html)

。

在我的场景中,我有一个EMR步骤,它实际上启动了作业,作业将处理输入文件,然后将文件从hdfs移动到S3,然后终止。

如果我使用上述链接中提供的解决方案,下面的步骤将是操作的顺序。

kicks-off

  • Job S3Distcp

  • Transfer

  • Ozzie Ozzie处理输入文件并在

  • 中创建tmp文件获得动物园管理员锁

  • 创建EMR step来触发文件传输,从hdfs到S3

  • EMR步骤完成

>H 122作业完成<代码>H 223G 224

如果我使用这种方法-有多个并行作业被启动,每个作业将有一个新的EMR步骤将被创建。如果我搞错了就纠正我。有谁能就如何解决这个问题提出建议吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-04 21:45:20

代码语言:javascript
复制
java.lang.NoClassDefFoundError: org/apache/hadoop/thirdparty/com/google/common/base/Preconditions

这显示了缺少hadoop-第三方依赖关系。添加这个应该可以解决这个错误。

代码语言:javascript
复制
      <dependency>
        <groupId>org.apache.hadoop.thirdparty</groupId>
        <artifactId>hadoop-shaded-guava</artifactId>
        <version>${hadoop-thirdparty-guava.version}</version>
     </dependency>

您可以根据hadoop版本为此依赖项选择相应的版本,最近的版本为1.1.1,hadoop版本为3.3.3。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72502740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档