RDBMS)관계형 데이터베이스다. 그래서 관계가 깨지면 의미가 없어지므로 데이터 무결성이 중요하고, 무결성을 위해서 스키마로 데이터 입력을 거르는 것이다. 하지만 이렇게 하면 입력되지 않는 데이터가 발생한다. 대표적 문법으로 sql
NRDBMS)비관계형 데이터베이스다. 위와 다르게 스키마가 없다. 예를 들어서, char의 길이를 10까지 할당할 수 있을 때 길이11의 char가 들어오면 할당 가능 길이를 11로 동적으로 바꿔준다(?). 하지만, 기존 데이터에서 수정을 하려면 모든 데이터를 다시 만들어야해서 (?) 사용성이 떨어진다. 대표적 문법으로 Nosql(Not only sql)
하둡은 NRDBMS를 기반으로 한다.
텍스트 데이터 위주였던 과거와 달리, 이미지와 영상과 같은 비정형 데이터들이 급격히 증가하기 때문에 그것을 처리하는 것이 많이 연구되고 있다.
분산파일시스템
컴퓨터 네트워크를 통해공유하는 여러 호스트 컴퓨터의파일에 접근할 수 있게 하는파일 시스템이다.
네트워크를 통해 접근하는 파일들은 프로그램과 사용자의 하나의 로컬 디스크에 있는 파일처럼 다룰 수 있다.
즉, 서버증설시 스케일아웃이 되는데
스케일아웃은 저렴한 서버를 여러대 쓰기 때문에 비용이 저렴하고, 장애가 생기더라도 전체가 마비되지 않는다.
하지만, 분산해서 처리하기 때문에 관리 편의성이 떨어진다. (병렬적인 처리:웹 앱, 분산처리 등에 쓰임)
스케일업은 하나의 서버를 비싼 것으로 맞춰두고 더 필요하면 더 좋은 하드웨어를 계속 달아가는 것이다. 관리에는 편하지만 비용증가의 부담이 크고 확장에는 한계가 있다. 또한, 일부가 마비되면 전체가 마비될 수 있다.
일괄처리방식(batch),실시간 시스템
일괄처리방식) 일정 기간마다 주기적으로 한꺼번에 업무 처리...Hadoop ..why?)
실시간시스템) 작업 수행이 요청되었을 때, 이를 제한된 시간안에 처리해 결과를 내주는 것
소개
아파치 하둡은 대량의 데이터를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는프리웨어자바 소프트웨어 프레임워크이다. 분산처리 시스템인구글 파일 시스템을 대체할 수 있는 하둡 분산 파일 시스템(HDFS)과 분산처리시스템(MapReduce)를 구현한 것이다.
배경
2006년 야후에서 일하던 더그 커팅이 구글 분산파일시스템에 대응하는 무료 라이브러리를 개발하고자 했고, 개발된 이후 아파치 재단으로 넘어가 관리되는 중이다.
구조
HDFS와 맵리듀스
+namenode~datanode부분 글씨 너무 작아서...
->통신으로 3초마다 heartbeat 체크. 에러나면 그 노드 버리고 다른 노드로 블록 복사한다.
클라이언트가 파일을 쓰려면, 먼저 파일을 로컬에 저장한다.
만약 파일크기가 정했던 블록 크기를 넘으면 Namenode를 만나고, Namenode는 블록이 저장될 시작위치와 간격(Datanode사이의)을 클라이언트에게 전달함. 클라이언트는 받은 데이터노드 첫부분부터 차례로 저장되고, 이 과정을 replication pipelining이라 함.
클라이언트가 파일을 읽으려면, Namenode에게서 블록ID를 받아내서 읽는다. (블록 크기 넘으면 ID를 여러개 받는다)
클라이언트가 하둡 잡 실행을 요청하면 하나의 잡 요청(맵리듀스코드 jar파일,입력위치,출력위치 등)을 JobTracker가 받고, 그
매퍼와 리듀스들을 TaskTracker에서 나누어준다.
이 과정을 하둡 웹 인터페이스로 확인할 수도 있다.
맵리듀스의 동작과정
분산처리방식, 연속적인 작업을 나눠서 처리한다는 것부터 작업의 부분 부분이 서로 종속성이 없다는 것을 뜻한다.
그 대표적인 경우를 txt파일에서 어떤 단어의 카운트를 하는 것이라고 할 수 있다.
txt파일에서 서로 연관성이 없기 때문에 파일을 나눠 가지고 각각의 카운트를 한 뒤에 취합해서 총 합을 구해주면 된다.
여기서, 각각의 카운트를 하는 과정:맵리듀스의 매퍼 역할
총 합을 구하는 과정: 맵리듀스의 리듀스 역할
위의 그림이 일련의 과정이다. 왼쪽에서 오른쪽으로 갈수록 맵의 크기가 작아지므로, 맵리듀스라고 부른다.
맵리듀스 알고리즘은 가장 단순하게 만들어야한다. 그래야 수많은 서버에 흩어서 병렬로 처리할 수 있기 때문이다. 처리의 순서가 중요하다든지 실패했을때 다시하려면 몇단계 전으로 돌아가야 하는 상황은 있어서 안된다. 즉, 기준이 되는 값은 하나여야 한다.(이 말 매우 격공...알고리즘 풀 때 자꾸 예외에서 걸리는걸 느끼고 모든 경우를 고려하려면 단순해야 한다는걸 느낀 적이 있지)
데이터스택스(DataStax) 커뮤니티 관리자 스콧 헐맨 역시 "막대한 데이터를 포함한 대규모 분석은 앞으로도 계속 사용될 것이므로 일괄 처리는 사라지지 않을 것"이라면서, "스트리밍 분석에 대한 관심도 크지만 이 추세가 빅데이터의 미래에 미칠 영향에 대해 판단하기는 너무 이르다"고 말했다.
간단히 말해 스트리밍 분석(streaming analytics)은 '추가'일뿐, '양자 택일'의 문제가 아니다. 따라서 하둡과 같은 일괄 처리 지향 시스템을 시장에서 몰아내는 것이 아니라 보완하는 기술이 될 가능성이 높다.
이 어플리케이션의 기계 코드 용량은 10000 바이트라고 가정해봅시다. 또한 데이터 저장 및 입/출력 버퍼에 5000 바이트가 필요하다고 가정합니다. 이러한 경우 이 어플리케이션을 실행하기 위해서는 최소한 15000 바이트의 RAM이 필요합니다. 만일 1 바이트라도 부족하다면 이 어플리케이션을 실행할 수가 없습니다.
하지만 메모리 접근은 순차적이고 지역화되어 있다는 내용을 다시 생각해보십시오. 이러한 특성으로 때문에 이 어플리케이션을 실행하는데 필요한 메모리 용량은 15000 바이트 보다 훨씬 적습니다. 단독 기계 명령어를 실행하기 위해 필요한 메모리 접근 방식을 예를 들어 보겠습니다:
메모리에서 명령을 읽어옵니다.
명령어가 필요로하는 데이터를 메모리에서 읽어옵니다.
명령이 완료된 후 결과가 메모리에 다시 기록됩니다.
매번 메모리에 접근하는데 필요한 실제 바이트 수는 CPU 아키텍쳐 및 실제 명령어와 데이터 유형에 따라 달라집니다. 그러나 한 명령어를 실행하는데 각 메모리 접근 유형마다 100 바이트의 메모리가 필요하다고 가정해본다면 이 경우에는 300 바이트가 필요합니다. 즉 어플리케이션의 전체 15000 바이트 주소 공간을 사용하는 것보다 훨씬 적은 메모리 용량을 사용합니다. 따라서 만일 어플리케이션 실행시 필요한 메모리 요건을 기억할 수 있는 방법을 찾을 수가 있다면, 어플리케이션의 주소 공간 보다 적은 메모리를 사용하여 어플리케이션을 실행하는 것이 가능합니다.
어플리케이션의 나머지는 디스크에 남습니다.
Issue?
ex.
필요한 페이지만 실제메모리에 올려두고
아닌 페이지는 디스크(스왑아웃)로 보내두고
페이지 테이블엔 invalid 표시해둔다.(디맨드 페이징이라서 그럼)
접근할 때, invalid라면 페이지 폴트 난 것이므로
IO작업(커널도움)으로 디스크에서 가져와야한다.
(이것이 바로 소프트웨어 인터럽트!)
IO작업은 굉장히 느리므로
페이지폴트가 나는 횟수가 성능 좌우.
즉,page 교체시 뭘 교체할건지 잘 골라야함.
(Optimal algorithm)
Solving?
OPT: 가장 먼 미래에 어떤 페이지 참조하는지 알고 있다는 가정하에, 그 페이지를 교체
but 이건 알고 있어야되기 때문에 실제에선 미래보단 과거를 본다
FIFO: 가장 일찍 들어온 것을 가장 먼저 내보낸다.
but 프레임 커질수록 폴트 더 발생(왜?..혹시 갯수가 늘어나면 그만큼 확률도 떨어져서 그런가)
LRU(Least Recently Used):제일 오래전에 사용한거를 내쫒는다
->FIFO랑 다른 점은 먼저 들어왔어도 재사용 됐으면 안쫓아낸다는 사실이다//이 방법 젤 많이 쓴다
->링크드리스트로 처음 들어오면 밑에 달고, 뺼 때는 젤 위에꺼 뺸다.비교 필요 없다. O(1)
but이번에 한번만 들어오고 앞으로 안들어올 애를 두고, 꾸준히 많이 들어오는 애를 보낼수도.
LFU(Least Frequntly Used): 가장 참조횟수가 적은 페이지 순으로 내쫓는다.
컴퓨터에는 여러가지 메모리가 있다. 먼저 요약해서 그 관계를 얘기하자면, Disk(보조기억장치)에서 실행파일을 가상메모리에 올리고 페이지로 나눈다. 탐색시 보조디스크가 아닌 논리메모리만 탐색해서 필요한 페이지를 물리메모리에 적재시키고, 페이지테이블을 사용해서 그 순서를 기억한다.
이 그림에 disk는 나와있지 않다
1.물리주소:주기억장치의 실제 저장위치 주소
2.가상메모리:보조기억장치를 주기억장치처럼 주소지정 가능하게 만든 저장공간 방법.
3.논리주소(가상주소):가상 메모리의 특정 위치에 배정된 주소 .각 프로세스 가상주소공간에서 0번지부터 시작. cpu가 보는 주소
4.가상주소공간:특정 프로세스에게 할당된 가상 주소의 영역
5.주소공간:특정 프로세스가 접근할 수 있는 메모리 주소의 영역
3.심볼릭 주소: 프로그래머 편의를 위한 변수
심볼릭 주소->컴파일->논리주소->주소바인딩->물리주소 과정을 거쳐서 메모리에 접근할 수 있다.
논리주소를 물리주소로 변환하는 바인딩 종류는 세 가지가 있다.
컴파일타임바인딩:
논리주소에서 정한 주소를 물리주소에서 그대로 사용하기 때문에, 프로그램 쓰면 빈공간을 찾아서 쓰지 않으므로 비효율적이다.
로드타임바인딩:
롸?//논리주소에서 계산해서 사용
런타임바인딩:
cpu를 뺏겨 메모리에서 나갔다가 들어올때 마다 주소가 바뀐다.(하드웨어 mmu가 지원이 필요하고 현대에 채택함)
cpu는 논리주소를 사용한다. 즉, cpu가 준 논리주소를 mmu가 물리주소로 변환을 해서 메모리에 접근하는 것이다. 이 과정을 바인딩이라고 한다.