1. 程式人生 > >大資料之hadoop【hdfs】

大資料之hadoop【hdfs】

目錄

    1、HDFS體系結構
    2、HDFS Shell操作
    3、HDFS Java API
    4、HDFS和RPC
    5、HDFS High Availability
    6、HDFS資料回收和簡單運維

==============================================================

Hadoop
HDFS
Namenode
管理datanode,
接收client的操作
Datanode
只負責儲存資料
Yarn
MapReduce
…storm spark flink
ResourceManager
從整體上對資源的一個管理和排程
NodeManager
具體的管理和排程

=================================

HDFS

HDFS特點
    分散式
    資料量越來越多,在一個作業系統管轄的範圍存不下了,那麼就分配到更多的作業系統管理的磁碟中,但是不方便管理和維護,因此迫切需要一種系統來管理多臺機器上的檔案,這就是分散式檔案管理系統 。
    高可用
        是一種允許檔案通過網路在多臺主機上分享的檔案系統,可讓多機器上的多使用者分享檔案和儲存空間。
    通透性
        實際上是通過網路來訪問檔案的動作,由程式與使用者看來,就像是訪問本地的磁碟一般。
    容錯
        即使系統中有某些節點離線,整體來說系統仍然可以持續運作而不會有資料損失。
        分散式檔案管理系統很多,hdfs只是其中一種,不合適小檔案。
java中操作大檔案的一個包:java.nio包

====================================================

NameNode
是整個檔案系統的管理節點。它維護著整個檔案系統的檔案目錄樹,檔案/目錄的
元資訊和每個檔案對應的資料塊列表。接收使用者的操作請求。
檔案包括:
1)fsimage:元資料映象檔案。儲存某一時段NameNode記憶體元資料資訊。
2)edits:操作日誌檔案。
3)fstime:儲存最近一次checkpoint的時間
檢視fsimage元資料資訊可以通過命令將其轉化為普通xml檔案來進行檢視
bin/hdfs oiv -p XML -i inputfile[具體的檔案路徑] -o outputfile
eg.
[

[email protected] current]# pwd
/opt/hadoop-repo/name/current
current]# hdfs oiv -p XML -i fsimage_0000000000000000116 -o fsimage.xml
檢視edits操作日誌
bin/hdfs oev -p XML -i inputfile[具體的檔案路徑] -o outputfile
eg.
[[email protected] current]# pwd
/opt/hadoop-repo/name/current
current]# hdfs oiv -p XML -i edits_inprogress_0000000000000000119 -o edits.xml
DateNode
說明:datanode中的VERSION中的clusterID必須要和namenode中的VERSION中的clusterID保持一致。
不一致的原因:多次格式化造成(沒有清空 name|data|secondary|tmp目錄中的資料)
提供真實檔案資料的儲存服務。
檔案塊(block):最基本的儲存單位。對於檔案內容而言,一個檔案的長度大小是size,那麼從檔案的0偏移開始,按照固定的大小,順序對檔案進行劃分並編號,劃分好的每一個塊稱一個Block。HDFS預設Block大小是128MB,以一個256MB檔案,共有256/128=2個Block。
不同於普通檔案系統的是,HDFS中,如果一個檔案小於一個數據塊的大小,並不佔用整個資料塊儲存空間
Replication。多複本。預設是三個。

====================================================
HDFS shell
data]# hdfs dfs -appendToFile append.txt /hello 向/hello中追加內容append.txt
data]# hdfs dfs -cp /hello /hello1 將/hello拷貝到/hello1
HDFS JAVA

public class HDFStest {
    /*列出目錄的內容 listStatus
      讀取檔案 open
      建立目 mkdirs
      建立檔案 create
      顯示檔案儲存位置getFileBlockLocations
     刪除檔案或目錄 delete
    */
    //Permission    Owner   Group   Size    Replication Block Size  Name
    FileSystem fileSystem;
    Configuration configuration;
    @Before
    public  void setUp() throws Exception{
        URI uri=new URI("hdfs://master:9000/");
        configuration=new Configuration();
        fileSystem=FileSystem.get(uri,configuration);
//        System.out.println(fileSystem);
    }
    //獲取檔案列表狀態
    @Test
    public  void  testListStatus()throws IOException{
//        根路徑
        Path path=new Path("/");
        FileStatus[] fileStatuses = fileSystem.listStatus(path);
        for (FileStatus f: fileStatuses) {
            FsPermission permission = f.getPermission();
            String fp_prefix = "-";
            if (f.isDirectory()){
                fp_prefix = "d";
            }
            FsAction userAction=permission.getUserAction();
            FsAction groupAction = permission.getGroupAction();
            FsAction otherAction = permission.getOtherAction();
            String acl = fp_prefix+userAction.SYMBOL+groupAction.SYMBOL+otherAction.SYMBOL;
            String owner = f.getOwner();
            String group= f.getGroup();
            long size=f.getLen();
            short replication =f.getReplication();
            long blockSize = f.getBlockSize();
            String name = f.getPath().getName();
            String mTime = new SimpleDateFormat("yyyy-MM-dd hh:mm").format(new Date(f.getModificationTime()));
            System.out.println(acl + " " + replication + " " + owner + " " +
                    group + " " + size + " " + mTime + " " + name);
        }
    }
    //讀取檔案 open
    @Test
    public void testRead() throws IOException {
        Path path = new Path("/hello");
        FSDataInputStream fis = fileSystem.open(path);
//        BufferedReader br=new BufferedReader(new InputStreamReader(fis));
//        String  line=null;
//        while ((line = br.readLine())!=null)
//        {
//            System.out.println(line);
//        }
//        br.close();
//        第二種讀取方法
        IOUtils.copyBytes(fis,System.out,1024,false);
        IOUtils.closeStream(fis);
    }
//   建立目錄 mkdirs
     @Test
    public void testMkdir() throws IOException {
         Path path = new Path("/mutil-dir");
         boolean ret = fileSystem.mkdirs(path);
         Assert.assertEquals(true,ret);

     }
//     建立檔案 create
    @Test
    public void testCreateFile() throws IOException {
        Path path = new Path("/mutil-dir1/readme.txt");
//        boolean ret = fileSystem.createNewFile(path);
//        Assert.assertEquals(true,ret);
        FSDataOutputStream fos = fileSystem.create(path);
        byte[] bytes= "你好三毛".getBytes();
        fos.write(bytes);
        fos.close();
        //推薦使用第二種
    }
    //顯示檔案儲存位置 getFileBlockLocations
    @Test
    public void testLocation() throws IOException {
        Path path = new Path("/mutil-dir1/readme.txt");
        FileStatus fs=fileSystem.getFileStatus(path);
        long len = fs.getLen();
        BlockLocation[] locations = fileSystem.getFileBlockLocations(path,0,len);
        for (BlockLocation location: locations) {
            String[] hosts = location.getHosts();
            String[] names = location.getNames();
            long length = location.getLength();
            System.out.println(Arrays.toString(hosts));
            System.out.println(Arrays.toString(names));
            System.out.println("length "+ length);
        }
    }
    //刪除檔案或目錄
    @Test
    public void testDelete() throws IOException {
        Path path = new Path("/mutil-dir1/");
        boolean ret = fileSystem.delete(path,true);
        Assert.assertEquals(true,ret);
    }

=====================================================

HDFS和RPC

Hadoop的整個體系結構就是構建在RPC之上的(org.apache.hadoop.ipc)。
RPC(Remote Procedure Call)——遠端過程呼叫協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為了通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得包括網路分散式多程式在內的應用程式更加容易。
RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,客戶機呼叫程序傳送一個帶引數的呼叫資訊到服務程序,然後等待響應資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊到達為止。當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下一個呼叫資訊,最後,客戶端呼叫程序接收答覆資訊,獲取程序結果,最後呼叫執行。

這裡寫圖片描述

RPC程式碼演示

服務介面

package com.sanmao.hadoop_02.rpc;

import org.apache.hadoop.ipc.VersionedProtocol;


//要繼承VersionedProtocol 這個通訊協議
public interface IHelloService extends VersionedProtocol{
    long versionID=123456789L;
    public  String sayHello(String name);
    public String heartBeat(String status);
}

具體服務類

package com.sanmao.hadoop_02.rpc;

import org.apache.hadoop.ipc.ProtocolSignature;

import java.io.IOException;

/**
 * Created by kkk on 2016/10/21.
 */
public class HelloServiceImpl implements IHelloService{
    public String sayHello(String name) {
        System.out.println("hello 方法被呼叫了");
        return  "hello "+name;
    }

    public String heartBeat(String status) {
        System.out.println("心跳檢測");
        return "心跳響應  "+ status;
    }

    public long getProtocolVersion(String s, long l) throws IOException {
        return IHelloService.versionID;
    }

    public ProtocolSignature getProtocolSignature(String s, long l, int i) throws IOException {
        //新建一個簽名
        return new ProtocolSignature();
    }
}

RPC 伺服器

package com.sanmao.hadoop_02.rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;

public class RPCDriver {
    public static void main(String[] args) throws IOException {
        Configuration configuration = new Configuration();
        RPC.Builder builder = new RPC.Builder(configuration);
        RPC.Server server = builder.setBindAddress("localhost").setPort(8888)
                .setProtocol(IHelloService.class)
                .setInstance(new HelloServiceImpl()).build();
        server.start();
        System.out.println("RPC伺服器開啟");
    }
}

RPC 客戶端

package com.sanmao.hadoop_02.rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

import java.io.IOException;
import java.net.InetSocketAddress;


public class RPCClient {
     /*Class<T> protocol,
        long clientVersion,
        InetSocketAddress addr,
        Configuration conf*/
    //RPC底層採取的就是TPC/IP協議
     public static void main(String[] args) throws IOException, InterruptedException {
         Configuration configuration= new Configuration();
         InetSocketAddress inetSocketAddress=new InetSocketAddress("localhost",8888);
         IHelloService proxy = RPC.getProxy(IHelloService.class, IHelloService.versionID, inetSocketAddress, configuration);
         //SOAP協議
         String result = proxy.sayHello("三毛");
         System.out.println(result);
         while (true){
             String ret = proxy.heartBeat(System.currentTimeMillis() + "");
             System.out.println(ret);
             Thread.sleep(3000);
         }
     }
}

HDFS呼叫之資料儲存讀檔案解析

這裡寫圖片描述

HDFS呼叫之資料儲存寫檔案解析

這裡寫圖片描述
三個關鍵的介面
ClientProtocol
是客戶端(FileSystem)與NameNode通訊的介面。
DatanodeProtocol
是DataNode與NameNode通訊的介面。
NamenodeProtocol
是SecondaryNameNode與NameNode通訊的介面

常見的HDFS運維

    修改回收站清空資料的時間
       在每個節點(不僅僅是主節點)上新增配置 core-site.xml,增加如下內容
       <property>
          <name>fs.trash.interval</name>
          <value>1440</value>
          <description>單位是分鐘</description>
       </property>
    hdfs dfsadmin -safemode leave ——>hdfs離開受保護模式
    檢視磁碟內容
        df -lh /
        檢視具體目錄下面檔案大小
        du -lh --max-depth=1 path
    檢視hdfs
        hdfs dfs -du -lh hdfs_path
        hdfs dfs -df hdfs_path
    檢視磁碟健康狀況
        hdfs fsck -blocks hdfs_path

相關推薦

資料hadoophdfs

目錄 1、HDFS體系結構 2、HDFS Shell操作 3、HDFS Java API 4、HDFS和RPC 5、HDFS High Availability 6、HDFS資料回收和簡單運維 =======

資料Hadoop學習《一》——認識HDFS

title: 大資料之Hadoop學習<一>————認識HDFS date: 2018-11-12 20:31:36 tags: Hadoop categories: 大資料 toc: true 點選檢視我的部落格:Josonlee’s Blog 文

資料hadoop(檔案系統HDFS

一 HDFS概述1.1 概念HDFS,它是一個檔案系統,用於儲存檔案,通過目錄樹來定位檔案;其次,它是分散式的,由很多伺服器聯合起來實現其功能,叢集中的伺服器有各自的角色。HDFS的設計適合一次寫入,多次讀出的場景,且不支援檔案的修改。適合用來做資料分析,並不適合用來做網盤應

資料Hadoop學習(環境配置)——Hadoop偽分散式叢集搭建

title: Hadoop偽分散式叢集搭建 date: 2018-11-14 15:17:20 tags: Hadoop categories: 大資料 點選檢視我的部落格: Josonlee’s Blog 文章目錄 前言準備 偽分

資料Hadoop學習——動手實戰學習MapReduce程式設計例項

文章目錄 一、MapReduce程式設計例項 1.自定義物件序列化 需求分析 報錯:Exception in thread "main" java.lang.IllegalArgumentExcept

資料hadoop / hive / hbase 的區別是什麼?有什麼應用場景?

文章目錄 1. hadoop 2. hive 3. hbase 總結 1. hadoop 它是一個分散式計算+分散式檔案系統,前者其實就是 MapReduce,後者是 HDFS 。後者可以獨立執行,前者可以選擇性使用,也

最詳細的資料Hadoop分散式系統架構解析!沒有之一!

Hadoop 由許多元素構成。其最底部是 Hadoop Distributed File System(HDFS),它儲存 Hadoop 叢集中所有儲存節點上的檔案。HDFS(對於本文)的上一層是MapReduce引擎,該引擎由 JobTrackers 和 TaskTrack

資料hadoop分散式計算框架MapReduce

一、MapReduce構成 MapReduce分為兩部分,即map和reduce。 其中map是入隊(key,value),reduce則是聚合(計算)。 map過程的輸出時reduce過程的輸入。 需要注意的是這裡map中的key是可以重複的,reduce做聚

資料hadoop對比spark------資料儲存

1.Hadoop的資料都是來自於哪裡: 答案:磁碟。 2.map與reduce可以同時執行嗎? 答案:不能,由什麼決定的,shuffle過程決定的。 3.spark為什麼比hadoop要快,sprak儘量的避免從磁碟中進行讀取,以及配置資訊和計算資料,對比這些特性,極

資料Hadoop生態系統概述

一、什麼是大資料        首先,我們來了解一下,什麼是大資料?大資料(BigData)是指無法在一定時間內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率、多樣化的資訊資產。由IBM提出的大資料

資料hadoop 環境搭建從零開始——實戰訓練

        這裡的前提是要先安裝一個乾淨的CentOS系統,我這裡用的是CentOS6.6,安裝教程參考另一篇部落格:https://blog.csdn.net/gaofengyan/article/details/85054337 目錄 ha

資料hadoop機架感知

Hadoop是一個能夠對大量資料進行分散式處理的軟體框架,實現了Google的MapReduce程式設計模型和框架,能夠把應用程式分割成許多的小的工作單元(塊),並把這些單元放到任何叢集節點上執行。在MapReduce中,一個準備提交執行的應用程式稱為“作業(job)”,而從一個作業劃分出得、運行於各個計算節

初探資料Hadoop簡介

一、Hadoop的主要作用         Hadoop主要解決海量資料的儲存和海量資料的分析計算。 二、Hadoop框架技術的組成 1、HDFS:         HDFS是一個檔案系統,用來儲存檔案的

中國綠城資料研發中心offer

綠城總共經過了一次機考,四次面試才拿到了offer。網上投的簡歷,後面打電話邀請我去紫金港校區參加宣講會,【沒去】再後來傳送了一份筆試邀請,其實最開始一直沒重視這個崗位的(畢竟一直追逐的是網際網路公司)後面做線上筆試的時候看到全部是邏輯推力,樹立運算,性格測試。後面就收到了面

資料Hadoop(MapReduce(四))------->企業優化

6.1 MapReduce 跑的慢的原因 Mapreduce 程式效率的瓶頸在於兩點: 1)計算機效能        CPU、記憶體、磁碟健康、網路 2)I/O 操作優化 (1)資料傾斜 (2)map和reduce數設定不合理 (3)reduce等待過久 (4)小檔案過多

資料hadoop面試題4

2.23. 我們開發job時,是否可以去掉reduce階段。可以。設定reduce數為0 即可。2.24. datanode在什麼情況下不會備份datanode在強制關閉或者非正常斷電不會備份。2.25. combiner出現在那個過程出現在map階段的map方法後等。2.

資料hadoop單機版虛擬機器Vmware安裝教程

        為深入學習hadoop,需要在個人電腦中安裝cloudera_centos虛擬機器。本篇文件介紹的就是關於cloudera_centos虛擬機器的安裝教程。(推薦使用virtualbox

資料開發Hadoop篇----hdfs讀寫許可權操作

由於hdfs的結構和linux是差不多的,所以我們在hdfs的讀寫操作上也是會面臨許可權和路徑問題問題,先讓我們來看下這些都是些什麼問題。 這裡我先上傳了一個README.txt的檔案上去,通過hdfs dfs -ls /user/hadoop命令我們已經可以檢視到hdfs上有了這個檔案了

資料開發Hadoop篇----hdfs垃圾回收機制配置

其實要啟動hdfs上的垃圾回收機制只需要配置兩個引數就可以了,也是在core-site.xml上配置就好了,我們先去官網看下這個兩引數的解釋。 官網的解釋是:Number of minutes after which the checkpoint gets deleted. If zero

資料開發Hadoop篇----hdfs讀流程

讀流程所涉及到的有client,NameNode和DataNode這個三個,我們來了解下這三個之間在讀流程裡都是幹什麼的。 1,當我們輸入一條讀入資料的命令的時候,如:hdfs dfs -ls /  或者 hdfs dfs -cat /user/hadoop/xxx時,client就通