2010-06-20 2 views
1

map reduce를 사용하여 Apache 액세스 로그와 Tomcat 로그를 차례로 파싱해야한다는 요구 사항이 있습니다. Tomcat 로그에서 추출되는 필드와 아파치 로그에서 벗어나는 필드는 거의 없습니다. 추출한 필드를 타임 스탬프를 기준으로 병합/매핑하고 이러한 매핑 된 필드를 전통적인 관계형 데이터베이스 (예 : MySQL)로 내 보내야합니다.구문 분석 된 로그 데이터를 hadoop에 저장하고 관계형 데이터베이스로 내보내기

정규식이나 돼지를 사용하여 정보를 구문 분석하고 추출 할 수 있습니다. 내가 직면 한 과제는 두 로그의 추출 된 정보를 단일 집계 형식 또는 파일로 매핑하는 방법과이 데이터를 MYSQL로 내보내는 방법에 관한 것입니다.

거의 접근 나는

(1) 생각하고는) 맵의 출력은 별도의 파일에 모두 구문 분석 아파치 액세스 로그와 바람둥이 로그에서 줄이고 다시 타임 스탬프를 기반으로 하나의 파일()로 그 병합 작성합니다. 이 데이터를 MySQL로 내 보냅니다.

2) 하둡에서 테이블 형식의 데이터를 저장하고

3 MySQL의

에 그것을 수출) 직접지도의 출력이 JDBC를 사용하여 MySQL로 감소 작성 HBase를 또는 하이브를 사용합니다.

어떤 접근 방식이 가장 실용적 일 수 있으며 알고있는 다른 대안 솔루션을 제안하십시오.

답변

2

크고 복잡한 작업을 수행하는 것보다 더 작고 단순한 MR 작업 및 체인을 함께 사용하는 것이 거의 항상 바람직합니다. 나는 최선의 선택이 # 1과 비슷한 것으로 생각한다. 즉 :

  1. 처리 Apache httpd는 통일 된 형식으로 기록됩니다.
  2. 프로세스 Tomcat은 통일 된 형식으로 로그인합니다.
  3. 결과가 동일한 형식으로 작성되면 의미가있는 논리를 사용하여 1과 2의 출력을 결합하십시오.
  4. 결과 데이터 집합을 데이터베이스로 내 보냅니다.

아마도 같은 단계에서 조인과 변환 (1과 2)을 수행 할 수 있습니다. 지도를 변형하고 축소면 결합을하십시오.

나는 HBase를 보지 않으려 고 랜덤 액세스의 오버 헤드가 필요하거나 원하는 것처럼 들리지 않습니다. 이는 HBase의 각 레코드를 타임 스탬프로 찾아보고 존재 여부를 확인하거나 레코드를 병합하거나 존재하지 않는 경우 단순히 삽입하여 랜덤 액세스 감각으로 할 수 있지만 비교적 느리다. Hive는 두 형식의 "통합 된"결과를 저장하기에 편리 할 수 ​​있지만 레코드를 해당 형식으로 변환해야합니다.

절대적으로은 감속기가 MySQL에 직접 쓰는 것을 원하지 않습니다. 이것은 효과적으로 데이터베이스에 대한 DDoS 공격을 만듭니다. 각각 5 개의 감속기를 실행하는 10 개의 노드 클러스터를 고려하면 같은 테이블에 50 개의 동시 작성자를 사용할 수 있습니다. 클러스터를 확장 할 때 최대 연결 수를 매우 빠르게 초과하고 RDBMS를 막습니다.

전체 로그 레코드를 고려하고 있다면이 많은 데이터를 데이터베이스에 저장하는 것이 합당한 지 물어보십시오. 이 데이터 양은 정확히 Hadoop 자체가 장기간 저장하고 처리하는 경우의 유형입니다. 이 데이터의 집계를 계산하는 중이라면, 반드시 MySQL에 던져 넣으십시오.

희망이 도움이됩니다.

+0

감사합니다. Eric mapreduce에서 데이터베이스에서 데이터를 병합하는 약간의 변경으로 파일 기반 접근 방식을 사용하고 있습니다. 두 로그의 구문 분석 된 데이터는 두 개의 별도 스테이징 테이블에 저장되며 이러한 스테이징 테이블은 조인되어 최종 테이블에 저장 될 최종 집계 데이터를 얻습니다. 이 많은 데이터를 데이터베이스에 저장하는 것이 적합한 지 여부에 대한 질문으로, 구문 분석 된 데이터는 필터링 된 유용한 데이터를 집계하여 로그 파일 레코드와 비교하면 훨씬 적습니다. 관계형 데이터베이스에 데이터를 저장하는 이유는 기존 앱이 해당 데이터에 액세스 할 수 있도록 허용하기 위해서입니다. –

관련 문제