Hadoop Flume到流gz文件

Hadoop Flume到流gz文件,hadoop,apache-spark,flume-ng,Hadoop,Apache Spark,Flume Ng,我有一个文件夹包含很多gzip文件。每个gzip文件都包含xml文件。我使用flume将文件流式传输到HDFS中。下面是我的配置文件: agent1.sources = src agent1.channels = ch agent1.sinks = sink agent1.sources.src.type = spooldir agent1.sources.src.spoolDir = /home/tester/datafiles agent1.sources.src.channels = c

我有一个文件夹包含很多gzip文件。每个gzip文件都包含xml文件。我使用flume将文件流式传输到HDFS中。下面是我的配置文件:

agent1.sources = src
agent1.channels = ch
agent1.sinks = sink

agent1.sources.src.type = spooldir
agent1.sources.src.spoolDir = /home/tester/datafiles
agent1.sources.src.channels = ch
agent1.sources.src.deserializer = org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder

agent1.channels.ch.type = memory
agent1.channels.ch.capacity = 1000
agent1.channels.ch.transactionCapacity = 1000

agent1.sinks.sink.type = hdfs
agent1.sinks.sink.channel = ch
agent1.sinks.sink.hdfs.path = /user/tester/datafiles
agent1.sinks.sink.hdfs.fileType = CompressedStream
agent1.sinks.sink.hdfs.codeC = gzip
agent1.sinks.sink.hdfs.fileSuffix = .gz
agent1.sinks.sink.hdfs.rollInterval = 0
agent1.sinks.sink.hdfs.rollSize = 122000000
agent1.sinks.sink.hdfs.rollCount = 0
agent1.sinks.sink.hdfs.idleTimeout = 1
agent1.sinks.sink.hdfs.batchSize = 1000
将文件流式传输到HDFS后,我使用Spark使用以下代码读取文件:

df = sparkSession.read.format('com.databricks.spark.xml').options(rowTag='Panel', compression='gzip').load('/user/tester/datafiles')
但我有问题去读它。如果我手动将一个gzip文件上传到HDFS文件夹并重新运行上面的Spark代码,它就能够读取它而不会出现任何问题。我不确定是不是因为水槽


我试图下载flume流式传输的文件并将其解压缩,当我查看内容时,它不再显示xml格式,而是一些无法读取的字符。有人能告诉我这件事吗?谢谢。

我认为你做错了为什么

请参阅您拥有的源文件是“不可拆分的”ZIP。您不能逐个记录地部分读取它们,如果您不解压缩,您将得到一个GZIPInputStream,这是您在flume源代码中得到的

在将该GZIP输入流读取为输入记录之后,您正在将已经压缩的流保存到另一个GZIP流中,因为您选择了sink type as compressed

因此,您在HDFS中压缩了Gzip中的流:


我建议在cron中安排一个脚本,从本地复制到HDFS,这将解决您的问题

如何解压缩文件?使用
gunzip
?使用spark读取文件会遇到什么问题?您是否尝试过手动使用specyfing模式来激发xml?Mariusz,我没有解压缩文件。我试图在gz文件中进行流式传输,并使用spark进行读取。我没有手动指定模式。当我读取流式gzip文件并显示其内容时,它显示一些特殊字符。但是,当我试图用HDFS手动上传gzip文件时,我可以毫无问题地读取它,它可以毫无问题地显示内容和模式。我想这是因为Flume?哦,我明白了…所以Flume没有办法获取gzip文件并将其以原始格式放入HDFS?我在想,如果我在cron中安排一个脚本来执行从本地到HDFS的复制,那么它将在HDFS中包含许多小文件。这最终将占用HDF中的许多块。这是因为每个gzip文件的大小仅为20kb左右。您可以使用spark读取这些zip文件,并在处理后将其写入hadoop,。