HDFS nedir?
HDFS, ticari donanım kümeleri üzerinde çalışan, çok büyük veri dosyalarını depolamak için dağıtılmış bir dosya sistemidir. Hataya dayanıklı, ölçeklenebilir ve genişletmesi son derece basittir. Hadoop, HDFS ( Hadoop Dağıtılmış Dosya Sistemleri ) ile birlikte gelir .
Veriler, tek bir fiziksel makinedeki depolama kapasitesini aştığında, bir dizi ayrı makineye bölmek zorunlu hale gelir. Bir makine ağında depolamaya özgü işlemleri yöneten bir dosya sistemine dağıtılmış dosya sistemi denir. HDFS böyle bir yazılımdır.
Bu eğitimde öğreneceğiz,
- HDFS nedir?
- HDFS Mimarisi
- İşlemi Oku
- Yazma İşlemi
- JAVA API kullanarak HDFS'ye erişin
- COMMAND-LINE INTERFACE Kullanarak HDFS'ye Erişin
HDFS Mimarisi
HDFS kümesi, öncelikle dosya sistemi Meta Verilerini yöneten bir Ad Düğümünden ve gerçek verileri depolayan bir Veri Düğümünden oluşur .
- NameNode: NameNode sistemin yöneticisi olarak düşünülebilir. Sistemde bulunan tüm dosyalar ve dizinler için dosya sistemi ağacını ve meta verileri korur. Meta veri bilgilerini depolamak için iki dosya 'Ad alanı görüntüsü' ve 'düzenleme günlüğü' kullanılır. Namenode, belirli bir dosya için veri bloklarını içeren tüm veri blokları hakkında bilgi sahibidir, ancak blok konumlarını kalıcı olarak saklamaz. Bu bilgiler, sistem başladığında her veri veri tabanından yeniden oluşturulur.
- DataNode: DataNode'lar, bir kümedeki her makinede bulunan ve gerçek depolamayı sağlayan slave'lerdir. Müşterilere hizmet verme, okuma ve yazma taleplerinden sorumludur.
HDFS'deki okuma / yazma işlemleri bir blok seviyesinde çalışır. HDFS'deki veri dosyaları, bağımsız birimler olarak depolanan blok boyutlu parçalara bölünür. Varsayılan blok boyutu 64 MB'dir.
HDFS, veri bloklarının çoklu kopyalarının oluşturulduğu ve düğüm arızası durumunda yüksek veri kullanılabilirliğini sağlamak için bir küme boyunca düğümler üzerinde dağıtıldığı bir veri kopyalama kavramı üzerinde çalışır.
Biliyor musunuz? Tek bir bloktan daha küçük olan HDFS'deki bir dosya, bir bloğun tam depolama alanını kaplamaz.
HDFS'de Çalışmayı Oku
Veri okuma isteği, HDFS, NameNode ve DataNode tarafından sunulur. Okuyucuya 'müşteri' diyelim. Aşağıdaki şema, Hadoop'ta dosya okuma işlemini göstermektedir.
- Bir istemci , FileSystem nesnesinin 'open ()' yöntemini çağırarak okuma isteğini başlatır ; DistributedFileSystem türünde bir nesnedir .
- Bu nesne, RPC kullanarak namenode'a bağlanır ve dosyanın bloklarının konumları gibi meta veri bilgilerini alır. Lütfen bu adreslerin bir dosyanın ilk birkaç bloğuna ait olduğunu unutmayın.
- Bu meta veri talebine yanıt olarak, bu bloğun bir kopyasına sahip olan DataNode'ların adresleri geri döndürülür.
- DataNodes adresleri alınan sonra, tip bir amacı FSDataInputStream istemciye geri gönderilir. FSDataInputStream , DataNode ve NameNode ile etkileşimlerle ilgilenen DFSInputStream içerir . Yukarıdaki şemada gösterilen basamak 4'te, bir istemci çağrıştırır '() oku' neden olan yöntem DFSInputStream bir dosya ilk blok ilk DataNode ile bir bağlantı kurmak için.
- Veriler, istemcinin tekrar tekrar 'read ()' yöntemini çağırdığı akışlar biçiminde okunur . Bu read () işlemi, bloğun sonuna ulaşıncaya kadar devam eder.
- Bir bloğun sonuna ulaşıldığında, DFSInputStream bağlantıyı kapatır ve sonraki blok için sonraki DataNode'u bulmaya devam eder.
- İstemci okumayı tamamladığında, bir close () yöntemini çağırır .
HDFS'de Yazma İşlemi
Bu bölümde, verilerin HDFS'ye dosyalar aracılığıyla nasıl yazıldığını anlayacağız.
- Bir istemci, yeni bir dosya oluşturan DistributedFileSystem nesnesinin 'create ()' yöntemini çağırarak yazma işlemini başlatır - Adım no. Yukarıdaki diyagramda 1.
- DistributedFileSystem nesnesi, RPC çağrısını kullanarak NameNode'a bağlanır ve yeni dosya oluşturmayı başlatır. Ancak, bu dosya oluşturma işlemi dosya ile herhangi bir blok ilişkilendirmez. Dosyanın (oluşturulmakta olan) halihazırda mevcut olmadığını ve istemcinin yeni bir dosya oluşturmak için doğru izinlere sahip olduğunu doğrulamak NameNode'un sorumluluğundadır. Bir dosya zaten varsa veya istemcinin yeni bir dosya oluşturmak için yeterli izni yoksa , istemciye IOException atılır. Aksi takdirde, işlem başarılı olur ve NameNode tarafından dosya için yeni bir kayıt oluşturulur.
- NameNode'da yeni bir kayıt oluşturulduktan sonra, istemciye FSDataOutputStream türünde bir nesne döndürülür. Bir istemci bunu HDFS'ye veri yazmak için kullanır. Veri yazma yöntemi çağrılır (diyagramdaki 3. adım).
- FSDataOutputStream, DataNodes ve NameNode ile iletişimden sonra ilgilenen DFSOutputStream nesnesini içerir. İstemci veri yazmaya devam ederken, DFSOutputStream bu verilerle paketler oluşturmaya devam eder. Bu paketler, DataQueue olarak adlandırılan bir kuyruğa sıralanır .
- Bu DataQueue'yu tüketen DataStreamer adında bir bileşen daha var . DataStreamer ayrıca NameNode'dan yeni blokların tahsis edilmesini ister, böylece replikasyon için kullanılacak istenen DataNode'ları seçer.
- Şimdi, çoğaltma işlemi DataNodes kullanarak bir ardışık düzen oluşturarak başlar. Bizim durumumuzda, 3'lük bir replikasyon seviyesi seçtik ve dolayısıyla ardışık düzen içinde 3 DataNode var.
- DataStreamer, paketleri ardışık düzendeki ilk DataNode'a döker.
- Bir ardışık düzen içindeki her DataNode, kendisi tarafından alınan paketi depolar ve aynısını bir ardışık düzen içindeki ikinci DataNode'a iletir.
- Başka bir kuyruk, 'Ack Queue' DFSOutputStream tarafından DataNodes tarafından onaylanmayı bekleyen paketleri depolamak için tutulur.
- Sıradaki bir paket için onay, ardışık düzen içindeki tüm DataNode'lardan alındığında, "Ack Queue" dan kaldırılır. Herhangi bir DataNode arızası durumunda, işlemi yeniden başlatmak için bu kuyruktaki paketler kullanılır.
- Bir istemci verileri yazmayı tamamladıktan sonra, bir close () yöntemini çağırır (diyagramda Adım 9) close () çağrısı, kalan veri paketlerinin ardışık düzene boşaltılmasıyla sonuçlanır ve ardından onay beklenir.
- Son bir alındı bildirimi alındığında, Dosya yazma işleminin tamamlandığını bildirmek için NameNode ile iletişime geçilir.
JAVA API kullanarak HDFS'ye erişin
Bu bölümde, Hadoop'un dosya sistemine erişim için kullanılan Java arayüzünü anlamaya çalışıyoruz.
Hadoop'un dosya sistemiyle programlama yoluyla etkileşim kurmak için Hadoop, birden çok JAVA sınıfı sağlar. Org.apache.hadoop.fs adlı paket, Hadoop'un dosya sistemindeki bir dosyanın işlenmesinde yararlı sınıfları içerir. Bu işlemler, açma, okuma, yazma ve kapatmayı içerir. Aslında, Hadoop için dosya API'si geneldir ve HDFS dışındaki diğer dosya sistemleriyle etkileşim kurmak için genişletilebilir.
HDFS'den programlı olarak bir dosya okuma
Java.net.URL nesnesi , bir dosyanın içeriğini okumak için kullanılır. Başlangıç olarak, Java'nın Hadoop'un hdfs URL şemasını tanımasını sağlamalıyız. Bu, URL nesnesi üzerinde setURLStreamHandlerFactory yöntemi çağrılarak yapılır ve ona bir FsUrlStreamHandlerFactory örneği iletilir. Bu yöntemin JVM başına yalnızca bir kez yürütülmesi gerekir, bu nedenle statik bir blok içine alınır.
Örnek bir kod:
public class URLCat {static {URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());}public static void main(String[] args) throws Exception {InputStream in = null;try {in = new URL(args[0]).openStream();IOUtils.copyBytes(in, System.out, 4096, false);} finally {IOUtils.closeStream(in);}}}
Bu kod bir dosyanın içeriğini açar ve okur. Bu dosyanın HDFS üzerindeki yolu programa komut satırı argümanı olarak aktarılır.
COMMAND-LINE INTERFACE Kullanarak HDFS'ye Erişin
Bu, HDFS ile etkileşim kurmanın en basit yollarından biridir. Komut satırı arabirimi, dosyayı okuma, dizinler oluşturma, dosyaları taşıma, verileri silme ve dizinleri listeleme gibi dosya sistemi işlemlerini destekler.
Biz çalıştırabilir '$ HADOOP_HOME / bin / HDF'ler dfs -help' her komutun ayrıntıları yardım almak için. Burada, 'dfs' , birden çok alt komutu destekleyen HDFS'nin bir kabuk komutudur.
Yaygın olarak kullanılan komutlardan bazıları, her birinin bazı ayrıntılarıyla birlikte aşağıda listelenmiştir.
1. Yerel dosya sisteminden HDFS'ye bir dosya kopyalayın
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /
Bu komut temp.txt dosyasını yerel dosya sisteminden HDFS'ye kopyalar.
2. Bir dizinde bulunan dosyaları -ls kullanarak listeleyebiliriz.
$HADOOP_HOME/bin/hdfs dfs -ls /
'/' Dizini altında listelenen bir 'temp.txt' dosyası (daha önce kopyalanmış) görebiliriz .
3. Bir dosyayı HDFS'den yerel dosya sistemine kopyalama komutu
$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt
Temp.txt dosyasının yerel bir dosya sistemine kopyalandığını görebiliriz .
4. Yeni bir dizin oluşturma komutu
$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory
Bir dizinin oluşturulup oluşturulmadığını kontrol edin. Şimdi, nasıl yapılacağını bilmelisin ;-)