2016-05-30 22 views
1

Ich schreibe auf hdfs mit rume spool-Verzeichnis. Hier ist mein CodeSchreiben in den Kanal mit dem Spool-Verzeichnis, wie man die Datei umbenennt

#initialize agent's source, channel and sink 
agent.sources = test 
agent.channels = memoryChannel 
agent.sinks = flumeHDFS 

# Setting the source to spool directory where the file exists 
agent.sources.test.type = spooldir 
agent.sources.test.spoolDir = /johir 
agent.sources.test.fileHeader = false 
agent.sources.test.fileSuffix = .COMPLETED 

# Setting the channel to memory 
agent.channels.memoryChannel.type = memory 
# Max number of events stored in the memory channel 
agent.channels.memoryChannel.capacity = 10000 
# agent.channels.memoryChannel.batchSize = 15000 
agent.channels.memoryChannel.transactioncapacity = 1000000 

# Setting the sink to HDFS 
agent.sinks.flumeHDFS.type = hdfs 
agent.sinks.flumeHDFS.hdfs.path =/user/root/ 
agent.sinks.flumeHDFS.hdfs.fileType = DataStream 

# Write format can be text or writable 
agent.sinks.flumeHDFS.hdfs.writeFormat = Text 

# use a single csv file at a time 
agent.sinks.flumeHDFS.hdfs.maxOpenFiles = 1 

# rollover file based on maximum size of 10 MB 
agent.sinks.flumeHDFS.hdfs.rollCount=0 
agent.sinks.flumeHDFS.hdfs.rollInterval=0 
agent.sinks.flumeHDFS.hdfs.rollSize = 1000000 
agent.sinks.flumeHDFS.hdfs.batchSize =1000 

# never rollover based on the number of events 
agent.sinks.flumeHDFS.hdfs.rollCount = 0 

# rollover file based on max time of 1 min 
#agent.sinks.flumeHDFS.hdfs.rollInterval = 0 
# agent.sinks.flumeHDFS.hdfs.idleTimeout = 600 

# Connect source and sink with channel 
agent.sources.test.channels = memoryChannel 
agent.sinks.flumeHDFS.channel = memoryChannel 

Aber das Problem ist, Daten in die Datei geschrieben wird umbenannt zu einigen zufälligen TMP-Namen. Wie kann ich die Datei in hdfs zu meinem ursprünglichen Dateinamen im Quellverzeichnis umbenennen. Zum Beispiel habe ich die Datei day1.txt, day2.txt, day3.txt. Das sind Daten für zwei verschiedene Tage. Ich möchte sie in hdfs als day1.txt, day2.txt, day3.txt gespeichert halten. Aber diese drei Dateien werden zusammengeführt und in hdfs als FlumeData.1464629158164.tmp Datei gespeichert. Gibt es eine Möglichkeit, dies zu tun?

Antwort

0

Wenn Sie den ursprünglichen Dateinamen beibehalten möchten, sollten Sie den Dateinamen als Überschrift an jedes Ereignis anhängen.

  1. Setzen Sie die BasisnameHeader Eigenschaft auf True. Dadurch wird eine Kopfzeile mit dem Schlüssel Basisname erstellt, es sei denn, mit der Eigenschaft basenameHeaderKey auf etwas anderes festgelegt.
  2. Verwenden Sie die hdfs.filePrefix Eigenschaft, um den Dateinamen unter Verwendung BasisnameHeader Werte festzulegen.

Fügen Sie die folgenden Eigenschaften zu Ihrer Konfigurationsdatei hinzu.

#source properties 
agent.sources.test.basenameHeader = true 

#sink properties 
agent.sinks.flumeHDFS.type = hdfs 
agent.sinks.flumeHDFS.hdfs.filePrefix = %{basename}