当前位置: 首页 > 知识库问答 >
问题:

ApacheFlink:从HDFS读取文件

蔡鹏程
2023-03-14

所以我必须检索存储在HDFS中的文件的内容,并对其进行某些分析。

问题是,我甚至无法读取文件并将其内容写入本地文件系统中的另一个文本文件。(我是Flink的新手,这只是一个测试,以确保我正确读取了文件)

HDFS中的文件是纯文本文件。这是我的密码:

public class readFromHdfs {

    public static void main(String[] args) throws Exception {

        final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        DataSet<String> lines = env.readTextFile("hdfs://localhost:9000//test/testfile0.txt");

        lines.writeAsText("/tmp/hdfs_file.txt"); 

        env.execute("File read from HDFS");
    }
}

在我运行/tmp之后,它没有输出。

这是一个非常简单的代码,我不确定它是否有问题,或者我只是做了一些别的错误。正如我所说,我对Flink完全是新手

此外,作业在web仪表板中显示为失败。这是Flink圆木的内容:https://pastebin.com/rvkXPGHU

提前谢谢

编辑:我通过增加任务槽的数量来解决这个问题。网络仪表板显示了一个可用的任务槽,它并没有抱怨没有足够的槽,所以我不认为会是这样。

总之,WriteEastText它并没有像我预期的那样工作。我从testfile0读取内容。txt可以,但它不会将它们写入hdfs_文件。txt。相反,它创建了一个同名目录,其中有8个文本文件,其中6个完全为空。另外两个包含testfile0。txt(大部分在1.txt中,最后一块在2.txt中)。

虽然这并不重要,因为文件的内容被正确地存储在数据集中,所以我可以继续分析数据。

共有1个答案

皇甫卓君
2023-03-14

它的工作正如预期的那样——您已经将完整作业的并行性(因此输出格式也是如此)设置为8,所以每个插槽都创建自己的文件(因为您可以知道写入单个文件并发是不安全的)。如果你只需要一个输出文件,你应该WriteAsText(...). setParalellis(1)覆盖全局并行属性。

如果您想在本地文件系统而不是HDFS中获得输出,那么应该在path中显式设置“file://”协议,因为对于Hadoop,flink默认情况下会选择“HDFS://”。

 类似资料:
  • 我只找到TextInputFormat和CsvInputFormat。那么,如何使用ApacheFlink读取HDFS中的拼花文件呢?

  • 问题内容: 这是我的问题:我在HDFS中有一个文件,该文件可能很大(=不足以容纳所有内存) 我想做的是避免必须将此文件缓存在内存中,而仅像逐行处理常规文件一样逐行处理它: 我正在寻找是否有一种简单的方法可以在不使用外部库的情况下正确完成此操作。我可能可以使它与libpyhdfs或python- hdfs一起使用, 但我想尽可能避免在系统中引入新的依赖项和未经测试的库,尤其是因为这两个似乎都没有得到

  • 我有一个大的(>500M行)CSV文件。这个CSV文件中的每一行都包含一个位于HDFS上的二进制文件的路径。我想使用Spark读取这些文件中的每一个,处理它们,并将结果写到另一个CSV文件或表中。 在驱动程序中执行此操作非常简单,下面的代码完成了这项工作 但是失败 是否可以让执行者直接访问HDFS文件或HDFS文件系统?或者,是否有一种有效的方法来读取HDFS/S3上数百万个二进制文件并用Spar

  • 我是Flink大学的一年级新生,我想知道如何从hdfs读取数据。有谁能给我一些建议或简单的例子吗?谢谢大家。

  • 我有一个简单的Hadoop安装有点麻烦。我已经下载了hadoop 2.4.0并安装在一个CentOSLinux节点(虚拟机)上。我已经为apache站点(http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html)上描述的具有伪分布的单个节点配置了hadoop。它从日志中没有问题

  • 问题内容: 下面的Mappers代码从HDFS读取文本文件正确吗?如果是这样的话: 如果不同节点中的两个映射器尝试几乎同时打开文件,会发生什么情况? 是否不需要关闭?如果是这样,如何在不关闭文件系统的情况下执行此操作? 我的代码是: 问题答案: 这将起作用,并进行一些修改-我假设您粘贴的代码被截断了: 您可以有多个映射器读取同一个文件,但是使用分布式缓存存在更多的局限性(不仅减少了承载文件块的数据