HDFS-namenode 原理:記錄元數據(hdfs的目錄結構、塊信息等)
1.會將樹形的數據結構對象序列化到namenode工作目錄中的faimages文件中,隔一段時間序列化一次。 對hdfs的修改操作被記錄下來,存在磁盤--edits日志文件。 如果掛機了先反序列化faimages的文件,但是不是最新的元數據,再把edits文件中的操作記錄解析與faimages合並成最新的元數據。
2.namenode本身不會做faimages和edits文件的合並,使用Secondarynamenode節點來完成合並操作。第一次先下載faimages和edits到自己的磁盤中,反序列化faimages到內存,啟動一個程序讀edits文件再更新faimages文件。上傳faimages到namenode上。
查看 hadoop fs -ls hdfs文件 一個文件按照128MB每塊來切分 每塊保存3個副本 比如 170MB的文件會被切分成2塊128MB的塊,第一塊128MB 第二塊42MB 每塊有3個副本
1、向hdf上傳文件:hadoop fs -put 文件 hdfs中的路徑
2、向hdfs下載文件:hadoop fs -get hdfs中的文件路徑 本地路徑
3、創建文件夾:hadoop fs -mkdir /aaa
4、移動文件夾: hadoop fs -mv /一個路徑 /另一個路徑
5、刪除:hadoop fs -rm -r /xxx
6、查看hdfs中的文本內容:hadoop fs -cat /demo.txt hadoop fs -tail -f /demo.txt 倒數幾行
7、追加內容 hadoop fs -appendToFile xxx.txt /aaa.txt
8、hadoop fs 提示可用的命令
Java客戶端:
//new Configuration()會從項目的classpath中加載core-default.xml 等 也可以自己創建一個core-site.xml 加載時會覆蓋core-default.xml Configuration conf = new Configuration(); //指定客戶端上傳到hdfs的文件的副本數 不是必須的操作 有默認值 conf.set("dfs.replication","2"); //構造一個訪問HDFS的客戶端對象:參1:hdfs的uri 參2:配置文件 參3:客戶端身份 FileSystem fs = FileSystem.get(new URI("hdfs://hdp-01:9000/"),conf,"root");
//上傳一個文件到HDFS
fs.copyFromLocalFile(new Path("本地路徑"),new Path("HDFS的路徑"));
//下載HDFSS上的文件 fs訪問本地的磁盤,就需要使用hadoop系統的C語言庫,就需要使用hadoop/bin 配置HADOOP_HOME
fs.copyToLocalFile(new Path("HDFS的路徑"),new path("本地路徑"));
// hdfs內的移動
fs.rename(new Path(),new Path());
//創建文件夾
fs.mkdirs(new Path());
//刪除文件夾
fs.delete(new Path(),true);
//查詢hdfs目錄下的文件信息 參2 遞歸查詢下去 返回的是迭代器
fs.listFiles(enw Path,true)
//查詢hdfs目錄下的文件夾和文件信息 只看一級 返回數組
fs.status(new Path)
fs.close();
/** * 讀取hdfs中文件的指定偏移量范圍的內容 * * * 作業題:用本例中的知識,實現讀取一個文本文件中的指定BLOCK塊中的所有數據 * * @throws IOException * @throws IllegalArgumentException */ @Test public void testRandomReadData() throws IllegalArgumentException, IOException { FSDataInputStream in = fs.open(new Path("/xx.dat")); // 將讀取的起始位置進行指定 in.seek(12); // 讀16個字節 byte[] buf = new byte[16]; in.read(buf); System.out.println(new String(buf)); in.close(); fs.close(); } /** * 往hdfs中的文件寫內容 * * @throws IOException * @throws IllegalArgumentException */ @Test public void testWriteData() throws IllegalArgumentException, IOException { FSDataOutputStream out = fs.create(new Path("/zz.jpg"), false); // D:\images\006l0mbogy1fhehjb6ikoj30ku0ku76b.jpg FileInputStream in = new FileInputStream("D:/images/006l0mbogy1fhehjb6ikoj30ku0ku76b.jpg"); byte[] buf = new byte[1024]; int read = 0; while ((read = in.read(buf)) != -1) { out.write(buf,0,read); } in.close(); out.close(); fs.close(); }