私は今、いくつかのデータ分析テストを行っていますが、最初は非常に単純で、非常に奇妙な結果が得られました。
アイデアは次のとおりです。インターネットアクセスログ(アクセスごとのドキュメントを含むコレクション、9千万のドキュメントのテスト用)から。ドメインごとのアクセス数(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は結果を取得するのに30時間かかり、MySQLは20分かかります!少し読んだ後、MongoDBは非常に遅いため、データ分析にはHadoopを使用する必要があるという結論に達しました。このような質問への回答は次のように述べています。
- MongoDBはスレッドのみを使用します
- Javascriptが遅すぎる
私は何が間違っているのですか?この結果は正常ですか?Hadoopを使用する必要がありますか?
このテストは、次の環境で行っています。
- オペレーティングシステム:Suse Linux Enterprise Server 10(Xen上の仮想サーバー)
- RAM:10 Gb
- コア:32(AMD Opteronプロセッサ6128)