Hadoop叢集環境搭建 與Hdfs
Hadoop部分
一、修改Hostname
命令:[[email protected] ~] vi /etc/sysconfig/network
開啟檔案後,(每個虛擬機器主機名不同)
NETWORKING=yes #使用網路
HOSTNAME=hadoop01 #設定主機名
二、賦予虛擬機器ip地址
根目錄下 : vi reset_ip.sh
me=$(cat /etc/udev/rules.d/70-persistent-net.rules |grep -oP '(?<=NAME=").*(?=")'|tail -1) mac=$(cat /etc/udev/rules.d/70-persistent-net.rules |grep -oP '(?<=ATTR{address}==").*?(?=",)'|tail -1) sed -i s/DEVICE.*/DEVICE=${name}/ /etc/sysconfig/network-scripts/ifcfg-eth0 sed -i s/HWADDR=.*/HWADDR=${mac}/ /etc/sysconfig/network-scripts/ifcfg-eth0 service network restart
改變該檔案執行許可權 chmod u+x reset_ip.sh
執行檔案 reset_ip.sh
三、配置Host(關聯主機名和ip地址 每個虛擬機器的關聯都要有)
命令:[[email protected] ~] vi /etc/hosts
新增hosts: 192.168.126.129 hadoop01
四、關閉防火牆
檢查防火牆狀態
[[email protected] ~]# service iptables status
關閉防火牆
[[email protected] ~]# chkconfig iptables off
reboot重啟虛擬機器
五、安裝jdk
(1)使用winsp將jdk1.8儲存到 linux /opt/modules/jdk1.8.tar.gz
[[email protected] /]# tar -zxvf jdk-8u172-linux-x64.tar.gz -C /opt/modules
(2)新增環境變數
設定JDK的環境變數 JAVA_HOME。需要修改配置檔案/etc/profile,追加
export JAVA_HOME="/opt/modules/jdk1.7.0_67" export PATH=$JAVA_HOME/bin:$PATH
修改完畢後,執行 source /etc/profile
(3)安裝後再次執行 java –version 檢視安裝狀態
六、Hadoop部署
1.Hadoop部署模式
Hadoop部署模式有:本地模式、偽分佈模式、完全分散式模式。
區分的依據是NameNode、DataNode、ResourceManager、NodeManager等模組執行在幾個JVM程序、幾個機器。
模式名稱 | 各個模組佔用的JVM程序數 | 各個模組執行在幾個機器數上 |
---|---|---|
本地模式 | 1個 | 1個 |
偽分散式模式 | N個 | 1個 |
完全分散式模式 | N個 | N個 |
2.配置Hadoop
2.1 配置Hadoop環境變數
[[email protected] ~]# vi /etc/profile
export HADOOP_HOME="/opt/modules/hadoop-2.5.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
執行:source /etc/profile 使得配置生效
驗證HADOOP_HOME引數:
[[email protected] /]$ echo $HADOOP_HOME
/opt/modules/hadoop-2.5.0
2.2 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh檔案的JAVA_HOME引數
[[email protected] ~]$ sudo vi ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
修改JAVA_HOME引數為:
export JAVA_HOME="/opt/modules/jdk1.7.0_67"
2.3 配置core-site.xml
(1)建立目錄:
[[email protected] ~]$ mkdir -p /opt/modules/app/hadoop/data/tmp
[[email protected] ~] vi {HADOOP_HOME}/etc/hadoop/core-site.xml
(2) fs.defaultFS引數配置的是HDFS的地址。
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/app/hadoop/data/tmp</value>
</property>
2.4 配置hdfs-site.xml
[[email protected] ~]$ vi /opt/modules/app/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop03:50090</value>
</property>
</configuration>
2.5 配置slaves
[[email protected] ~]$ vi etc/hadoop/slaves
hadoop01
hadoop02
hadoop03
slaves檔案是指定HDFS上有哪些DataNode節點。
2.6 配置yarn-site.xml
[[email protected] hadoop-2.5.0]$ vim etc/hadoop/yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>106800</value>
</property>
根據規劃yarn.resourcemanager.hostname
這個指定resourcemanager伺服器指向bigdata-senior02.chybinmy.com
。
yarn.log-aggregation-enable
是配置是否啟用日誌聚集功能。
yarn.log-aggregation.retain-seconds
是配置聚集的日誌在HDFS上最多儲存多長時間。
2.7 配置mapred-site.xml
從mapred-site.xml.template複製一個mapred-site.xml檔案。
[hadoo[email protected] hadoop-2.5.0]$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>haoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata-senior01.chybinmy.com:19888</value>
</property>
</configuration>
mapreduce.framework.name設定mapreduce任務執行在yarn上。
mapreduce.jobhistory.address是設定mapreduce的歷史伺服器安裝在BigData01機器上。
mapreduce.jobhistory.webapp.address是設定歷史伺服器的web頁面地址和埠號。
3 設定SSH無密碼登入
3.1在hadoop01上生成公鑰
ssh-keygen -t rsa
3.2下載伺服器客戶端
yum -y install openssh-server openssh-clients
3.3 分發公鑰
[[email protected] ~]$ ssh-copy-id hadoop01
[[email protected] ~]$ ssh-copy-id hadoop02
[[email protected] ~]$ ssh-copy-id hadoop03
3.4 設定hadoop02、hadoop03到其他機器的無金鑰登入
同樣的在hadoop02、hadoop03上生成公鑰和私鑰後,將公鑰分發到三臺機器上。
3.5 在其他兩臺機器上建立存放Hadoop的目錄 並將hadoop01 的Hadoop目錄下所有檔案拷貝到app下
[[email protected] ~]$ mkdir /opt/modules/app
[[email protected] ~]$ mkdir /opt/modules/app
4 格式NameNode
在NameNode機器上執行格式化:
[[email protected] ~]$ /opt/modules/app/hadoop/bin/hdfs namenode –format
注意:
如果需要重新格式化NameNode,需要先將原來NameNode和DataNode下的檔案全部刪除,不然會報錯,NameNode和DataNode所在目錄是在core-site.xml
中hadoop.tmp.dir
、dfs.namenode.name.dir
、dfs.datanode.data.dir
屬性配置的。
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/tmp</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
因為每次格式化,預設是建立一個叢集ID,並寫入NameNode和DataNode的VERSION檔案中(VERSION檔案所在目錄為dfs/name/current 和 dfs/data/current),重新格式化時,預設會生成一個新的叢集ID,如果不刪除原來的目錄,會導致namenode中的VERSION檔案中是新的叢集ID,而DataNode中是舊的叢集ID,不一致時會報錯。
另一種方法是格式化時指定叢集ID引數,指定為舊的叢集ID。
5 啟動叢集
5.1 啟動HDFS(namenode datanode secondarynamenode)
[[email protected] ~]$ start-dfs.sh
enter image description here
5.2 啟動YARN(resourcemanager nodemanager)
[[email protected]]$ start-yarn.sh
5.3 啟動日誌伺服器(historyserver)
因為我們規劃的是在BigData03伺服器上執行MapReduce日誌服務,所以要在BigData03上啟動。
[[email protected] ~]$ mr-jobhistory-daemon.sh start historyserver
5.4 檢視HDFS Web頁面
http://bigdata-senior01.chybinmy.com:50070/
5.5 檢視YARN Web 頁面
http://bigdata-senior02.chybinmy.com:8088/cluster
6 測試Job
我們這裡用hadoop自帶的wordcount例子來在本地模式下測試跑mapreduce。
6.1 準備mapreduce輸入檔案wc.input
[[email protected] ~]$ cat /opt/data/wc.input
hadoop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop
6.2 在HDFS建立輸入目錄input
[[email protected] ~]$ bin/hdfs dfs -mkdir /input
6.3 將wc.input上傳到HDFS
[[email protected] ~]$ bin/hdfs dfs -put /opt/data/wc.input /input/wc.input
6.4 執行hadoop自帶的mapreduce Demo
[[email protected] ~]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input/wc.input /output
enter image description here
6.5 檢視輸出檔案
[[email protected] ~]$ bin/hdfs dfs -ls /output
Found 2 items
-rw-r--r-- 3 hadoop supergroup 0 2016-07-14 16:36 /output/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 60 2016-07-14 16:36 /output/part-r-00000
HDFS (分散式檔案系統)
基本原理 https://www.jianshu.com/p/f8f074ae7839
一、NameNode啟動時如何維護元資料:
1、概念介紹:
Edits檔案:NameNode在本地操作hdfs系統的檔案都會儲存在Edits日誌檔案中。也就是說當檔案系統中的任何元資料產生操作時,都會記錄在Edits日誌檔案中。eg:在HDFS上建立一個檔案,NameNode就會在Edits中插入一條記錄。同樣如果修改或者刪除等操作,也會在Edits日誌檔案中新增一條資料。
FsImage映像檔案:包括資料塊到檔案的對映,檔案的屬性等等,都儲存在一個稱為FsImage的檔案中,這個檔案也是放在NameNode所在的檔案系統中。
2、流程介紹:
①、載入fsimage映像檔案到記憶體
②、載入edits檔案到記憶體
③、在記憶體將fsimage映像檔案和edits檔案進行合併
④、將合併後的檔案寫入到fsimage中
⑤、清空原先edits中的資料,使用一個空的edits檔案進行正常操作
3、流程圖分析:
4、疑問
因為NameNode只有在啟動的階段才合併fsimage和edits,那麼如果執行時間長了,edits檔案可能會越來越大,在下一次啟動NameNode時會花很長的時間,請問能否讓fsimage映像檔案和edits日誌檔案定期合併呢?
答案肯定是可以的,為了解決這個問題我們就要用到Secondary NameNode了,Secondary NameNode主要的作用是什麼呢?他是如何將fsimage和edits進行合併的呢?帶著疑問再次進行分析。
二、Secondary NameNode工作流程:
1、Secondary NameNode和NameNode的區別:
NameNode:
①、儲存檔案的metadata,執行時所有資料都儲存在記憶體中,這個的HDFS可儲存的檔案受限於NameNode的記憶體。
②、NameNode失效則整個HDFS都失效了,所以要保證NameNode的可用性。
Secondary NameNode:
①、定時與NameNode進行同步,定期的將fsimage映像檔案和Edits日誌檔案進行合併,並將合併後的傳入給NameNode,替換其映象,並清空編輯日誌。如果NameNode失效,需要手動的將其設定成主機。
②、Secondary NameNode儲存最新檢查點的目錄和NameNode的目錄結構相同。所以NameNode可以在需要的時候應用Secondary NameNode上的檢查點映象。
2、什麼時候checkpoint
①、連續兩次的檢查點最大時間間隔,預設是3600秒,可以通過配置“fs.checkpoint.period”進行修改
②、Edits日誌檔案的最大值,如果超過這個值就會進行合併即使不到1小時也會進行合併。可以通過“fs.checkpoint.size”來配置,預設是64M;
3、Secondary NameNode的工作流程
①、NameNode通知Secondary NameNode進行checkpoint。
②、Secondary NameNode通知NameNode切換edits日誌檔案,使用一個空的。
③、Secondary NameNode通過Http獲取NmaeNode上的fsimage映像檔案(只在第一次的時候)和切換前的edits日誌檔案。
④、Secondary NameNode在內容中合併fsimage和Edits檔案。
⑤、Secondary NameNode將合併之後的fsimage檔案傳送給NameNode。
⑥、NameNode用Secondary NameNode 傳來的fsImage檔案替換原先的fsImage檔案。
4、流程圖分析:
二、java api操作HDFS
如果是使用maven的話,匯入如下依賴即可,否則需要在解壓好的hadoop資料夾下找到common資料夾和hdfs資料夾下的jar包
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.8.3</version>
</dependency>
可能出現的問題如下:
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=ttc, access=WRITE, inode="/":root:supergroup:drwxr-xr-x
解決辦法
System.setProperty("HADOOP_USER_NAME", "root") ;
要進行操作,主要得先拿到客戶端物件
public class HdfsClient {
Configuration conf = null;
FileSystem fileSystem = null;
@Before
public void init() throws Exception{
conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.47.140:8020");
fileSystem = FileSystem.get(conf);
}
}
解釋:我們的操作目標是HDFS,所以獲取到的fs物件應該是DistributedFileSystem的例項;get方法是從何處判斷具體例項化那種客戶端類呢?
——從conf中的一個引數 fs.defaultFS的配置值判斷;
如果我們的程式碼中沒有指定fs.defaultFS,並且工程classpath下也沒有給定相應的配置,conf中的預設值就來自於hadoop的jar包中的core-default.xml,預設值為: file:///,則獲取的將不是一個DistributedFileSystem的例項,而是一個本地檔案系統的客戶端物件。那麼本地(一般我們使用的就是windows)需要安裝配置hadoop,還要編譯,配置環境變數,會比較麻煩,所以我們連線到linux。
關於conf.set(name,value)是設定配置引數的,也可以在classpath下加入配置檔案hdfs-default.xml進行配置,或者使用jar包中的配置(預設的),優先順序是由高到低。
比如con.set(“dfs.replication”,4),配置檔案中配置的副本為2,包中預設的是3,最後副本數量是4。
1、測試檔案上傳
/**
* 測試上傳
* d:/mylog.log傳到hdfs路徑/mylog.log.copy
* @throws Exception
*/
@Test
public void testUpload() throws Exception{
fileSystem.copyFromLocalFile(new Path("d:/mylog.log"), new Path("/mylog.log.copy"));
fileSystem.close();
}
頁面檢視效果
這裡寫圖片描述
2、測試下載檔案,將剛上傳的/mylog.log.copy下載到本地指定位置
/**
* 測試下載
* 第一個引數表示是否刪除原始檔,即:剪下+貼上
* 最後一個引數表示是否使用本地檔案系統,不使用的話會使用io,如果本地沒配置hadoop的話會出現空指標異常。
* @throws Exception
*/
@Test
public void testdownLoad() throws Exception{
fileSystem.copyToLocalFile(true, new Path("/mylog.log.copy"), new Path("d:/zz.log"),
true);
fileSystem.close();
}
3、獲取配置引數
/**
* 獲取配置引數:獲取的是jar包中配置的,服務端配置的是不起作用的
* 但是可以使用配置檔案或者用cong.set()來指定
* 比如副本數量 dfs.replication,3
* @throws Exception
*/
@Test
public void testConfiguration() throws Exception{
Iterator<Entry<String, String>> it = conf.iterator();
while (it.hasNext()){
Entry<String, String> entry = it.next();
System.out.println(entry.getKey()+","+entry.getValue());
}
fileSystem.close();
}
4、測試建立資料夾,可以建立多層
/**
* 測試建立資料夾 可以是多層
* @throws Exception
*/
@Test
public void testMkdir() throws Exception{
boolean b = fileSystem.mkdirs(new Path("/djhot/cls"));
System.out.println("資料夾是否建立成功:" + b);
fileSystem.close();
}
5、測試刪除檔案或資料夾
/**
* 測試刪除資料夾或檔案,第二個引數用true則表示遞迴刪除
* @throws Exception
*/
@Test
public void testDelete() throws Exception{
boolean b = fileSystem.delete(new Path("/djhot"),true);
System.out.println("資料夾是否刪除:" + b);
boolean c = fileSystem.delete(new Path("/cenos-6.5-hadoop-2.6.4.tar.gz"),true);
System.out.println("檔案是否刪除:" + c);
fileSystem.close();
}
5、列出所有檔案以及相關資訊
:/wordcount/output/a.txt,/wordcount/output/b.txt,/wordcount/input/a.txt,/wordcount/input/b.txt,
/**
* 列出指定資料夾下的所有檔案,第二個引數true表示遞迴列出
* 每次拿到的只有一個檔案,如果不使用迭代器一次拿太多記憶體吃不消
* @throws Exception
*/
@Test
public void testListfiles() throws Exception{
RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(new Path("/wordcount"), true);//true表示遞迴
while(files.hasNext()){
LocatedFileStatus fileStatus = files.next();
System.out.println("blockSize"+fileStatus.getBlockSize());
System.out.println("owner:"+fileStatus.getOwner());
System.out.println("replication:"+fileStatus.getReplication());
//檔案路徑
System.out.println("path:"+fileStatus.getPath());
//檔名
System.out.println("name:"+fileStatus.getPath().getName());
//關於block塊的一些資訊
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for (BlockLocation block : blockLocations) {
System.out.println("塊大小:"+block.getLength());
System.out.println("偏移量:"+block.getOffset());
String[] hosts = block.getHosts();
for (String host : hosts) {
System.out.println("所在datanode:"+host);
}
}
System.out.println("------------");
}
fileSystem.close();
}
輸出:
blockSize134217728
owner:root
replication:2
path:hdfs://192.168.25.127:9000/wordcount/input/a.txt
name:a.txt
塊大小:71
偏移量:0
所在datanode:mini2
所在datanode:mini3
------------
blockSize134217728
owner:root
replication:2
path:hdfs://192.168.25.127:9000/wordcount/input/b.tx
name:b.tx
塊大小:71
偏移量:0
所在datanode:mini2
所在datanode:mini3
------------
blockSize134217728
owner:root
replication:2
path:hdfs://192.168.25.127:9000/wordcount/output/_SUCCESS
name:_SUCCESS
------------
blockSize134217728
owner:root
replication:2
path:hdfs://192.168.25.127:9000/wordcount/output/part-r-00000
name:part-r-00000
塊大小:75
偏移量:0
所在datanode:mini2
所在datanode:mini3
------------
6、列出指定目錄下的檔案或資料夾,不會遞迴
/**
* 列出指定目錄下的資料夾或檔案 並不會遞迴
* @throws Exception
*/
@Test
public void testListStatus() throws Exception{
FileStatus[] listStatus = fileSystem.listStatus(new Path("/wordcount"));
for (FileStatus fileStatus : listStatus) {
System.out.println("path:"+fileStatus.getPath());
System.out.println("name:"+fileStatus.getPath().getName());
}
System.out.println("---------------------");
FileStatus[] listStatus2 = fileSystem.listStatus(new Path("/wordcount/input"));
for (FileStatus fileStatus : listStatus2) {
System.out.println("path:"+fileStatus.getPath());
System.out.println("name:"+fileStatus.getPath().getName());
}
}
輸出
path:hdfs://192.168.25.127:9000/wordcount/input
name:input
path:hdfs://192.168.25.127:9000/wordcount/output
name:output
---------------------
path:hdfs://192.168.25.127:9000/wordcount/input/a.txt
name:a.txt
path:hdfs://192.168.25.127:9000/wordcount/input/b.tx
name:b.tx
7 、使用流進行檔案讀寫
/**
* 用流的方式來操作hdfs上的檔案,可以實現讀取指定偏移量範圍的資料
* @author 12706
*
*/
public class HdfsStreamAccess {
Configuration conf=null;
FileSystem fs=null;
@Before
public void init() throws Exception{
conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.25.127:9000");
fs = FileSystem.get(conf);
}
/**
* 通過流,將本地檔案D:/liushishi.love寫到hdfs下的/liushishi.love
* @throws Exception
*/
@Test
public void testUpload() throws Exception{
FSDataOutputStream outputStream = fs.create(new Path("/liushishi.love"), true);//有就覆蓋
FileInputStream inputStream = new FileInputStream("D:/liushishi.love");
IOUtils.copy(inputStream, outputStream);
}
/**
* 通過流,將hdfs下的/liushishi.love檔案,寫到本地檔案D:/liushishi.love2
* @throws Exception
*/
@Test
public void testDownload() throws Exception{
FSDataInputStream inputStream = fs.open(new Path("/liushishi.love"));
FileOutputStream outputStream = new FileOutputStream("D:/liushishi.love2");
IOUtils.copy(inputStream, outputStream);
}
/**
* 指定位置開始寫
* @throws Exception
*/
@Test
public void testRandomAccess() throws Exception{
FSDataInputStream inputStream = fs.open(new Path("/liushishi.love"));
//FileInoutStream是沒有這個方法的,定位到第12個位元組處
inputStream.seek(12);
FileOutputStream outputStream = new FileOutputStream("D:/liushishi.love2");
//從第12個位元組寫到檔案末
IOUtils.copy(inputStream, outputStream);
}
/**
* 將hdfs指定檔案內容輸出到控制檯
* @throws Exception
*/
@Test
public void testCat() throws Exception{
FSDataInputStream inputStream = fs.open(new Path("/liushishi.love"));
IOUtils.copy(inputStream, System.out);
}
三、shell命令操作hdfs
1、檔案上傳 -put
[[email protected] ~]# echo duanchangrenzaitianya > cangmumayi.avi
//將cangmumayi.avi上傳到hdfs檔案系統的根目錄下
[[email protected] ~]# hadoop fs -put cangmumayi.avi /
hadoop是表示hadoop操作,fs表示hdfs,後面與linux命令差不多,會多出”-“。
注:上傳的時候會根據配置
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
來備份2份,存放在指定的工作目錄下/root/hadoop/hdpdata(名稱會變,藏的也很深)
<property>
指定進行工作的資料目錄
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/hdpdata</value>
</property>
比如我這裡是三臺進行叢集,其中兩個是datanode,那麼在這兩臺都進行了備份,如果是三臺datanode,那麼其中有兩臺備份另外一臺沒有。
可以去頁面檢視
這裡寫圖片描述
2、下載 -get
[[email protected] ~]# rm -r cangmumayi.avi
rm:是否刪除普通檔案 "cangmumayi.avi"?yes
[[email protected] ~]# ll
總用量 60
-rw-------. 1 root root 1131 9月 6 19:41 anaconda-ks.cfg
drwxr-xr-x. 4 root root 4096 9月 30 21:55 apps
drwxr-xr-x. 3 root root 4096 10月 1 19:29 hadoop
-rw-r--r--. 1 root root 12526 9月 6 19:41 install.log
-rw-r--r--. 1 root root 3482 9月 6 19:41 install.log.syslog
drwxr-xr-x. 2 root root 4096 9月 12 21:06 mini1
drwxr-xr-x. 3 root root 4096 9月 24 06:26 zkdata
-rw-r--r--. 1 root root 19113 9月 23 18:33 zookeeper.out
[[email protected] ~]# hadoop fs -get /cangmumayi.avi
[[email protected] ~]# ll
總用量 64
-rw-------. 1 root root 1131 9月 6 19:41 anaconda-ks.cfg
drwxr-xr-x. 4 root root 4096 9月 30 21:55 apps
-rw-r--r--. 1 root root 22 10月 3 21:21 cangmumayi.avi
drwxr-xr-x. 3 root root 4096 10月 1 19:29 hadoop
-rw-r--r--. 1 root root 12526 9月 6 19:41 install.log
-rw-r--r--. 1 root root 3482 9月 6 19:41 install.log.syslog
drwxr-xr-x. 2 root root 4096 9月 12 21:06 mini1
drwxr-xr-x. 3 root root 4096 9月 24 06:26 zkdata
-rw-r--r--. 1 root root 19113 9月 23 18:33 zookeeper.out
3、檢視檔案內容 -cat
[[email protected] ~]# hadoop fs -cat /cangmumayi.avi
duanchangrenzaitianya
注:(1)HDFS中的檔案在物理上是分塊儲存(block),塊的大小可以通過配置引數( dfs.blocksize)來規定,預設大小在hadoop2.x版本中是128M,老版本中是64M。
比如:我上傳了一個hadoop(>128M)到hdfs中,假設有三個datanode,那麼檔案會切分為2個檔案,存到其中兩個hadoop的工作的資料目錄中,假設編號分別為100026,100027,由於備份是2,那麼同時第三個的工作資料目錄中會存在100026,100027兩個檔案。但是下載的時候會自動給我們拼出來而不用我們收到去拼完整。
4、檢視目錄資訊 -ls
[[email protected] ~]# hadoop fs -ls /
-rw-r--r-- 2 root supergroup 22 2017-10-03 21:12 /cangmumayi.avi
5、建立資料夾 -mkdir
[[email protected]~]# hadoop fs -mkdir -p /wordcount/input(-p表示建立多級目錄),頁面檢視可以看到多了個資料夾
6、從本地剪下到hdfs -moveFromLocal
[[email protected] ~]# hadoop fs -moveFromLocal a.txt /
[[email protected] ~]# hadoop fs -ls /
-rwxrwxrwx 3 root supergroup 85 2017-10-02 19:45 /a.txt
-rw-r--r-- 2 root supergroup 22 2017-10-03 21:12 /cangmumayi.avi
7、追加一個檔案內容到已經存在的檔案末尾 -appendToFile
[[email protected] ~]# echo xxxxoooooxxoo > xxoo.txt
[[email protected] ~]# hadoop fs -appendToFile xxoo.txt /a.txt
[[email protected] ~]# hadoop fs -cat /a.txt
xiaoyu is a god
xiaoyu is beautiful
xioayu is my zhinv
xiaonv is smart
xxxxoooooxxoo
8、改許可權和改組 -chgrp,-chmod,-chown
[[email protected] ~]# hadoop fs -chmod 777 /a.txt
[[email protected] ~]# hadoop fs -ls /
-rwxrwxrwx 2 root supergroup 85 2017-10-02 19:45 /a.txt
-rw-r--r-- 2 root supergroup 7 2017-10-01 20:22 /canglaoshi_wuma.avi
drwx------ - root supergroup 0 2017-10-01 23:36 /tmp
drwxr-xr-x - root supergroup 0 2017-10-02 19:31 /wordcount
[[email protected] ~]# hadoop fs -chown angelababy:mygirls /canglaoshi_wuma.avi
[[email protected] ~]# hadoop fs -ls /
-rwxrwxrwx 2 root supergroup 85 2017-10-02 19:45 /a.txt
-rw-r--r-- 2 angelababy mygirls 7 2017-10-01 20:22 /canglaoshi_wuma.avi
drwx------ - root supergroup 0 2017-10-01 23:36 /tmp
drwxr-xr-x - root supergroup 0 2017-10-02 19:31 /wordcount
hdfs弱的許可權控制不會管許可權是否合法的
9、合併下載多個檔案 -getmerge,/wordcount/input資料夾下有a.txt和b.txt檔案
[[email protected] ~]# hadoop fs -getmerge '/wordcount/input/*.*' merg.file
[[email protected] ~]# ll
總用量 17352
-rw-------. 1 root root 1131 9月 12 03:59 anaconda-ks.cfg
drwxr-xr-x. 4 root root 4096 9月 30 21:55 apps
-rw-r--r--. 1 root root 71 10月 1 21:01 b.tx
-rw-r--r--. 1 root root 7 10月 1 20:20 canglaoshi_wuma.avi
drwxr-xr-x. 3 root root 4096 10月 1 19:26 hadoop
-rw-r--r--. 1 root root 12526 9月 12 03:59 install.log
-rw-r--r--. 1 root root 3482 9月 12 03:59 install.log.syslog
-rw-r--r--. 1 root root 142 10月 2 19:57 merg.file
-rw-r--r--. 1 root root 14 10月 2 19:45 xxoo.txt
drwxr-xr-x. 3 root root 4096 9月 12 19:31 zkdata
-rw-r--r--. 1 root root 17699306 6月 20 15:55 zookeeper-3.4.6.tar.gz
-rw-r--r--. 1 root root 11958 9月 23 18:33 zookeeper.out
10、統計資料夾的大小資訊 -du
[[email protected] ~]# du -sh * linxu命令,為了形成與hadoopshell操作的對比
4.0K anaconda-ks.cfg
266M apps
4.0K b.tx
4.0K canglaoshi_wuma.avi
16M hadoop
16K install.log
4.0K install.log.syslog
4.0K merg.file
4.0K xxoo.txt
152K zkdata
17M zookeeper-3.4.6.tar.gz
12K zookeeper.out
[[email protected] ~]# hadoop fs -du -s -h hdfs://mini1:9000/*
85 hdfs://mini1:9000/a.txt
7 hdfs://mini1:9000/canglaoshi_wuma.avi
22 hdfs://mini1:9000/cangmumayi.avi
13.5 M hdfs://mini1:9000/tmp
217 hdfs://mini1:9000/wordcount
hadoop fs -du -s /*這樣寫會出現bug,出現的是linux下的檔案大小
11、設定副本的數量 -setrep
[[email protected] ~]# hadoop fs -setrep 3 /a.txt
Replication 3 set: /a.txt
12、從本地檔案系統中拷貝檔案到hdfs路徑去 -copyFromLocal
hadoop fs -copyFromLocal a.txt /wordcount
13、從hdfs拷貝到本地 -copyToLocal
14、從hdfs的一個路徑拷貝hdfs的另一個路徑 -cp
hadoop fs -cp /wordcount/a.txt /bbb/b.txt
15、在hdfs目錄中移動檔案 -mv
hadoop fs -mv /wordcount/a.txt /
16、刪除檔案或者資料夾 -rm
hadoop fs -rm -r /aaa/a.txt
17、統計檔案系統的可用空間資訊 -df
hadoop fs -df -h /
能看出hadoop的shell操作與linux命令大部分都是一樣的。
而對於操作是否成功很多都是可以直接在頁面看到。