所以我必须检索存储在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
提前致谢
编辑:我通过增加任务槽数来解决问题。网页仪表板显示了一个可用的任务位置,并没有抱怨根本没有足够的插槽,所以我不认为它可能是那样。无论如何,writeAsText并没有像我预期的那样真正起作用。我从testfile0.txt中读取内容,但它不会将它们写入hdfs_file.txt。相反,它通过该名称创建一个目录,并在其中创建8个文本文件,其中6个完全为空。另外两个包含testfile0.txt(大部分在1.txt中,最后一个块在2.txt中)。
虽然这并不重要,因为文件的内容正确存储在DataSet中,所以我可以继续我对数据的分析。
答案 0 :(得分:1)
它按预期工作 - 您已将完整作业(因此也是输出格式)的并行度设置为8,因此每个插槽都会创建自己的文件(因为您可能知道写入单个文件并发是不安全的)。如果只需要1个输出文件,则应writeAsText(...).setParalellis(1)
覆盖全局并行属性。
如果要在本地文件系统而不是HDFS中获取输出,则应在路径中明确设置“file://”协议,因为对于Hadoop,flink默认情况下会查找“hdfs://”。