大數據平臺複習一. HDFS

萌噠老司機 2022-01-07 18:29:39 阅读数:930

hdfs

什麼是文件系統
操作系統的一部分
是一個軟件程序
在用戶和計算機的存儲設備之間建立橋梁

主要職責
建立了一個硬盤等存儲設備中存儲內容的目錄結構
一般采用樹形結構,錶示存儲內容的不同層次
目錄中的每個組成項稱為一個文件,目錄的樹形結構也存儲了文件之間的關系
提供了相應的命令和接口來便於用戶對存儲設備的讀寫操作

當面臨海量的數據時……
單臺計算機的文件系統可能無法存儲所有的數據!利用網絡將大量的計算節點互聯,向下將各個節點中的存儲容量進行集中管理,向上為用戶提供透明化服務,人們在使用分布式文件系統時,就像使用本地文件系統一樣,無需關心數據是存儲在哪個節點上、或者是從哪個節點從獲取的

Hadoop Distributed File System,Hadoop分布式文件系統
在這裏插入圖片描述
硬件故障容錯
HDFS被設計成可運行於由成千上萬廉價的普通PC或者商用服務器組成的集群上,集群的每個組成部分都可能在運行時發生故障
HDFS會自動將數據保存多個副本
流式數據訪問
面向大數據處理,采用的數據訪問模式是一次寫入、多次讀取
適合批量處理,而不適合於與用戶交互的應用
面向大數據集
支持大文件處理,不適合於小文件的處理
典型的HDFS文件大小達到GB到TB量級
大量的小文件將大量占用HDFS中NameNode節點用來存儲文件系統文件目錄等信息的空間
簡化的一致性模型
一個文件一旦被創建和數據寫入之後,除了增加之外便不能修改
當文件上傳到Hadoop集群後,會進行文件切塊、分發和複制等操作,如果文件被修改會導致重新觸發這個過程

移動計算比移動數據更經濟
HDFS提供接口支持代碼向數據遷移
避免了大量數據的傳輸,消除了網絡的擁堵
跨异構軟硬件平臺的可移植性
基於JAVA語言進行開發
易於從一個平臺移植到另一個平臺
文件分塊
將大文件按照固定大小拆分成一個個數據塊,然後將數據塊發送到集群的不同節點進行存儲
在初期數據塊默認大小為64M,在Hadoop2.0之後數據塊默認大小為128MB
不關心文件內容,僅根據內容在文件的偏移量(相對於文件頭的偏移)來進行分割
可能會導致邏輯上的一個完整內容,在分割之後被分別存儲於不同的數據塊中

多副本機制
HDFS為每個數據塊在集群中提供多個備份
默認的是同節點和同機架並行、三副本存儲的模式
一個副本存儲在用戶所使用的機器節點
第二個副本存放在集群中與第一個副本處於不同的機架的機器節點上
第三個副本存放在與第二個副本同一個機架不同的機器節點上


在這裏插入圖片描述

在這裏插入圖片描述
命令格式
(1)列舉一個目錄的所有文件
hadoop fs –ls 目錄的路徑
(2)創建文件夾
hadoop fs –mkdir 文件夾的路徑和名稱
在這裏插入圖片描述
(3)將本地文件上傳至HDFS
hadoop fs –put 本地文件路徑 目標路徑
在這裏插入圖片描述
(4)將文件從HDFS下載到本地文件系統
hadoop fs –get HDFS文件路徑 本地存放路徑
在這裏插入圖片描述
(5)查看文件的內容
hadoop fs –text(cat) HDFS文件的路徑
在這裏插入圖片描述
(6)删除文件或者文件夾
hadoop fs –rm(rmr) HDFS中文件或者文件夾的路徑

删除文件和空目錄用rm命令,而删除文件夾則用rmr命令!!

在這裏插入圖片描述
Maven的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 如下的groupID、artifactID、version標簽都是建立maven項目時所要填寫的信息。這些信息需要針對自己所建立的maven項目進行修改 -->
<groupId>com.liu</groupId>
<artifactId>HDFSapp</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 示例所依賴的jar包都通過如下的標簽給出 -->
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
</project>

配置host.xml文件
在hdfs-site.xml文件中添加如下信息,並重啟HDFS

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

java操作

IDEA+maven編寫

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import java.net.URI;
public class HDFSapp {

//指定默認的HDFS的路徑
String hdfsURL = "hdfs://localhost:9000";
FileSystem fs=null;
Configuration configuration=null;
//構造函數
public HDFSapp(){

try{

configuration=new Configuration();
fs = FileSystem.get(URI.create(hdfsURL), configuration);
}catch (Exception e){

System.out.println("a exception");
}
}
//main函數
public static void main(String[] args) {

HDFSapp hdfsclient = new HDFSapp();
hdfsclient.mkdir();
hdfsclient.create();
hdfsclient.put();
hdfsclient.get();
hdfsclient.detele();
}
//在HDFS根目錄下的dataset目錄下創建一個test子目錄
public void mkdir() {

try {

boolean maked=fs.mkdirs(new Path("/dataset/test"));
System.out.println("a dir is created!");
}catch (Exception e){

System.out.println("a exception");
}
}
//在HDFS根目錄下的dataset目錄下test子目錄中創建一個文件
public void create() {

try {

FSDataOutputStream output=fs.create(new Path("/dataset/test/example.txt"));
output.write("nihao".getBytes());
output.flush();
output.close();
System.out.println("a file is created!");
}catch (Exception e){

System.out.println("a exception");
}
}
//將本地“/home/hadoop/”路徑下的文件example.txt上傳到HDFS
//的“/dataset/test”路徑下
public void put() {

try {

fs.copyFromLocalFile(new Path("/home/hadoop/example.txt"),
new Path("/dataset/test/"));
System.out.println("a file is put to HDFS!");
}catch (Exception e){

System.out.println("a exception");
}
}
//將HDFS“/dataset/test”路徑下的example.txt文件下載到
//本地“/home/hadoop/”路徑下
public void get() {

try {

fs.copyToLocalFile(new Path("/dataset/test/example.txt"),
new Path("/home/hadoop/"));
System.out.println("a file is got from HDFS!");
}catch (Exception e){

System.out.println("a exception");
}
}
//將HDFS“/dataset/test”路徑下的example.txt文件删除
public void detele() {

try {

boolean delete = fs.delete(new Path("/dataset/test/example.txt"), true);
System.out.println("a file is deleted!");
}catch (Exception e){

System.out.println("a exception");
}
}
}
版权声明:本文为[萌噠老司機]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071829393443.html