Yerel sistemimden bir dizini java kodu kullanarak HDFS'ye kopyalamaya çalışırken sorun yaşıyorum. Tek tek dosyaları taşıyabiliyorum, ancak tüm dizini alt klasörler ve dosyalar ile taşımanın bir yolunu çözemiyorum. Biri bana bununla ilgili yardım edebilir mi? Şimdiden teşekkürler.Yerel sistemden dizini hdfs java koduna kopyalama
cevap
Yalnızca FileSystem
ürününün copyFromLocalFile yöntemini kullanın. Kaynak Yolu o HDF'ler hedefe kopyalanır yerel dizin ise: İşte
...
Configuration conf = new Configuration();
conf.addResource(new Path("/home/user/hadoop/conf/core-site.xml"));
conf.addResource(new Path("/home/user/hadoop/conf/hdfs-site.xml"));
FileSystem fs = FileSystem.get(conf);
fs.copyFromLocalFile(new Path("/home/user/directory/"),
new Path("/user/hadoop/dir"));
...
sağladığım hdfs yolu "hdfs: //cluster.abc.com: 8080/user/something" biçimindedir, ancak "yanlış FS, beklenen dosya: ///" yazıyor. Bunun için herhangi bir yardım? – Chirag
Fs.default.name için core-site.xml dosyasında hangi değer var? Hdfs: // host [: port] –
teşekkürler. Gerekli hdfs: // host: port çalışmasında fs.default.name ayarı yapıldı. – Chirag
okuyup HDF'ler için yazmayı tam çalışma kodudur. İki argüman
Girdi yolu (yerel/HDF'ler)
Çıktı yolu (HDF'ler) Ben Cloudera sandbox kullanılan
sürer.
package hdfsread;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class ReadingAFileFromHDFS {
public static void main(String[] args) throws IOException {
String uri = args[0];
InputStream in = null;
Path pt = new Path(uri);
Configuration myConf = new Configuration();
Path outputPath = new Path(args[1]);
myConf.set("fs.defaultFS","hdfs://quickstart.cloudera:8020");
FileSystem fSystem = FileSystem.get(URI.create(uri),myConf);
OutputStream os = fSystem.create(outputPath);
try{
InputStream is = new BufferedInputStream(new FileInputStream(uri));
IOUtils.copyBytes(is, os, 4096, false);
}
catch(IOException e){
e.printStackTrace();
}
finally{
IOUtils.closeStream(in);
}
}
}
Merhaba, bunu denediğimde org/apache/hadoop/fs/FSDataOutputStream hatası alıyorum. Pomona ortak hadoop-hdfs kütüphaneleri ekledim. ve ayrıca core-site.xml, hdfs-site.xml dosyasını yapılandırmamı ekledi. – user4342532
Hangi versiyonda Hadoop kullanıyorsunuz? bin/hadoop dfs -copyFromLocal klasörü 'klasörü 'kopyalar ve yinelemeli her şeyi benim için iyi. –
, dizin bir 'dosya' olmadığından. dizini yinelemeli olarak oluşturmalı ve dosyayı tek tek taşımalısınız (isterseniz, bunu paralel olarak yapabilirsiniz). Tabii ki, bu işlemin atomik olmadığının farkında olmalısın, yani eğer başarısız olursan, bazı dosyalar hdfs üzerine bırakılmıştı. – octo