복붙노트

[HADOOP] MapReduce with MongoDB, 정말 느림 (동등한 데이터베이스에 대해 MySQL에서 30 시간 대 20 분)

HADOOP

MapReduce with MongoDB, 정말 느림 (동등한 데이터베이스에 대해 MySQL에서 30 시간 대 20 분)

지금 데이터 분석 테스트를하고 있는데, 처음에는 정말 이상한 결과를 얻었습니다.

아이디어는 다음과 같습니다. 인터넷 액세스 로그 (각 액세스에 대한 문서가있는 컬렉션, 90 백만 건의 문서 테스트). 도메인 별 액세스 수 (MySQL의 GROUP BY는 무엇이 될까요?)를 얻고 가장 많이 액세스하는 도메인 10 개를 얻고 싶습니다.

JavaScript로 작성한 스크립트는 정말 간단합니다.

/* Counts each domain url */
m = function () {
    emit(this.domain, 1 );
}

r = function (key, values)    {
    total = 0;
    for (var i in values)    {
        total += Number(i);
    }

    return total;
}

/* Store of visits per domain statistics on NonFTP_Access_log_domain_visits collection */
res = db.NonFTP_Access_log.mapReduce(m, r, { out: { replace : "NonFTP_Access_log_domain_visits" } } );
db.NonFTP_Access_log_domain_visits.ensureIndex({ "value": 1});
db.NonFTP_Access_log_domain_visits.find({}).sort({ "value":-1 }).limit(10).forEach(printjson);

MySQL의 해당 기능은 다음과 같습니다.

drop table if exists NonFTP_Access_log_domain_visits;
create table NonFTP_Access_log_domain_visits (
    `domain` varchar(255) NOT NULL,
    `value` int unsigned not null,
    PRIMARY KEY  (`domain`),
    KEY `value_index` (`value`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    select domain, count(*) as value from NonFTP_Access_log group by domain;
select * from NonFTP_Access_log_domain_visits order by value desc limit 10;

음, MongoDB는 결과와 MySQL을 얻기 위해 30 시간이 걸립니다. 20 분! 조금 읽은 후에는 데이터 분석을 위해 MongoDB가 실제로 느리기 때문에 Hadoop을 사용해야한다는 결론에 도달했습니다. 이와 같은 질문에 대한 대답은 다음과 같습니다.

내가 뭘 잘못하고 있죠? 이 결과가 정상입니까? Hadoop을 사용해야합니까?

우리는 다음 환경에서이 테스트를 실시합니다.

해결법

  1. ==============================

    1.전에 실제로 이와 비슷한 질문에 답했습니다. 앞서 언급했듯이 MongoDB의 Map Reduce 제한 사항은 이전에 설명 했었습니다. 단일 스레드이며 Java Script (스파이더 맨 키)로 변환해야합니다.

    전에 실제로 이와 비슷한 질문에 답했습니다. 앞서 언급했듯이 MongoDB의 Map Reduce 제한 사항은 이전에 설명 했었습니다. 단일 스레드이며 Java Script (스파이더 맨 키)로 변환해야합니다.

    그래서 다른 옵션이 있습니다.

    이 글을 쓰는 시점에서 2.2.0 안정 릴리스는 아직 나오지 않았지만 RC2까지 였으므로 출시가 임박했습니다. 이 유형의 테스트에 대해 더 의미있는 비교를 제공하는 것이 좋습니다.

  2. ==============================

    2.분명히 Aggregation Framework에서 group 함수를 사용하면 잘 작동합니다! :-)

    분명히 Aggregation Framework에서 group 함수를 사용하면 잘 작동합니다! :-)

    다음 Javascript 코드는 17m17에 방문한 가장 많이 방문한 도메인 10 개를 가져옵니다!

    db.NonFTP_Access_log.aggregate(
        { $group: {
            _id: "$domain",
            visits: { $sum: 1 }
            }},
        { $sort: { visits: -1 } },
        { $limit: 10 }
        ).result.forEach(printjson);
    

    어쨌든 MapReduce 대안이 왜 그렇게 느린지는 아직 이해할 수 없습니다. MongoDB JIRA에서 다음 질문을 열었습니다.

  3. ==============================

    3.나는 당신의 결과가 아주 정상적이라고 생각하고 그들을 정당화하려고 노력할 것입니다. 1. MySQL은 MongoDB가 JSON으로 작업하는 동안 처리에 최적화 된 바이너리 형식을 사용합니다. 따라서 파싱 시간이 처리에 추가됩니다. 나는 적어도 10x를 인수로 추정 할 것이다. 2. JS는 실제로 C보다 훨씬 느립니다. 적어도 10의 요인을 가정 할 수 있다고 생각합니다. 우리는 함께 x100을 얻습니다 - 당신이 보는 것과 비슷합니다. 20 분 x 1000은 2000 분 또는 약 33 시간이다. 3. Hadoop은 데이터 처리에도 효율적이지 않지만 보유하고있는 모든 코어를 사용할 수 있으며 차이를 만듭니다. Java는 또한 JIT를 개발하고 10 년 이상 최적화했습니다. 4. MySQL이 아닌 순수한 집계 인 TPC-H 벤치 마크 Q1을 살펴볼 것을 제안합니다. 나는 VectorWise와 같은 시스템이 코어 당 최대 처리량을 보여줄 것이라고 생각한다.

    나는 당신의 결과가 아주 정상적이라고 생각하고 그들을 정당화하려고 노력할 것입니다. 1. MySQL은 MongoDB가 JSON으로 작업하는 동안 처리에 최적화 된 바이너리 형식을 사용합니다. 따라서 파싱 시간이 처리에 추가됩니다. 나는 적어도 10x를 인수로 추정 할 것이다. 2. JS는 실제로 C보다 훨씬 느립니다. 적어도 10의 요인을 가정 할 수 있다고 생각합니다. 우리는 함께 x100을 얻습니다 - 당신이 보는 것과 비슷합니다. 20 분 x 1000은 2000 분 또는 약 33 시간이다. 3. Hadoop은 데이터 처리에도 효율적이지 않지만 보유하고있는 모든 코어를 사용할 수 있으며 차이를 만듭니다. Java는 또한 JIT를 개발하고 10 년 이상 최적화했습니다. 4. MySQL이 아닌 순수한 집계 인 TPC-H 벤치 마크 Q1을 살펴볼 것을 제안합니다. 나는 VectorWise와 같은 시스템이 코어 당 최대 처리량을 보여줄 것이라고 생각한다.

  4. from https://stackoverflow.com/questions/12139149/mapreduce-with-mongodb-really-really-slow-30-hours-vs-20-minutes-in-mysql-for by cc-by-sa and MIT license