HDFS 의 작업 원리

8796 단어 빅 데이터
던 전 수량 에 대한 문제 던 전 수 는 클 라 이언 트 의 인자 dfs. replication 에 의 해 결 정 됩 니 다 (우선 순위: conf. set > 사용자 정의 프로필 > jar 패키지 의 hdfs - default. xml) 1 개요
  • HDFS 클 러 스 터 는 두 가지 역할 로 나 뉜 다. NameNode, DataNode (Secondary Namenode)
  • NameNode 는 전체 파일 시스템 의 메타 데 이 터 를 관리 합 니 다
  • DataNode 는 사용자 의 파일 데이터 블록 관리
  • 파일 은 고정된 크기 (blocksize) 에 따라 여러 조각 으로 자 른 후 여러 대의 datanode 에 분포 식 으로 저 장 됩 니 다
  • 파일 블록 마다 여러 개의 복사 본 을 가지 고 서로 다른 datanode 에 저장 할 수 있 습 니 다
  • Datanode 는 정기 적 으로 Namenode 에 저 장 된 파일 block 정 보 를 보고 하고, namenode 는 파일 의 복사 본 수 를 유지 합 니 다
  • .
  • HDFS 의 내부 작업 체 제 는 클 라 이언 트 에 대해 투명 하 게 유지 하고 클 라 이언 트 가 HDFS 에 접근 하 라 고 요청 하 는 것 은 모두 namenode 에 신청 하여 2. hdfs 파일 설명도
  • 를 작성 하 는 것 이다.
    2. hdfs 파일 설명도 읽 기
    3. namenode 메타 데이터 관리 메커니즘
    4. hdfs 의 자바 클 라 이언 트 단 hdfs dfsadmin - report 인쇄 클 러 스 터 의 상태
    package hadoop.hdfs;
    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.junit.Before; import org.junit.Test;
    import java.io.IOException; import java.net.URI; import java.util.Iterator; import java.util.Map;
    /**
  • @program:bigdata
  • @package:hadoop.hdfs
  • @filename:SimpleHdfsDemo.java
  • @create:2019.09.22.20.19
  • @author:Administrator
  • @descrption. */ public class SimpleHdfsDemo { FileSystem fs=null; Configuration conf=null; @Before public void init() throws Exception {
     conf=new Configuration();
    

  • // conf.set(“fs.defaultFS”,“hdfs://master:9000"); / / 이 방식 은 실행 할 때 사용 자 를 지정 하 는 매개 변 수 를 추가 해 야 합 니 다. - DADOOP USER NAME = hadop fs = FileSystem. get (new URI (")hdfs://192.168.186.5:9000"), conf," hadop ");} / * 업로드 파일 * / @ Test public void testUpload () throws Exception {fs. copyFromLocalFile (new Path ()"D: \ 빅 데이터 \ 빅 데이터 세트 (공유 됨) \ 문서 자료 \ \ day 06 \ \ day 06 \ \ hadoop 2.4.1 클 러 스 터 구축. txt"), new Path ("/ test 1. txt"), fs. close ();} / * 파일 다운로드 * / @ Test public void testDownload () throws IOException {fs. copyToLocalFile ("/ test 1. txt"), new Path ("d: \"), fs. close ();} / 인쇄 매개 변수 * / @ Test public void test Conf (){ Iterator> it = conf.iterator(); while (it.hasNext()){ Map.Entry next = it.next(); System.out.println(next.getKey()+":"+next.getValue()); } } @Test public void testMkdir() throws IOException { boolean mkdirs = fs.mkdirs(new Path("/testMkdir")); System.out.println(mkdirs); fs.close(); } @Test public void testDelete() throws IOException {/ / 두 번 째 인 자 는 boolean delete = fs. delete (new Path ("/ testMkdir"), true 를 재 귀적 으로 삭제 할 지 여 부 를 표시 합 니 다. System. out. println (delete);} / * 재 귀적 으로 데 이 터 를 볼 때 * 데이터 양 이 많 을 때 되 돌아 오 는 것 은 교체 기 입 니 다. 교체 기 는 데 이 터 를 저장 하지 않 기 때 문 입 니 다 * / @ Test public void testLs () throws IOException {RemoteIterator ls = fs. listFiles (new Path ("/"), true); while(ls.hasNext()){ LocatedFileStatus next = ls.next(); System.out.println(“blocksize”+next.getBlockSize()); System.out.println(“owner”+next.getOwner()); System.out.println(“replication”+next.getReplication()); System.out.println(“Permission”+next.getPermission()); System.out.println(“name”+next.getPath().getName()); System. out. println ("--- --- ---"); / * 파일 의 블록 위치 정보 * / BlockLocation [] bl = next. getBlockLocations (); for (BlockLocation b: bl) {String [] hosts = b. getHosts (); b. getOffset ();}} / * 반환 수 근거 * / @ Test public void testLs 2 () throws IOException {FileStatus [] f = fs. list Status (new Path ("/"); for (FileStatus file: f){ System.out.println(file.getPath().getName()); } } }
    2. 흐 르 는 방식 으로 package hadop. hdfs;
    import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.Before; import org.junit.Test;
    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI;
    /**
  • @program:bigdata
  • @package:hadoop.hdfs
  • @filename:HdfsStreamAccess.java
  • @create:2019.09.23.09.21
  • @author:Administrator
  • @ descrption. hdfs 에 있 는 파일 을 흐 르 는 방식 으로 조작 하면 지 정 된 오프셋 데이터 * / public class HdfsStreamAccess {FileSystem fs = null; Configuration conf = null; @ Before public void init () throws Exception {
     conf=new Configuration();
     fs=FileSystem.get(new URI("hdfs://192.168.186.5:9000"),conf,"hadoop");
    
    } / *
  • 흐 르 는 방식 으로 데이터 업로드
  • * / @ Test public void testUpload () throws IOException {FSDataOutputStream ot = fs. create (new Path ("/ testStream. txt"); FileInputStream is = new FileInputStream ("D: \ 빅 데이터 \ 빅 데이터 세트 (공유) \ 문서 자료 \ day 07 \ day 07 \ day 06 의 문제 요약. txt"); IOUtils. copy (is, ot);}
  • /*
  • 흐 르 는 방식 으로 hdfs 의 데 이 터 를 가 져 옵 니 다
  • / @Test public void testDownload() throws IOException { FSDataInputStream in = fs.open(new Path("/testStream.txt")); FileOutputStream out = new FileOutputStream(“d:\1.txt”); IOUtils.copy(in,out); } /
  • 흐 르 는 방식 으로 지정 한 직접 크기 hdfs 의 데 이 터 를 가 져 옵 니 다
  • */ @Test public void testRandomAccess() throws IOException { FSDataInputStream in = fs.open(new Path("/testStream.txt")); in.seek(12); FileOutputStream out = new FileOutputStream(“d:\1.txt.rang”); IOUtils.copy(in,out); } }


  • 5. 정시 채집 일 스 크 립 트 \ #! / bin / bash
    #set java env export JAVA_HOME=/home/hadoop/app/jdk1.7.0_51 export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = . : {JAVA_HOME}/jre export CLASSPATH=.: JAVAH​OME/jreexportCLASSPATH=.:{JAVA_HOME}/lib: J R E H O M E / l i b e x p o r t P A T H = {JRE_HOME}/lib export PATH= JREH​OME/libexportPATH={JAVA_HOME}/bin:$PATH
    #set hadoop env export HADOOP_HOME=/home/hadoop/app/hadoop-2.6.4 export PATH= H A D O O P H O M E / b i n : {HADOOP_HOME}/bin: HADOOPH​OME/bin:{HADOOP_HOME}/sbin:$PATH
    \ # 버 전 1 의 문제: \ # Hadoop 클 러 스 터 에 올 렸 지만 원본 파일 은 그대로 있 습 니 다. 어떻게 처리 합 니까? \ # 로그 파일 의 이름 은 모두 xxxx. log 1 입 니 다. 파일 을 다시 업로드 할 때 hdfs 에 이미 존재 하기 때문에 오 류 를 보고 합 니 다. 어떻게 처리 합 니까?
    \ # 버 전 1 문 제 를 어떻게 해결 합 니까?
    1. 먼저 업로드 할 파일 을 업로드 할 디 렉 터 리 로 이동
    2. 파일 을 업로드 할 디 렉 터 리 로 이동 할 때 파일 이름 을 일정한 형식 으로 바 꿉 니 다.
    /export/software/hadoop.log1 /export/data/click_log/xxxxx_click_log_{date}
    \ # 로그 파일 에 저 장 된 디 렉 터 리 log src dir = / home / hadop / logs / log /
    \ # 업로드 할 파일 에 저 장 된 디 렉 터 리 log toupload dir = / home / hadop / logs / toupload /
    \ # 로그 파일 이 hdfs 에 업로드 되 는 루트 hdfs root dir = / data / clickLog / 20151226 /
    \ # 환경 변수 정 보 를 출력 echo "envs: hadop home: $HADOOP HOME"
    \ # 로그 파일 의 디 렉 터 리 를 읽 고 업로드 할 파일 이 있 는 지 판단 합 니 다 echo "log src dir:" $log src dir ls l o g s r c d i r 8739 ° w h i l e r e a d f i l e N a m e d o i f ["log src dir | while read fileName do if [[" logs rcd ir 8739 ° whilereadfileNamedoif [[["fileName" = access. log. *]; then \ # if ["access. log" = "$fileName"]; then date = date +%Y_%m_%d_%H_%M_%S \ # 업로드 할 디 렉 터 리 로 파일 을 이동 하고 이름 을 바 꿉 니 다 \ # 인쇄 정보 echo "moving l o g s r c i r log src dir logs rcd irfileName to KaTeX parse error: expected group after '' at position 33:.. xxxx click log̲fileName”$date" mv l o g s r c d i r log_src_dir logs​rcd​irfileName KaTeX parse error: Expected group after '_' at position 33: …xxxxx_click_log_̲fileName "$date \ # 업로드 할 파일 path 를 목록 파일 에 기록 합 니 다 willDoing echo KaTeX parse error: Expected group after '' at position 33:... xxxx click log̲fileName"$date >> l o g t o u p l o a d d i r " w i l l D o i n g . " log_toupload_dir"willDoing." logt​ouploadd​ir"willDoing."date fi
    done \ # 목록 파일 을 찾 으 면 willDoing ls KaTeX parse error: 예상 되 는 'EOF', got '\ #' 위치 89:... read line do \ #̲인쇄 정보 echo "tou... line \ # 업로드 대기 파일 목록 willDoing 을 willDoing COPY mv l o g t o u p l o a d i r log toupload dir logt oupload irline l o g t o u p l o a d i r log toupload dir logt oupload irline" COPY "\ # 목록 파일 읽 기 willDoing COPY 내용 (업로드 대기 파일 이름 하나)이 곳 의 line 은 목록 에 업로드 할 파일 의 path cat l o g t o u p l o a d i r log toupload dir logt oupload irline "COPY" | while read line do \ # 인쇄 정보 echo "puting... l i n e t o h d f s p a t h.... line to hdfs path.... linetohdfspath.... hdfs root dir" hadoop fs -put $line $hdfs_root_dir done mv l o g t o u p l o a d d i r log_toupload_dir logt​ouploadd​irline"COPY" l o g t o u p l o a d d i r log_toupload_dir logt​ouploadd​irline"DONE" done

    좋은 웹페이지 즐겨찾기