IT/[ Bigdata ]

[ Bigdata ] 01. 하둡의 HDFS와 MapReduce

kim.svadoz 2020. 8. 10. 13:31
반응형

20-02-17 월

빅데이터는 무엇인가?

  • volume + velocity + variety + veracity + value = "5V"

  • 심야버스노선도

  • 데이터수집 - 데이터저장 - 데이터처리 - 데이터분석 - 분석결과활용

  • flume, sqoop, R, MongoDB

  • namenode(hadoop01)와 secondarynamenode(hadoop02)는 달라야한다.

  • hadoop01(keygen 수행) 비공개키, 나머지 02,03,04는 공개키

  • 따라서 01머신에서만 나머지 머신으로 접속 가능하다.

  • 인코딩 버전확인하기

    su -
    echo $LANG
  • input폴더에 NOTICE.txt 복사 ( hadoop/hadoop01 로 실행 )

    /home/hadoop/hadoop-1.2.1/bin/hadoop fs - copyFromLocal NOTICE.txt /input
  • input폴더에 있는 NOTICE.txt에 wordcount적용

    /bin/hadoop jar hadoop-examples-1.2.1.jar wordcount /input/NOTICE.txt /wordcount_output

HDFS

  • STS에서 hdfsTest 설정

  • output.txt에 write하기

    [haddop@hadoop01 hadoop-1.2.1]$ cd..
    [hadoop@hadoop01 ~]$ ./hadoop-1.2.1/bin/hadoop jar multi-hadoop-examples.jar hdfs.exam.HDFSExam01 output.txt hellohadoop 
    
    => 이 파일에다가 이(hellohadoop) 내용을 써주겠다.
    
    "jar파일 실행시키는 명령어 + jar파일명 + 클래스 + txt파일이름 + 내용"
  • output.txt read하기

    [hadoop@hadoop01 ~]$ ./hadoop-1.2.1/bin/hadoop jar multi-hadoop-examples.jar hdfs.exam.HDFSExam02 output.txt

20-02-19 수

hadoop의 역할은 빅데이터를 저장하고 처리하는 목적이다.

처리방법 : MapReduce

저장방법 : HDFS( hadoop이 갖고 있는 파일시스템 ) - 분산형파일시스템

  • namenode가 마스터PC. 데이터를 요청받으면 데이터노드에 블럭단위로 쪼개서 저장. 어떤블럭이 어떤머신인지 알아야 하기때문에 namenode에서 그 정보들을 가지고 있음.

  • namenode는 datanode에서 주기적으로(default : 1시간) 오는 heartbeat를 전송받으며 관리.

  • 블럭하나에 복제본 3개?!

  • namenode가 문제가 생길 경우를 대비해서 SecondaryNamenode를만들어놓는거다!.

    • checkpoint를 보내서 네임노드가 백업본을 주기적으로 세컨더리노드에 전송
  • cd ~ : home디렉토리(로그인시 첫 실행화면)

  • cd / : root디렉토리로 이동 !

  • cd . : 현재디렉토리

  • cd.. : 상위디렉토리

  • pwd : 현재작업위치가 어딘지 볼 때 확인. Print Woring Directory

  • path를 걸어주기 전까진 shell script를 모두 명시해야한다.

    /home/hadoop/hadopo-1.2.1/bin/hadoop
  • path를 설정해주자~

    cd hadoop-1.2.1/ "path 설정 - [hadoop@hadoop01 hadop-1.2.1]"
    pwd "현재 디렉토리를 확인"
  • bin 폴더를 사용하여 wordcount를 사용해서 input파일과 output파일

    [hadoop@hadoop01 hadop-1.2.1]$ ./bin/hadoop jar hadoop-examples-1.2.1.jar wordcount /input/README.txt /out

    => wordcount + input경로 + output경로

    => HDFS상에 있는 input폴더안에 있는 README 파일을 /out으로 실행시킨다.

  • 파이어폭스 - hadoop01:50070 : 내 HDFS에 있는 폴더리스트

  • !! troubleshooting 하는 방법 !!

    • hadoop-data가 실제 HDFS에 저장되고 처리되는 폴더 위치
    • 1번머신 : home => hadoop => hadoop-data => dfs => name => image : HDFS에 저장하고 있는 이미지파일 ( 권한 확인하기 )
    • 2번머신 : home => hadoop => hadoop-data => dfs => namesecondary => image
      • dfs => data => current => .metadata,
      • hadoop-data => mapred =>
    • ex ) api쓰다가 뭐가 안된다? 그러면 01,02,03,04 머신 가서 hadoop => hadoop-data를 모두 지운다 => namenode 초기화(-format)
  • 폴더 지우기

    ./bin/hadoop fs -rmr /경로
  • editslog : 변경이력

  • fsimage : 메모리에 저장된 메타데이터의 파일 시스템 이미지를 저장한 파일

  • ^^^ 이 두가지를 보조네임노드가 작업한다.

< LINUX 기본 명령어 >

  • ls : 현재 디렉터리의 파일 목록
    • ls /etc/sysconfig : 특정 경로의 파일 목록
    • ls -a : 현재 디렉터리의 (숨김파일포함) 모든 파일 목록
    • ls -l : 현재 디렉토리 목록을 자세히 보여줌
    • ls -al : 숨긴폴더 + 자세히
    • ls *.cfg : 확장자가 cfg인 목록을 보여줌
    • ls -l /etc/sysconfig/a* : 해당 경로의 디렉터리에 있는 목록 중 앞 그자가 'a'인 것의 목록을 자세히 보여줌
  • cd : [Change Directory] 현재 사용자의 홈 디렉터리로 이동
  • rm : [Remove] 파일이나 디렉터리를 삭제. 삭제권한이 있어야 하고 root 사용자는 모든권한이 있으므로 OK. (디폴트는 파일을 삭제하는 기능)
    • -f 라는 옵션을 주면 지울건지 안지울건지 물어보지 않는다.
  • cp : [Copy] 파일이나 디렉터리를 복사 (로컬에서)
    • scp : 원격으로 파일을 복사
    • -r 옵션을 주면 디렉터리를 복사한다.
  • touch : 크기가 0인 새 파일을 생성하거나, 이미 파일이 존재한다면 파일의 최종 수정 시간을 변경
  • mv : [Move] 파일이나 디렉터리의 이름을 변경하거나 다른 디렉터리로 옮길 때 사용
  • mkdir : [Make Directory] 새로운 디렉터리를 생성한다
    • -p 옵션을 주면 계층형의 디렉터리를 생성할 수 있음.
  • rmdir : [Remove Directory] 디렉토리를 삭제한다. 해당 디렉터리의 삭제 권한이 있어야 하며 디렉터리는 비어있어야 한다.
  • head / tail : 작성된 파일의 앞 10행 또는 마지막 10행만 화면에 출력
    • -5라는 옵션을 주면 5행만 출력
  • more : 페이지 단위로 화면에 출력..

< 맵리듀스 >

HDFS에 저장된 파일을 분산 배치 분석을 할 수 있게 도와주는 프레임워크. MongoDB에서도 가능하지만 Hadoop이 성능면에서 우수.

  • datanode에 있는 매퍼와 리듀스를 관리하고 작업을 시키는 게 namenode에 있는 job tracker이다.

  • 주목적이 맵리듀스를 만드는 것이고, 어떻게 방대한 데이터를 처리할까나~

  • mapper와 reducer만 적절하게 만들면 된다~!

  • mapper와 reducer를 동작시킬 수 있는 실행파일(Driver)(Application)을 하나 만들어주어야 한다.

    => 세개를 모두 합친 후 , 어떻게 내식대로 커스터마이징 할 것인가

1. 맵

  • 어떻게 분류할 것인가
  • 입력파일을 한 줄씩 읽어서 데이터를 변형(transformation)

2. 리듀스

  • 어떻게 취합할 것인가

  • 맵의 결과 데이터를 집계(aggregation)

  • 맵메소드의 출력데이터를 기록하고 프레임워크 내부처리에서 sort하고 merge하는 작업 (shuffle) 이후 출력 데이터를 리듀스로 내보내는 작업. => Context 객체

  • 라인 하나에 대한 처리이다~


20-02-20 목

  • STS에서 설정한 mapreduce Driver 실행시키기

    [hadoop@hadoop01 hadoop-1.2.1]
    
    ./bin/hadoop jar /home/hadoop/hadoop-mapred-examples.jar mapred.basic.WordCountDriver /input/README.txt /mywork/mywordcount
    
  • line하나에 map메소드 한번씩 실행된다!

  • && 는 하나만 검사하고 &는 두개다 검사한다.


20-02-21 금

  • HDFS는 눈에 보이는 파일경로가 없다~
  • HDFS는 블록 단위로 쪼개져서 저장이 되기때문에 파일의 형태로 확인을 할 수 가 없음.

- GenericOptionParser

  • PIltering으로 넘긴다.

- MultipleOutputs

한 개의 입력데이터를 이용해서 여러 개의 output을 만들고 싶은 경우 사용

  • Mapper : GenericOptionParser잡업할 때와 동일하게 map메소드를 구성하며 보통 구분할 수 있도록 key에 각 상황별로 문자열만 추가해준다.
  • Reducer : Mapper에서 넘겨준 데이터에서 구분자를 기준으로 분리해서 합산.
    • 필터링하지 않고 다 넘기기 때문에 키 값을 구분하기 위해서 Reducer단에서 up, down, equal식으로 표현
    • setup 메소드 : Reducer객체가 처음 실행될 때 한 번 호출되는 메소드. MultipleOutputs객체를 생성
    • reduce 메소드 : 각각의 상황별로 write가 호출될 수 있도록 처리(up, equal, down)
    • cleanup 메소드 : Reducer작업이 종료될 때 한번 호출되는 메소드. MultipleOutputs객체를 해제(반드시 처리)
  • Driver : MultipleOutputs으로 출력될 결로를 Path에 설정. prefix로 구분문자열을 정의

20-02-24 월

  • eclipse에서 hadoop 해보기
  • hadoop의 hdfs는 외부에서 읽기 권한만 있고, 쓰기 권한은 없다.!
  • hdfs는 hadoop계정에서 하고 mapreduce는 다른계정에서 할 수 있도록 설정하기

image-20200224111256738
image-20200224111316090
image-20200224111330628

기타 에코시스템을 다른 프로그램을 이용해 하둡과 연동하기

MapReduce, HDFS(hadoop) 에 저장

  • SNS : R
  • log : flume
    • 정형화된 데이터가 아니기 때문에 패턴을 써야 한다!!!
  • 크롤링 : R / Spring
  • iot : sqoop
  • DBMS : sqoop
  • MongoDB

< 정규 표현식 >

  1. 자바에만 적용되는게 아니라, 자바스크립트, 파이썬 등 다른 프로그램에서도 같이 적용되는 프레임.
  2. 텍스트안에서 특정 형식의 문자열을 추출하거나 검색할 때 사용하는 특수문자로 만들어진 패턴

1. 자바 API

  1. String클래스의 matches메소드 : 매개변수로 전달한 정규표현식에 일치하는 문자열이 있는지를 boolean으로 리턴
  2. java.util.reges패키지의 클래스들을 활용
    • Pattern클래스 : 패턴을 정의할 때 사용
      • CASE_INSENSITIVE : 대소문자 적용하지 않는다는 의미
    • Matcher클래스 : 패턴과 일치하는 문자열을 관리하는 클래스
      1. find() : 패턴에 만족하는 문자열이 있는지 찾기(true / false 리턴)
      2. start() : 매칭되는 패턴과 일치하는 문자열의 start index
      3. end() : 패턴과 일치하는 문자열의 end index + 1
      4. group() : 패턴과 일치하는 문자열을 리턴(일치하는 문자 추출)

2. Pattern 기호

  1. 기본 기호

    • ^
    • $
    • .
    • |
    • [ ]
    • ( ) : 그룹으로 묶을 경우 사용
    String patternStr = "java";                // 1. 정확하게 일치하는 것
    String patternStr = "^java";         // 2. ^뒤의 문자열로 시작
    String patternStr = "java$";         // 3. $앞의 문자열로 종료
    String patternStr = "^\\$";             // 4. 패턴에서 사용하는 기호는 일반문자열로 인식하지 않는다.
                                        // - 패턴에서 사용되는 기호를 문자열로 인식시키려면\\와 함께 사용
    String patternStr = "\\$$";         // 5. $로 끝나는 문자열인지 검색
    String patternStr = ".";            // 6. . 은글자 하나를 의미
    String patternStr = "....";            // 7. 문자길이가 4
    String patternStr = "\\.";            // 8. .이 포함된 문자열
    String patternStr = "\\..\\.";        // 9. .과 . 사이에 한 글자만 있는 문자열
    
    String patternStr = "a|m|g";        // 10. |는 or을 의미 => a이거나 m이거나 g인 문자
    String patternStr = "[amg]";        // 11. 10번과 동일
    String patternStr = "[amg][ma]";    // 12. 두 글자에 대해서 11번의 조건이 적용 
        => 첫글자가 a,m,g거나 두번째 글자가 m,a인 문자
    String patternStr = "[c-j]";        // 13. 알파벳 c-j사이에 해당하는 문자
    String patternStr = "[C-J]";        // 14. 대문자
    String patternStr = "[C-Jc-j]";        // 15. 대문자 C,J 소문자c에서 j까지 문자
    String patternStr = "[4-8]";        // 16. 숫자 4-8사이에 해당하는 문자
    String patternStr = "[^4-8]";        // 17. ^가 []안에 있으면 부정의 의미.=>숫자 4,5,6,7,8이 아닌 문자
    
    ex1) c~j사이의 영문자가 아닌 것
    String patternStr = "[^c-j]";
    ex2) 영문자와 숫자만 추출
    String patternStr ="[A-Za-z0-9]"; 
    ex3) 영문자와 숫자를 뺀 나머지 문자만 추출
    String patternStr = "[^A-Za-z0-9]";
    ex4) 한글만 추출
    String patternStr = "[가-힣]";
    
    String str = "tomato jaava tomato prog potato";
    String patternStr ="(tom|pot)ato"; //그룹으로 묶는다.
    
    String str = "aaaaa aaabc iiiii iiibc aiabc "; 
    String patternStr = "(a|i){3}bc"; //그룹으로 묶는다.
    
    String str = "adsf111 a1 b5 b555 aaa5 qa5";
    String patternStr = "([a-z][0-9])"; //그룹으로 묶는다.
    
    equalsPattern(str, patternStr);
    
    public static void equalsPattern(String str, String patternStr) {
        //1. 패턴을 인식
        Pattern pattern = Pattern.compile(patternStr);
        //2. 패턴 적용하며 문자열을 관리
        Matcher m = pattern.matcher(str);
        /*System.out.println(m.find());
            System.out.println(m.start());
            System.out.println(m.end());
            System.out.println(m.group());*/
    
        while(m.find()) { // find가 boolean을 리턴하기 때문에 반복작업이 가능
            System.out.println(m.group());
            System.out.println(m.start()+":"+(m.end()-1));
        }
    }
  1. 수량 관련 기호

    • * : * 앞의 패턴문자가 0이거나 1이거나 여러 개 있거나
    • + : + 앞의 패턴문자가 1이거나 여러개 있거나
    • ? : ? 앞의 패턴문자가 없거나 1이거나
    • .{n} : .은 임의의 한 문자를 의미, n은 글자수를 의미 => 어떤 문자이거나 n개의 문자
    • xxxx{1,3} : 1이상 3이하(x는 패턴을 의미)
    • xxxx{3, } : 3이상
    String str = "jaava programmaingm";
    String str ="-@-ja1- -111aCva--@@-@@@@- 한글 --@@@@-- progra44568EmgFmiJng";
    String str = "a 4 m 7 v 9  amJAVA _java aaaxl  programming and spring , hadoop";
    String patternStr = ".*";        // 모든 것
    String patternStr = "-@+-";        // -- 사이에 @이 1개 있거낭 여러개 있거나
    String patternStr = "-@?-";        // -- 사이에 @이 없거나 1개 있거나
    String patternStr = "[^ ]";        // 공백이 아닌 문지
    String patternStr = ".{5}";        // 다섯 글자식 끊어서 출력
    String patternStr = "[amv]{1,3}"; // a,m,v가 1회,2회,3회인 문자, a, m, v, aa, am, av, mv,....
    String patternStr = "[a-z]{3,}"; // a-z까지 3글자 이상의 문자
    String patternStr = "\\W";         // 대문자, 소문자, 숫자 뺀 모두
    String patternStr = "\\w";         // 대문자, 소문자, 숫자 모두
    String patternStr = "\\d";         // 숫자만
    String patternStr = "\\D";         // 숫자를 뺀 나머지
    System.out.println(Pattern.matches("[0-9]+", "1234java"));  //f
    System.out.println(Pattern.matches("[0-9]+", "java"));        //f
    System.out.println(Pattern.matches("[0-9]+", "1234"));        //t
    System.out.println(Pattern.matches("[0-9]+", "1"));            //t
    System.out.println(Pattern.matches("[0-9]+", " "));            //f
    
    System.out.println(Pattern.matches("[0-9]?", "1234java"));  //f
    System.out.println(Pattern.matches("[0-9]?", "java"));        //f
    System.out.println(Pattern.matches("[0-9]?", "1234"));        //f
    System.out.println(Pattern.matches("[0-9]?", "1"));            //t
    System.out.println(Pattern.matches("[0-9]?", " "));            //f
반응형