1. 程式人生 > >Hadoop叢集環境搭建 與Hdfs

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.xmlhadoop.tmp.dirdfs.namenode.name.dirdfs.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命令大部分都是一樣的。
而對於操作是否成功很多都是可以直接在頁面看到。