Напишите файл в hdfs с Java
Я хочу создать файл в HDFS и записать в него данные. Я использовал этот код:
Configuration config = new Configuration();
FileSystem fs = FileSystem.get(config);
Path filenamePath = new Path("input.txt");
try {
if (fs.exists(filenamePath)) {
fs.delete(filenamePath, true);
}
FSDataOutputStream fin = fs.create(filenamePath);
fin.writeUTF("hello");
fin.close();
}
Он создает файл, но ничего в нем не записывает. Я много искал, но ничего не нашел. В чем моя проблема? Нужно ли мне разрешение на запись в HDFS?
Благодарю.
4 ответа
В качестве альтернативы ответу @Tariq вы можете передать URI при получении файловой системы.
Configuration configuration = new Configuration();
FileSystem hdfs = FileSystem.get( new URI( "hdfs://localhost:54310" ), configuration );
Path file = new Path("hdfs://localhost:54310/s2013/batch/table.html");
if ( hdfs.exists( file )) { hdfs.delete( file, true ); }
OutputStream os = hdfs.create( file,
new Progressable() {
public void progress() {
out.println("...bytes written: [ "+bytesWritten+" ]");
} });
BufferedWriter br = new BufferedWriter( new OutputStreamWriter( os, "UTF-8" ) );
br.write("Hello World");
br.close();
hdfs.close();
Либо определите HADOOP_CONF_DIR
Переменная окружения в вашу папку конфигурации Hadoop или добавьте следующие 2 строки в ваш код:
config.addResource(new Path("/HADOOP_HOME/conf/core-site.xml"));
config.addResource(new Path("/HADOOP_HOME/conf/hdfs-site.xml"));
Если вы не добавите это, ваш клиент попытается записать в локальную FS, что приведет к исключению в разрешении.
Это должно сработать
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.*;
import java.nio.charset.StandardCharsets;
public static void writeFileToHDFS() throws IOException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS", "hdfs://localhost:9000");
configuration.addResource(new Path("/HADOOP_HOME/conf/core-site.xml"));
configuration.addResource(new Path("/HADOOP_HOME/conf/hdfs-site.xml"));
FileSystem fileSystem = FileSystem.get(configuration);
//Create a path
String fileName = "input.txt";
Path hdfsWritePath = new Path("/user/yourdesiredpath/" + fileName);
FSDataOutputStream fsDataOutputStream = fileSystem.create(hdfsWritePath,true);
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(fsDataOutputStream,StandardCharsets.UTF_8));
bufferedWriter.write("Java API to write data in HDFS");
bufferedWriter.close();
fileSystem.close();
}
Пожалуйста, попробуйте следующий подход.
FileSystem fs = path.getFileSystem(conf);
SequenceFile.Writer inputWriter = new SequenceFile.Writer(fs, conf, path, LongWritable.class, MyWritable.class);
inputWriter.append(new LongWritable(uniqueId++), new MyWritable(data));
inputWriter.close();