點選上方藍色字關注我們!
基
礎
實
驗
Hadoop是一款開源的大資料通用處理平台,其提供了分布式存儲和分布式離線計算。Hadoop由HDFS、YARN、MapReduce組成。
Hadoop分布式檔案系統(HDFS)是一種分布式檔案系統(Distributed File System)。HDFS具有高度容錯性,适合部署在廉價的機器上。HDFS能提供高吞吐量的資料通路,非常适合大規模資料集上的應用。
HDFS其實是将一個大檔案分成若幹塊儲存在不同伺服器的多個節點中。通過聯網讓使用者感覺像是在本地一樣檢視檔案,為了降低檔案丢失造成的錯誤,HDFS會為每個小檔案複制多個副本(預設為3個),以此來實作多機器上的多使用者分享檔案和存儲空間。
HDFS體系結構
HDFS采用了主從(Master/Slave)結構模型,一個HDFS叢集是由一個NameNode和若幹個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的命名空間和用戶端對檔案的通路操作;叢集中的多個DataNode負責管理存儲的資料。
塊大小:Hadoop2版本裡一個塊預設為128M,小檔案也占用一個塊,小檔案越多,塊越多。是以,HDFS中不适合存儲小檔案。
副本個數:儲存多個副本(預設3個),提供容錯機制,一個副本丢失或當機,自動恢複。
01
實驗目的
熟悉HDFS基本指令行操作
使用Java 接口,通過Java程式讀取HDFS中的檔案
02
實驗環境
雲伺服器1台:(華為雲、阿裡雲、騰訊雲等等均可)
作業系統:CentOS7.4 64位
系統配置:2核4G以上
感謝華為雲提供雲伺服器支援!
03
實驗步驟
》》實驗資源
作業系統:CentOS 7
JDK:JDK8
Hadoop:2.8.5
Github位址:https://github.com/my-ss-course/BigData
工具包位址:連結: https://pan.baidu.com/s/1nOvFQGj12N3ODNilOYMYjg 密碼: r8qo
已經按照前面的教程搭建好3個節點的Hadoop僞分布式叢集
1
登入遠端雲伺服器
使用本地用戶端連接配接遠端雲伺服器
2
啟動Hadoop叢集
如已啟動hadoop容器,請忽略本步驟
./start_container.sh
進入hadoop-node1節點的容器
docker exec -it hadoop-node1 /bin/bash
3
通過指令行方式操作HDFS檔案系統
01 指令行接口格式
格式1:hadoop fs -指令 路徑
格式2:hdfs dfs -指令 路徑
02 ls指令
hdfs dfs -ls /
03 put指令
将本地檔案上傳到HDFS中。
hdfs dfs -put /usr/local/hadoop-2.8.5/NOTICE.txt /input/
04 get指令
将HDFS中檔案下載下傳到本地
hdfs dfs -get /input/README.txt ./
hdfs dfs -get /input/README.txt README2.txt
hdfs dfs -get /input/README.txt
05 rm指令
删除檔案
hdfs dfs -rm /input/README.txt
删除目錄
hdfs dfs -rm -r /output
06 mkdir指令
建立目錄
hdfs dfs -mkdir /output
建立多級目錄,使用-p參數
hdfs dfs -mkdir -p /output/abc/123
07 cp指令
hdfs dfs -cp /input/NOTICE.txt /input/NOTICE2.txt
08 mv指令
hdfs dfs -mv /input/NOTICE.txt /input/NOTICE3.txt
09 cat指令
hdfs dfs -cat /input/NOTICE3.txt
4
使用Java API操作HDFS檔案系統中資料
01
建立IntelliJ IDEA下的maven項目
- 點選File->New->Project,在彈出的對話框中選擇Maven
- JDK選擇相應的版本,點選Next
- 填寫Maven的
和GroupId
ArtifactId,可以随便填寫
- 項目名可填寫HDFSTest
- 編輯pom.xml添加hadoop依賴
<dependencies>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-hdfsartifactId>
<version>2.8.5version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>2.8.5version>
dependency>
dependencies>
02
編寫代碼
建立一個class,增加如下實驗代碼
public static void main(String[] args) throws IOException {
System.out.println("hello world");
Configuration conf=new Configuration();
conf.set("fs.defaultFS","hdfs://你的雲伺服器的IP:19000或hadoop-node1節點的IP:9000");
FileSystem hdfs =FileSystem.get(conf);
boolean is_success = hdfs.mkdirs(new Path("/helloByJava"));
if(is_success){
System.out.println("success");
}else{
System.out.println("failure");
}
hdfs.close();
}
注意要把安全組以及防火牆中的端口打開。
直接運作程式的結果如下
警告先忽略,因為沒有配置log4j
可以看到能夠在HDFS中成功建立了一個目錄。
這這這也太不安全了吧???
可以直接通路我的HDFS
03
打包釋出
1、pom.xml檔案中增加如下代碼,用于編譯打包
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>2.3.2version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
<plugin>
<artifactId>maven-assembly-plugin artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependenciesdescriptorRef>
descriptorRefs>
<archive>
<manifest>
<mainClass>com.myhadoop.HelloWorldmainClass>
manifest>
archive>
configuration>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>singlegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
注意:代碼中mainClass需要根據打包的具體類修改
2、在IDEA右側欄中選擇Maven Projects,打開Lifecycle檔案夾,先點選compile再點選package,等待jar打包成功。
3、jar包打完之後打開左側target檔案夾,發現有兩個jar包,把無依賴的jar包複制到hadoop-node1節點内
拷貝到hadoop-node1節點
4、在hadoop-node1節點下執行指令
hadoop jar jar包名 classname
hadoop jar hadoop-1.0.jar com.myhadoop.HelloWorld
END
每天進步一點點
讓我知道你在看