大数据之HDFS
一、HDFS角色
1、nameNode:負(fù)責(zé)管理整個(gè)文件系統(tǒng)的元數(shù)據(jù);
2、dataNode :負(fù)責(zé)管理用戶的文件數(shù)據(jù)塊;
3、secondary Namenode:負(fù)責(zé)管理image鏡像文件;
dataNode會(huì)定期向nameNode匯報(bào)自身所保存的文件block信息,而namenode則會(huì)負(fù)責(zé)保持文件的副本數(shù)量
二、客戶端向HDFS寫數(shù)據(jù):
上傳數(shù)據(jù)是,dataNode的選擇策略:
1、第一個(gè)副本先考慮和客戶端最近的機(jī)架;
2、第二個(gè)副本再考慮跨機(jī)架選dataNode;
3、第三個(gè)副本在第一個(gè)副本機(jī)架另外選一個(gè)dataNode;
以packet為單位上傳,以chunk為單位校驗(yàn);
三、nameNode管理元數(shù)據(jù)機(jī)制:
hdfs集群不適合存儲(chǔ)大量的小文件;
若nameNode宕機(jī),hdfs就不能正常提供服務(wù);
若namenode硬盤損壞,可以通過secondary Namenode恢復(fù)大部分?jǐn)?shù)據(jù),
因此在配置nameNode的工作目錄參數(shù)時(shí),應(yīng)配置在多塊磁盤上;
nameNode的內(nèi)存常態(tài)為128G。
四、java操作HDFS文件
用流的方式來操作hdfs上的文件,可以實(shí)現(xiàn)讀取指定偏移量范圍的數(shù)據(jù)
package cn.itcast.hdfs;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.net.URI;import org.apache.commons.io.IOUtils;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataInputStream;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.junit.Before;import org.junit.Test;public class HdfsStreamAccess {FileSystem fs = null;Configuration conf = null;@Beforepublic void init() throws Exception{conf = new Configuration();//拿到一個(gè)文件系統(tǒng)操作的客戶端實(shí)例對(duì)象// fs = FileSystem.get(conf);//可以直接傳入 uri和用戶身份fs = FileSystem.get(new URI("hdfs://192.168.56.103:9000"),conf,"root"); //最后一個(gè)參數(shù)為用戶名}/*** 通過流的方式上傳文件到hdfs* @throws Exception*/@Testpublic void testUpload() throws Exception {FSDataOutputStream outputStream = fs.create(new Path("/angelababy.love"), true);FileInputStream inputStream = new FileInputStream("c:/angelababy.love");IOUtils.copy(inputStream, outputStream);}/*** 通過流的方式下載hdfs文件* @throws Exception*/@Testpublic void testDownLoad() throws Exception {FSDataInputStream inputStream = fs.open(new Path("/angelababy.love")); FileOutputStream outputStream = new FileOutputStream("d:/angelababy.love");IOUtils.copy(inputStream, outputStream); }/*** 獲取hdfs文件上指定長度內(nèi)容*/@Testpublic void testRandomAccess() throws Exception{FSDataInputStream inputStream = fs.open(new Path("/angelababy.love"));inputStream.seek(12);FileOutputStream outputStream = new FileOutputStream("d:/angelababy.love.part2");IOUtils.copy(inputStream, outputStream); }/*** 顯示hdfs上文件的內(nèi)容*/@Testpublic void testCat() throws IllegalArgumentException, IOException{FSDataInputStream in = fs.open(new Path("/angelababy.love"));IOUtils.copy(in, System.out);// IOUtils.copyBytes(in, System.out, 1024);}}五、hadoop中的rpc框架
1、創(chuàng)建一個(gè)project項(xiàng)目
2、創(chuàng)建客戶端和服務(wù)端,然后分別啟動(dòng)
MyHdfsClient
package cn.itcast.client;import java.net.InetSocketAddress;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import cn.itcast.protocol.ClientNamenodeProtocol;public class MyHdfsClient {public static void main(String[] args) throws Exception {ClientNamenodeProtocol namenode = RPC.getProxy(ClientNamenodeProtocol.class, 1L,new InetSocketAddress("localhost", 8888), new Configuration());String metaData = namenode.getMetaData("/wordcount");System.out.println(metaData);}}ClientNamenodeProtocol
package cn.itcast.protocol;public interface ClientNamenodeProtocol {public static final long versionID=1L; //會(huì)讀取這個(gè)版本號(hào), 但可以和客戶端的不一樣, 沒有校驗(yàn)public String getMetaData(String path);}MyNameNode
package cn.itcast.service;import cn.itcast.protocol.ClientNamenodeProtocol;public class MyNameNode implements ClientNamenodeProtocol{//模擬namenode的業(yè)務(wù)方法之一:查詢?cè)獢?shù)據(jù)@Overridepublic String getMetaData(String path){return path+": 3 - {BLK_1,BLK_2} ....";} }PublishServiceUtil
package cn.itcast.service;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import org.apache.hadoop.ipc.RPC.Builder;import org.apache.hadoop.ipc.RPC.Server;import cn.itcast.protocol.ClientNamenodeProtocol;public class PublishServiceUtil {public static void main(String[] args) throws Exception {Builder builder = new RPC.Builder(new Configuration());builder.setBindAddress("localhost").setPort(8888).setProtocol(ClientNamenodeProtocol.class).setInstance(new MyNameNode());Server server = builder.build();server.start();}}3、運(yùn)行結(jié)果
總結(jié)
- 上一篇: 2021大数据白皮书 附下载
- 下一篇: java 线程间通信 handler_H