hadoop fs命令无法使用_Hadoop从入门到入土(三)HDFS集群简单维护及JAVA客户端连接HDFS...
集群簡(jiǎn)單維護(hù)
查看日志
上篇我們搭建了集群,并且完成了hdfs的搭建,但在我的linux02和linux03上,發(fā)現(xiàn)一個(gè)問題,我啟動(dòng)了datanode之后,開始進(jìn)程還在,一會(huì)就自己消失了,這是為什么呢?(如下圖)
查看頁面顯示,也只有一個(gè)datanode節(jié)點(diǎn)(linux01)上的。
為了查看哪里出現(xiàn)了問題,我們可以查看一下機(jī)器上datanode的啟動(dòng)日志,日志的位置在hadoop下的logs里面,里面存放著日志相關(guān)的內(nèi)容,我們以linux02上的為例:
查看一下datanode的日志? ? tail -100? xxxxxxx-datanode-linux02.log
快速瀏覽一下,留心異常關(guān)鍵詞? err、error、exception、not? defined、not? exists? 、not? 之類的
可以看到,如上圖:確實(shí)出現(xiàn)了問題,通過問題處,我又發(fā)現(xiàn)了關(guān)鍵詞:clusterID、UUID等,很明顯是我們的注冊(cè)環(huán)節(jié)出現(xiàn)了問題
這里簡(jiǎn)單的闡述一下 datanode和namenode的通信機(jī)制吧,這樣更好理解,而且其中也涉及到了clusterID和UUID
如上圖:
1)當(dāng)有進(jìn)的節(jié)點(diǎn)需要加入到集群當(dāng)中時(shí)(比如HDFS的存儲(chǔ)空間不夠,需要加入新的機(jī)器,新的dn),首先會(huì)向nn注冊(cè),主動(dòng)向nn匯報(bào)自己機(jī)器上的資源情況
2)nn接收匯報(bào),看一下你夠不夠格,你要是還剩下100M的容量,我要你何用?還浪費(fèi)我nn的管理資源;如果可以,將返回給dn 我們集群的ID :clusterID 和存儲(chǔ)數(shù)據(jù)塊池ID ?block-id(如下圖)
在/opt/hdpdata/name/current/VERSION? 存儲(chǔ)著namenode的核心數(shù)據(jù)? 可以看到 集群id和數(shù)據(jù)塊池id? (linux01)機(jī)器
接著我們?cè)倏纯磀ata下的數(shù)據(jù)? ?/opt/hdpdata/data/current/VERSION? ??
可以看到集群id和數(shù)據(jù)塊池id? ,還有一個(gè)uuid? 是其唯一標(biāo)識(shí)
接著去查看linux02 機(jī)器上datanode相關(guān)標(biāo)識(shí)
可以看到uuid確實(shí)不一樣,但是BPid和集群id怎么也不一樣呢,很明顯都不是一個(gè)集群的了
所以刪掉data文件,在linux02上重新開啟生成注冊(cè)
這下子發(fā)現(xiàn)果真好了,去頁面上查看一下:
同理,linux03上采用同樣的方法:
最終查看頁面:
成功解決問題!真嗨森~
接著講通信機(jī)制
3)新注冊(cè)的dn收到了nn老大派來的集群id clusterID(你以后就跟我們一起混了!)還有數(shù)據(jù)塊池id BP-ID (你以后存數(shù)據(jù)? 就放這個(gè)里面了,聽到了嗎!),然后dn屁顛屁顛很開心,并且生成自己的一個(gè)唯一標(biāo)識(shí)uuid
4)dn定期會(huì)進(jìn)行心跳機(jī)制,以此來證明自己還活著。。還能正常通信和工作? 通常是3s發(fā)送一次心跳
5)如若有一天,某個(gè)dn不再發(fā)送心跳了;nn這個(gè)時(shí)候并不會(huì)立馬把這個(gè)逆子或者叛徒給剔除掉,會(huì)在5min中之后進(jìn)行嘗試連接? ping 通信;如若還是沒有成功,會(huì)再過5min種嘗試ping,多次ping還是沒有成功,這個(gè)時(shí)候,可以認(rèn)定這個(gè)dn已經(jīng)gg了,就把他剔除了
6)dn還會(huì)定期向nn匯報(bào)自己的工作情況
7)如若dn上某個(gè)數(shù)據(jù)塊備份丟失,會(huì)在nn上任務(wù)隊(duì)列中產(chǎn)生任務(wù),在dn向nn發(fā)送心跳的時(shí)候,如果有任務(wù),就會(huì)領(lǐng)取,比如副本復(fù)制的任務(wù)
設(shè)置一鍵啟停任務(wù)及HDFS命令
配置環(huán)境變量
vi? /etc/profile?
export ?JAVA_HOME=/opt/apps/jdk1.8.0_141
export ?HADOOP_HOME=/opt/apps/hadoop-3.1.1
export ?PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source? /etc/profile
可以查看hdfs下所有的文件
hdfs dfs /
在hdfs根目錄下創(chuàng)建一個(gè)tom的文件夾
hdfs dfs -mkdir tom /
在頁面上查看
其他一些命令:
一鍵啟停
在? etc/hadoop/workers 配置 需要啟動(dòng)DataNode的機(jī)器名
在啟停腳本中聲明用戶? ?sbin/start-dfs.sh sbin/stop-dfs.sh
#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
一鍵啟動(dòng)? 在sbin 下? ./start-dfs.sh
一鍵關(guān)閉??? 在sbin 下? ./stop-dfs.sh
JAVA客戶端操作HDFS
java客戶端操作集群HDFS 分四步走戰(zhàn)略
1)創(chuàng)建配置文件的對(duì)象?
2)獲取HDFS文件系統(tǒng)的對(duì)象
3)操作文件系統(tǒng)
4)關(guān)閉流資源
上傳文件代碼:
package cn.doit19.hadoop.hdfs;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import java.net.URI;public class Demo01 { public static void main(String[] args) throws Exception { //獲取配置文件的對(duì)象 不設(shè)置則為默認(rèn)值 Configuration conf = new Configuration(); //獲取HDFS文件系統(tǒng)的對(duì)象 FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root"); //操作文件系統(tǒng) fs.copyFromLocalFile(new Path("E://count.txt"), new Path("/")); //關(guān)閉流資源 fs.close(); }}查看網(wǎng)頁上文件
讀取文件代碼:
測(cè)試類:
package cn.doit19.hadoop.hdfs;import cn.doit19.hadoop.util.Util;import org.apache.hadoop.fs.FSDataInputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class TestHDFS { public static void main(String[] args) throws Exception { FileSystem fs = Util.getFs(); readFile(fs); } private static void readFile(FileSystem fs) throws IOException { FSDataInputStream open = fs.open(new Path("/count.txt")); BufferedReader br = new BufferedReader(new InputStreamReader(open)); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); } }}工具類:
package cn.doit19.hadoop.util;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import java.net.URI;public class Util { public static FileSystem getFs() throws Exception { Configuration conf = new Configuration(); return FileSystem.newInstance( new URI("hdfs://linux01:8020"), conf, "root" ); }}測(cè)試結(jié)果:
代碼解析:
1)創(chuàng)建配置文件的對(duì)象
這個(gè)是配置對(duì)象,配置一些文件的屬性,比如上傳文件時(shí)備份的數(shù)量,還有切塊的大小等?!灸J(rèn)備份數(shù)量為3,切塊大小為128M】下篇內(nèi)容會(huì)講
有三種配置方式? ?1.默認(rèn)配置 (就是什么都不寫,什么都不做)? 2.讀取配置文件? ?3.代碼中直接設(shè)置? ?從左到右 優(yōu)先級(jí)依次增高
配置文件寫在resources中,xml格式? 嚴(yán)格的配置文件
代碼中設(shè)置如下:
2)獲取HDFS文件系統(tǒng)對(duì)象
FileSystem fs = FileSystem.newInstance(new URI("hdfs://linux01:8020"), conf, "root");3)操作方法??
copyFromLocalFile 從 本地 復(fù)制文件到 HDFS 即上傳文件copyToLocalFile 復(fù)制文件到本地 即從HDFS上下載文件open(Path path) 打開一個(gè)流 用以讀取 HDFS 上的指定路徑的文件等等等等。。。
更多學(xué)習(xí)、面試資料盡在微信公眾號(hào):Hadoop大數(shù)據(jù)開發(fā)
總結(jié)
以上是生活随笔為你收集整理的hadoop fs命令无法使用_Hadoop从入门到入土(三)HDFS集群简单维护及JAVA客户端连接HDFS...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7旗舰版系统开启硬盘ahci模式的
- 下一篇: 雨林木风win11 64位安全旗舰版镜像