MapReduce 기반 응용 사례
환경 설명
Hadoop 구축 환경:
| 가상 컴퓨터 운영 체제: CentOS 6.3 64 비트, 단일 핵, 1G 메모리 | JDK: 1.7.060 64 위 | Hadoop: 2.4.1
MR 프로그램 컴 파일 환경:
| Eclipse IED | mapred. LocalJobRunner 로 컬 실행 모드
테스트 데이터 준비
테스트 데 이 터 는 두 개의 파일 dept (부서) 와 emp (직원) 을 포함 하 며, 각 필드 는 쉼표 로 구 분 됩 니 다.
dept 파일 내용:
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
emp 파일 내용:
7369,SMITH,CLERK,7902,17-12 -80,800,,20
7499,ALLEN,SALESMAN,7698,20-2 -81,1600,300,30
7521,WARD,SALESMAN,7698,22-2 -81,1250,500,30
7566,JONES,MANAGER,7839,02-4 -81,2975,,20
7654,MARTIN,SALESMAN,7698,28-9 -81,1250,1400,30
7698,BLAKE,MANAGER,7839,01-5 -81,2850,,30
7782,CLARK,MANAGER,7839,09-6 -81,2450,,10
7839,KING,PRESIDENT,,17-11 -81,5000,,10
7844,TURNER,SALESMAN,7698,08-9 -81,1500,0,30
7900,JAMES,CLERK,7698,03-12 -81,950,,30
7902,FORD,ANALYST,7566,03-12 -81,3000,,20
7934,MILLER,CLERK,7782,23-1 -82,1300,,10
응용 사례
예 1: 각 부서 의 총 임금 을 구한다.
문제 분석
MapReduce 의 join 은 가장 흔히 볼 수 있 는 reduce side join, map side join 과 semi join 등 여러 가지 로 나 뉜 다.reduce join 은 shuffle 단계 에서 대량의 데이터 전송 을 해 야 하기 때문에 대량의 네트워크 IO 효율 이 떨 어 질 수 있 으 며, map side join 은 여러 개의 작은 표 와 관련 된 큰 표를 처리 할 때 매우 유용 합 니 다.Map side join 은 다음 장면 에 대한 최적화 입 니 다. 두 개의 연결 대기 표 중 하 나 는 매우 크 고 다른 시 계 는 매우 작 아서 작은 시 계 는 메모리 에 직접 저장 할 수 있 습 니 다.이렇게 하면 우 리 는 작은 시 계 를 여러 부 복사 하여 모든 map task 메모리 에 한 부 (예 를 들 어 hash table 에 저장) 가 존재 하도록 한 다음 에 큰 표 만 스 캔 할 수 있 습 니 다. 큰 표 의 모든 기록 key / value 에 대해 hash table 에서 같은 key 기록 이 있 는 지 찾 고 있 으 면 연결 해서 출력 하면 됩 니 다.파일 복 사 를 지원 하기 위해 Hadoop 은 Distributed Cache 와 같은 방법 을 제공 합 니 다. 다음 과 같은 방법 을 사용 합 니 다.
(1) 사용 자 는 복사 할 파일 을 정적 방법
DistributedCache.addCacheFile()
으로 지정 합 니 다. 인 자 는 파일 의 URI (HDFS 의 파일 이 라면 이렇게 할 수 있 습 니 다. hdfs://jobtracker:50030/home/XXX/file
JobTracker 는 작업 이 시작 되 기 전에 이 URI 목록 을 가 져 오고 해당 파일 을 각 TaskTracker 의 로 컬 디스크 에 복사 합 니 다.(2) 사용자 사용: 분포 식 환경
DistributedCache.getLocalCacheFiles()
/ 의사 분포 식 환경 DistributedCache.getCacheFiles()
방법 으로 파일 디 렉 터 리 를 가 져 오고 표준 파일 읽 기 쓰기 API 로 해당 하 는 파일 을 읽 습 니 다.아래 코드 에 서 는 데이터 양 이 적은 표 (부서 dept) 를 메모리 에 캐 시 하고 Mapper 단계 에서 직원 부서 번호 에 부서 이름 으로 표시 합 니 다. 이 이름 은 key 로 Reduce 에 출력 되 며 Reduce 에서 부서 별로 각 부서 의 총 임금 을 계산 합 니 다.처리 흐름 도
코드
Q1SumDeptSalary.java
예 2: 각 부서 의 인원 과 평균 임금 을 구한다.
문제 분석
각 부서 의 인원 과 평균 임금 을 구 하려 면 각 부서 의 임금 총수 와 부서 의 인원 을 받 아야 한다. 이 를 제외 하고 각 부서 의 평균 임금 을 받 아야 한다. 우선 문제 1 과 Mapper 의 Setup 단계 캐 시 부서 데 이 터 를 유사 하 게 한 다음 에 Mapper 단계 에서 부서 번호 와 직원 월급 을 추출 하고 캐 시 부서 데 이 터 를 이용 하여 부서 번 호 를 부서 이름 으로 대응 한 다음 에 Shuffle 단계 에서세그먼트 에서 보 내 온 데 이 터 를 부서 명칭 으로 처리 하여 해당 부서 의 모든 직원 월급 에 대한 목록 으로 처리 하고 마지막 으로 Reduce 에서 부서 에 따라 팀 을 구성 하여 부서 의 모든 직원 을 옮 겨 다 니 며 총수 와 직원 수, 수출 부서 의 명칭 과 평균 임금 을 구한다.
처리 흐름 도
코드
Q2DeptNumberAveSalary.java
예 3: 각 부서 에서 가장 먼저 회사 에 들 어 온 직원 의 이름 을 구하 세 요.
문제 분석
각 부서 에서 가장 먼저 입사 한 직원 의 이름 을 구 하려 면 각 부서 의 모든 직원 의 입사 날 짜 를 얻어 야 합 니 다. 비 교 를 통 해 가장 먼저 입사 한 직원 의 이름 을 얻 을 수 있 습 니 다. 먼저 문제 1 과 Mapper 의 Setup 단계 캐 시 부서 데이터 와 유사 한 데 이 터 를 추출 한 다음 Mapper 단계 에서 key 를 부서 이름 으로 추출 합 니 다. (캐 시 부서 데 이 터 를 이용 하여 부서 번 호 를 부서 이름 으로 대응 합 니 다), value 는 직원 이름과 입사 날짜 입 니 다. 이 어 Shuffle 단계 에서 전 달 된 데 이 터 를 부서 이름 으로 처리 하여 해당 부서 의 모든 직원 + 입사 날짜 목록 으로 처리 합 니 다. 마지막 으로 Reduce 에서 부서 에 따라 팀 을 구성 하고 부서 의 모든 직원 을 옮 겨 다 니 며 최초 로 회사 에 들 어 온 직원 을 찾 아 수출 합 니 다.
처리 흐름 도
코드
Q3DeptEarliestEmp.java
예 4: 각 도시 의 직원 들 의 총 임금 을 구한다.
문제 분석
각 도시 직원 들 의 총 임금 을 구 하려 면 각 도시 의 모든 직원 들 의 임금 을 받 아야 합 니 다. 각 도시 의 모든 직원 들 의 임금 에 대한 요구 와 총 임금 을 받 아야 합 니 다. 먼저 테스트 예 1 과 Mapper 의 Setup 단계 캐 시 부서 가 해당 하 는 도시 데이터 에 대응 한 다음 Mapper 단계 에서 key 를 도시 이름 으로 추출 합 니 다 (캐 시 데 이 터 를 이용 하여 부서 번 호 를 해당 도시 이름 으로 대응 합 니 다)."value 는 직원 월급 입 니 다. 이 어 Shuffle 단계 에서 전 달 된 데 이 터 를 도시 이름 으로 처리 하여 해당 도시 의 모든 직원 에 게 월급 을 주 고 마지막 으로 Reduce 에서 도시 에 따라 팀 을 구성 하여 도시 의 모든 직원 을 옮 겨 다 니 며 월급 총 수 를 구하 고 수출 합 니 다.
처리 흐름 도
코드
Q4SumCitySalary.java
예 5: 상사 보다 월급 이 많은 직원 의 이름과 월급 을 나열 한다.
문제 분석
상사 보다 임금 이 높 은 직원 의 이름과 임금 을 구 하려 면 상사 의 급여 와 상사 의 모든 부하 직원 을 받 아야 한다. 그들의 급여 의 높 고 낮 음 을 비교 하여 상사 의 급여 보다 높 은 직원 을 받 아야 한다. Mapper 단계 에서 매니저 데이터 와 직원 이 매니저 표 에 대응 하 는 데 이 터 를 출력 한다. 그 중에서 매니저 데이터 key 는 직원 번호 이 고 value 는 'M 이 며 이 직원 의 월급' 이다. 직원 이 매니저 표 데이터 key 는 매니저 이다.번호, value 는 'E, 이 직원 의 이름, 이 직원 의 월급' 이다. 그 다음 에 Shuffle 단계 에서 전 달 된 매니저 데이터 와 직원 이 매니저 표 에 대응 하 는 데 이 터 를 팀 으로 분류 한다. 예 를 들 어 번호 가 7698 직원 이 고 value 에서 M 을 자신의 월급 으로 표시 하고 value 에서 E 를 부하 직원 의 이름과 직원 으로 표시 한다. 마지막 으로 Reduce 에서 직원 과 매니저 의 월급 의 높 고 낮 음 을 비교 하고 수출 월급 은 사장 의 월급 보다 높다.종업원.
처리 흐름 도
코드
Q5EarnMoreThanManager.java
예 6: 회사 평균 임금 보다 임금 이 높 은 직원 의 이름과 임금 을 나열 한다.
문제 분석
임금 이 회사 평균 임금 보다 높 은 직원 의 이름과 임금 을 구 하려 면 회사 의 평균 임금 과 모든 직원 의 임금 을 받 아야 한다. 평균 임금 보다 높 은 직원 의 이름과 임금 을 비교 해 보면 이 문 제 는 두 가지 숙제 로 나 누 어 해결 할 수 있다. 먼저 회사 의 평균 임금 을 구 한 다음 에 모든 직원 과 비교 해 결 과 를 얻 을 수 있다. 한 숙제 에서 도 할 수 있다.해결 하려 면 작업 setNum ReduceTasks 방법 을 사용 해 야 합 니 다. Reduce 작업 수 를 1 로 설정 하여 매번 reduce 작업 을 실행 하도록 해 야 합 니 다. 이 예 에서 하나의 reduce 작업 만 있 으 면 데 이 터 를 처리 할 수 있 고 평균 임금 을 먼저 구 한 다음 에 비교 결 과 를 얻 을 수 있 습 니 다.
Mapper 단계 에서 모든 직원 데 이 터 를 출력 합 니 다. 그 중에서 key 는 0 이 고 value 는 이 직원 의 월급 입 니 다. 다른 key 는 1 이 고 value 는 '이 직원 의 이름, 직원 의 월급' 입 니 다. 그 다음 에 Shuffle 단계 에서 전 달 된 데 이 터 를 key 에 따라 그룹 으로 구성 합 니 다. 이 임무 에서 key 값 은 0 과 1 두 조 의 데이터 가 있 습 니 다. 마지막 으로 Reduce 에서 key 값 0 의 모든 직원 에 게 월급 총수 와 직원 수 를 구 합 니 다.평균 임금 을 받 고 키 값 1 에 대해 직원 과 평균 임금 의 크기 를 비교 하 며 평균 임금 보다 높 은 직원 과 해당 하 는 임금 을 수출 한다.
처리 흐름 도
코드
Q6HigherThanAveSalary.java
예 7: J 로 시작 하 는 직원 의 이름과 소속 부서 의 이름 을 열거 합 니 다.
문제 분석
이름 을 J 로 시작 하 는 직원 의 이름 을 구 하 는 기계 소속 부서 의 이름 은 직원 의 이름 이 J 로 시작 하 는 지 여 부 를 판단 하기 만 하면 됩 니 다. 먼저 문제 1 과 Mapper 의 Setup 단계 캐 시 부서 데이터 와 유사 한 다음 Mapper 단계 에서 직원 의 이름 이 J 로 시작 하 는 지 여 부 를 판단 합 니 다. 직원 의 이름과 직원 이 있 는 부서 번 호 를 추출 하 는 경우 캐 시 부서 데 이 터 를 이용 하여 부서 번 호 를 부서 이름 으로 대응 합 니 다., 변환 후 출력 결과.
처리 흐름 도
코드
Q7NameDeptOfStartJ.java
예 8: 월급 이 가장 많은 세 명의 직원 의 이름과 월급 을 나열 한다.
문제 분석
가장 높 은 임금 을 받 는 세 명의 직원 의 이름과 임금 을 구 하 는 것 은 거품 법 을 통 해 얻 을 수 있다. Mapper 단계 에서 매니저 데이터 와 직원 이 매니저 표 에 대응 하 는 데 이 터 를 출력 하 는데 그 중에서 매니저 데이터 key 는 0 값 이 고 value 는 '직원 이름, 직원 월급' 이다. 마지막 으로 Reduce 에서 거품 법 으로 모든 직원 을 옮 겨 다 니 며 직원 의 월급 이 얼마 인지 비교 하여 3 등 을 구한다.
처리 흐름 도
코드
Q8SalaryTop3Salary.java
예 9: 전체 직원 을 총수입 (임금 + 공제금) 에 따라 높 은 것 에서 낮은 것 으로 배열 한다.
문제 분석
전체 직원 의 총 수입 내림차 순 으로 배열 하여 모든 직원 의 총 수입 을 얻 고 내림차 순 으로 배열 하면 됩 니 다. Mapper 단계 에서 모든 직원 의 총 임금 데 이 터 를 출력 합 니 다. 그 중에서 key 는 직원 의 총 임금, value 는 직원 의 이름 입 니 다. Mapper 단계 의 마지막 에 job. setPartitionerClass 를 호출 하여 데 이 터 를 구분 합 니 다. 각 분 구 는 하나의 reducer 에 투사 되 고 각 분 구 는 job. setSort 를 호출 합 니 다.Comparator Class 에서 설정 한 key 비교 함수 클래스 정렬 입 니 다. 이 작업 에서 Map 의 key 는 0 값 만 있 기 때문에 모든 데 이 터 를 정렬 할 수 있 습 니 다.
처리 흐름 도
코드
Q9EmpSalarySort.java
예 10: 두 명의 직원 의 정보 전달 에 필요 한 중간 노드 수 를 구한다.
문제 분석
이 회사 의 모든 직원 들 은 다음 그림 에 들 어 가 는 나무 구 조 를 형성 할 수 있다. 두 직원 의 의사 소통 의 중간 노드 수 를 구하 고 직원 트 리 에서 두 노드 의 연결 이 지나 가 는 노드 수 를 구 할 수 있다. 즉, 그 중의 한 노드 에서 합류 노드 까지 노드 수 를 거 쳐 다른 노드 에서 합류 노드 까지 노드 수 를 거 친다. 예 를 들 어 M 에서 Q 까지 필요 한 노드 수 를 구하 면 M 에서 A 가 지나 가 는 노드 수 를 먼저 찾 을 수 있다.그리고 Q 에서 A 가 지나 간 노드 수 를 찾아내 고 둘 을 더 하면 M 에서 Q 에 필요 한 노드 수 를 얻 을 수 있다.
작업 에서 먼저 Mapper 단계 의 모든 직원 데이터, 그 중에서 매니저 데이터 key 는 0 값, value 는 '직원 번호, 직원 매니저 번호' 이다. 그 다음 에 Reduce 단계 에서 모든 직원 을 직원 목록 과 직원 대응 매니저 링크 맵 에 올 리 고 마지막 으로 Reduce 의 Cleanup 에서 상기 알고리즘 에 따라 두 직원 에 게 의사 소통 의 경로 길 이 를 계산 하고 출력 한다.
처리 흐름 도
코드
Q10MiddlePersonsCountForComm.java
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MongoDB mapreduce 인스턴스var action_count_map = function(){ var action_count_reduce = function(key, values){ db.log.mapReduce(action_count_map, a...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.