노트:MapReduce Design Patterns
1. 최대치, 최소치, 총액, 개수, 평균치를 구한다.
사례: 사용자가 글을 올린 첫 번째 시간, 마지막 시간, 댓글 총수, 댓글의 평균 길이 등을 제시한다.
해결: 클래스 Caculate Obj를 정의하여 Writable 인터페이스를 실현하고 사용자 ID를 Key로 하며 Map/Reduce 단계에서 HDFS에 쓴 것은 Caculate Obj 대상입니다. 이런 MapReduce 프로그램은 모든 작업을 완성할 수 있습니다.
최대치, 최소치, 총수, 개수는 Combiner를 사용할 수 있고, 평균치는 Combiner를 사용할 수 없다.
여기서 균일치는 Reduce 단계에서 총액을 개수로 나누어 계산합니다.
public class CaculateObj implements Writable{
private int max ;
private int min ;
private int sum;
private int count;
private int average;
private Date firstDate;
private Date lastDate;
@Override
public void write(DataOutput d) throws IOException {
d.writeInt(max);
d.writeInt(min);
d.writeInt(sum);
d.writeInt(count);
d.writeInt(average);
d.writeLong(firstDate.getTime());
d.writeLong(lastDate.getTime());
}
@Override
public void readFields(DataInput di) throws IOException {
this.max = di.readInt();
this.min = di.readInt();
this.sum = di.readInt();
this.count = di.readInt();
this.average = di.readInt();
this.firstDate = new Date(di.readLong());
this.lastDate = new Date(di.readLong());
}
// Getter / Setter
}
2. 중치와 균일 방차 구하기
사례: 사용자가 매일 글을 올리는 길이의 중치와 기준의 차이를 통계한다.
해결 방법 1: 시간'하늘'을 키로 하고 맵 단계의 키는 하늘, 밸류는 게시물의 길이입니다. Reduce 단계는 매일 게시물의 수량, 총 길이를 계산하고 수동으로 중치를 계산합니다. = 순서가 게시물의 수량/2인 그 요소, 균일치 = 총 길이/개수, 균일방차는 공식적으로 계산합니다.이 방법의 단점은 메모리 소모가 크다는 것이다.
해결 방법 2: 시간'하늘'을 키로, 맵 단계의 키는 하늘, 밸류는 SortedMapWritable(키는 게시물 길이,value는 1), Combiner 단계에서 키를 쓰는 것은 하늘, 밸류는 SortedMapWritable(키는 게시물 길이,value는 개수), Reduce 단계에서 입력한 밸류는 SortedMapWritable(게시물 길이, 같은 길이의 개수)이다.이 방법은 메모리를 절약하고 전송을 줄인다.
2. 역방향 색인 모드
데이터 집합에 따라 색인을 생성하여 빠른 검색이나 데이터의 집적 능력에 사용합니다.
사례: 사용자 평론 데이터를 제시하고 일련의 질문에 대답하는 id에 위키백과를 만드는 역방향 인덱스
해결: 간단합니다.url에서 id를 추출하면 맵 단계의 url은 키, id는value,reduce 단계의 url은 키, id 조합 문자열은value입니다.
3. 계수기 모드
사례:hadoop 사용자 정의 계수기로 주마다 사용자 수를 통계합니다.
해결: 카운터를 사용하여
context.getCounter(STATE_COUNTER_GROUP, state) .increment(1);
4. 필터 모드
요구에 부합되지 않는 기록을 거르는 것이다.
사례: Grep은 유행하는 텍스트 필터 도구로 파일을 줄 스캔하여 지정한 스타일과 일치하게 출력합니다.MapReduce에 정규 표현식을 적용합니다.
해결: setup 방법에서 사용할 정규 표현식을 얻습니다. 맵에서 간단하게 사용하면 됩니다. Reduce가 필요하지 않습니다.
사례: 무작위 샘플링.
해결: setup 방법에서 샘플링 파라미터를 얻을 수 있으며 맵에서 간단하게 사용하면 되며 Reduce가 필요하지 않습니다.
특히, 효율적인 부룬 필터 "BloomFilter가 있습니다.
사례: 사용자 평론 데이터를 제시하고 지정된 키워드가 포함되지 않은 절대 다수의 평론을 필터한다.
해결: BloomFilter를 사용합니다.
사례: 사용자 평론 목록을 제시하고 1500을 넘지 않는 사용자의 평론을 필터합니다.
해결: BloomFilter를 사용합니다.
5. Top ten 모드
사례: 문제: 사용자 정보 데이터를 제공하고 사용자의 명예값에 따라 top ten을 출력합니다.
해결: Map, Reduce 단계에서 top ten을 계산하고 용량이 10인 PriorityQueue를 사용합니다.Map 단계의 맵 방법은 데이터를 PriorityQueue에 저장하고 HDFS에 쓰지 않으며 clean 방법에서는 Null을 키로 하고 PriorityQueue에서 사용자 정보는Value로 HDFS에 쓴다.Reduce 단계에서 PriorityQueue에 데이터를 직접 넣고 순환이 끝난 후 Null을 키로 하고 PriorityQueue에서 사용자 정보는Value로 HDFS에 기록합니다.
6. Distinct 모드
중복치를 없애는 거야.
사례: 사용자 평론 데이터를 제시하고 사용자 id에 따라 무게를 줄인다.
해결: 맵 단계는 사용자 Id를 키로, Null을value로 HDFS에 쓰기;Combine 단계에서 사용자 Id를 직접 출력하기;Reduce 단계에서 사용자 Id를 직접 내보냅니다.
7. 구조 분층 모델
줄 기반 데이터를 차원 있는 형식으로 변환합니다. 예를 들어 jsonxml입니다.
사례: 사용자의 댓글과 평론 데이터를 제시하고 구조화된 xml 차원 구조를 구축하여 관련 댓글을 대응하는 댓글에 끼워 넣는다.
해결: 두 개의 맵, 맵1은 댓글을 처리하고 맵2는 댓글을 처리합니다.맵이 출력한 키는 모두 게시물 Id이고 맵1이 출력한value 태그 1은 댓글을 표시하고 맵2의 출력value 태그 2는 댓글을 표시합니다.Reduce는 게시물 id를 키로 하고 모든 게시물, 댓글을 조합하여 XML로 기록한다.
사례: 앞의 예의 출력을 사용하여 관련 조작을 실행하고 질문 게시물, 응답 게시물, 그리고 평론의 차원 구조를 만든다.
해결 방법:
8. 구역 모드
섹션 모드는 기록을 디렉터리 (섹션, 섹션, 상자) 로 이동합니다.기록의 순서에는 관심이 없다.
사례: 사용자 정보 데이터를 제시하고 1년 동안 마지막으로 방문한 날짜에 따라 구역을 나누고 1년에 하나의 큰 구역을 나눈다.
해결: 사용자 정의partitioner를 사용하도록 설정합니다.연도에 따라 디렉터리에 기록합니다.
9. 박스 분리 모드
아카이브 데이터 세트의 각 레코드는 하나 이상의 범주로 기록됩니다.
사례: Stack Overflow 게시물 데이터를 제시하고hadoop,pig,hive,hbase 네 개의 라벨을 바탕으로 네 개의 상자에 나눈다.텍스트 내용이나 제목에 Hadoop을 언급한 것은 위와 다른 상자에 놓으세요.
해결: Multiple Outputs를 사용합니다.Map 단계의 setup 방법은Multiple Outputs를 설정하고 맵 방법은 다른 디렉터리에 기록하며 clean 방법은Multiple Outputs를 닫습니다.
10. 전역 정렬
사례: StackOverflow의 사용자 데이터는 계정에 따라 정렬됩니다.우리는 마지막으로 사이트를 방문한 시간에 따라 순서를 정하기를 바란다.
해결 방법:
혼성
정렬을 어지럽히고 데이터 집합을 무작위로 통합합니다.
사례: 대량의 평론 데이터를 제시하고 평론의 일부 정보를 숨깁니다. id 제거, 시간 제거.그리고 데이터를 무작위로 섞는다.
해결: 맵 단계에서 키를 무작위로 생성하고 댓글을value로 사용하면 순서를 흐트러뜨릴 수 있습니다.
테이블 연결
1. Reduce 엔드 연결
사례: 사용자 데이터와 사용자 평론 데이터를 제시하고 평론 소속 사용자 정보를 평론 데이터에 연결시킨다.
해결: 두 개의 맵, 하나는 사용자 데이터를 읽고 하나는 평론 데이터를 읽으며 하나는 사용자 Id를 키로 하고 값 U, C로 사용자 데이터와 평론 데이터를 표시한다.Reduce 단계에서 다시 연결합니다.
2. 부룬 필터를 사용한 Reduce 엔드 연결
데이터 전송을 크게 줄일 수 있습니다.
사례: 1500 이상의 명성을 가진 사용자에게만 관심을 가진다.
해결 방법:
3. Map측 연결
사례: 소량의 사용자 정보 데이터와 큰 평론 데이터를 제시하고 사용자 데이터로 평론 데이터를 풍부하게 한다.
해결: Setup 단계에서 분포식 캐시 Distributed Cache에서 사용자 데이터를 읽고 메모리에 병존합니다.
4. Hadoop 자체 연결
Hadoop 자체에는CompositeInputFormat 클래스가 복합join을 지원합니다.이런 모델의 제한 유형은 내부 연결과 전체 외부 연결이다.Mapper의 입력은 반드시 지정한 방식으로 구역을 나누고 정렬해야 하며, 모든 입력 데이터 집합은 같은 수량의 구역으로 나누어야 한다.또한 같은 외키는 두 데이터 집합의 같은 구역에 있어야 한다.이것은 보통 몇 개의 Job가 같은 Reducer 개수를 가지고 있고 출력 키도 같으며 파일을 출력할 때 분할할 수 없는 것이다.예를 들어hdfs의 Block보다 작거나 split을 지원하지 않는 압축 형식입니다.
사례: 두 개의 빅데이터 집합을 제시한다. 사용자 정보와 평론 데이터, 사용자 데이터로 평론 데이터를 풍부하게 한다.
해결: CompositeInputFormat 사용
5、피리칼 적
피리칼의 축적은 데이터 집합의 크기를 폭증시키고 심지어 100만 개의 데이터의 자체 연결도 1조 개의 기록을 만들어 낸다.많은 맵 슬롯을 사용하고 오래 운행할 수 있으니 조심스럽게 사용하세요.
사례: 처리된 Stack Overflow 평론 데이터를 제시하고 쌍마다 비슷한 단어의 수량에 따라 평론 간의 유사도를 찾아낸다.
해결: 피리칼 적.
12. Job 체인
1. Job 체인
사례: Stack Overflow 사용자의 게시물 데이터를 제시하고 사용자를 두 부분으로 나누어 게시물 수보다 높거나 낮은 평균치에 따라 한다.또한 사용자 정보를 풍부하게 하고 다른 데이터 집합에서 얻은 명예값을 더해서 출력한다.
해결: 두 개의 MapReduce 프로그램.
2. 병렬 Job 체인
병렬job체인의 구동은 앞의 예와 비슷하다.유일한 개선점은jobs가 완성될 때까지 병행적으로 제출되고 감시하는 것이다.
사례: 앞의 예에서 나온 박스별 사용자 데이터를 사용하여 두 박스에서 동시에 job를 뛰어다니며 평균 명예치를 계산한다.
해결 방법:
3. 셸이 달린 Job 체인
4. JobControl을 사용하는 Job 체인
5. Job 체인 결합
사례: 사용자의 게시글과 사용자 정보 데이터를 제공하고 명예치에 따라 5000위나 아래로 사용자를 분류한다.
6、Job Merging
13. 입력 출력 모드
1. 생성 데이터 모델
사례: 무작위 Stack Overflow 데이터를 생성하기 위해 우리는 1000개의 단어의list를 사용하여 무작위 단평을 생성합니다.우리는 무작위 점수,row id,userid, 창설 시간을 만들어야 합니다.
해결 방법:
2. 외부 소스 출력 모드
외부 원본 출력 모드는hadoop 시스템 밖으로 씁니다.
사례: 사용자 정보 데이터를 제시하고 사용자 - 명예 값의 매핑 데이터를 수량 설정 가능한redis 그룹에 무작위로 나누어 줍니다.
3. 외부 소스 입력 모드
이런 모델은hdfs에서 데이터를 불러오지 않고hadoop 이외의 시스템, 예를 들어 RDB나 웹 서비스에서 불러옵니다.
사례: csv 형식redis 실례 목록을 보여 줍니다. 설정 가능한hash를 통해 모든 데이터를 병렬로 읽습니다.
4. 구역 재단 모드
사례: 파일 이름 구성 프레임워크에 따라 MapReduce에 로드할 파일을 선택하고 버리는 방법을 말합니다.
전재 대상:https://www.cnblogs.com/leeeee/p/7276243.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.