現在、ETL ツールを使用して、多数の CSV データを OrientDB に挿入しています。試用目的で使用したシステム構成は、EC2 M3 大 (7.5 GiB のメモリ、2 つの vCPU、32 GB の SSD ベースのローカル インスタンス ストレージ、64 ビット プラットフォーム) です。
アップロードしようとしているデータ (マスクされた) は、以下の形式です。
"101.186.130.130","527225725","233 djfnsdkj","0.119836317542"
"125.143.534.148","112212983","1227 sdfsdfds","0.0465215171983"
"103.149.957.752","112364761","1121 sdfsdfds","0.0938863016658"
"103.190.245.128","785804692","6138 sdfsdfsd","0.117767539364"
スキーマには、2 つのノード クラスと 1 つのエッジ クラスが含まれています。plocal オプションで ETL ツールを使用してデータをロードしようとしたところ、速度は約 2300 行/秒でした。ETL 構成は次のとおりです。
{
"source": { "file": { "path": "/home/ubuntu/labvolume1/orientdb/bin/0001_part_00" } },
"extractor": { "csv": {"columnsOnFirstLine": false, "columns":["ip:string", "dpcb:string", "address:string", "prob:string"] } },
"transformers": [ { "merge": { "joinFieldName":"ip", "lookup":"IpAddress.ip" } },
{ "field":
{ "fieldName": "addr_key",
"expression": "dpcb.append('_').append(address)"
}
},{ "vertex": { "class": "IpAddress" } },
{ "edge": { "class": "Located",
"joinFieldName": "addr_key",
"lookup": "PhyLocation.loc",
"direction": "out",
"targetVertexFields": { "geo_address": "${input.address}", "dpcb_number": "${input.dpcb}"},
"edgeFields": { "confidence": "${input.prob}" },
"unresolvedLinkAction": "CREATE"
}
}
],
"loader": {
"orientdb": {
"dbURL": "plocal:/home/ubuntu/labvolume1/orientdb/databases/Bulk_Transfer_Test1",
"dbType": "graph",
"dbUser": "admin",
"dbPassword": "admin",
"serverUser": "admin",
"wal": false,
"serverPassword":"admin",
"classes": [
{"name": "IpAddress", "extends": "V"},
{"name": "PhyLocation", "extends": "V"},
{"name": "Located", "extends": "E"}
], "indexes": [
{"class":"IpAddress", "fields":["ip:string"], "type":"UNIQUE" },
{"class":"PhyLocation", "fields":["loc:string"], "type":"UNIQUE" }
]
}
}
}
次に、頂点をファイルに分割し、頂点のみに対して ETL ジョブを実行しました。今回の速度は 12500 行 / 秒に近いです。これはかなり高速で、この種の作品は私にとってはうまくいきました。(インデックスを削除すると、速度はほぼ2倍になりました)使用した構成は次のとおりです。
{
"source": { "file": { "path": "/home/ubuntu/labvolume1/orientdb/bin/only_ip_05.csv" } },
"extractor": { "csv": {"columnsOnFirstLine": false, "columns":["ip:string"] } },
"transformers": [
{ "vertex": { "class": "IpAddress" } }],
"loader": {
"orientdb": {
"dbURL": "plocal:/home/ubuntu/labvolume1/orientdb/databases/Bulk_Transfer_Test7",
"dbType": "graph",
"dbUser": "admin",
"dbPassword": "admin",
"serverUser": "admin",
"wal": false,
"serverPassword":"admin",
"classes": [
{"name": "IpAddress", "extends": "V"}
],
"indexes": [
{"class":"IpAddress", "fields":["ip:string"], "type":"UNIQUE" }
]
}
}
}
ただし、エッジだけを挿入しようとすると、速度が2200行/秒で非常に遅くなりました。これは、1 回の実行で操作全体を実行するよりもさらに低いことが判明しました。構成ファイルは以下に添付されています。
{
"source": { "file": { "path": "/home/ubuntu/labvolume1/orientdb/bin/edge5.csv" } },
"extractor": { "csv": {"columnsOnFirstLine": false, "columns":["ip:string", "loc:string", "prob:string"] } },
"transformers": [
{ "merge": { "joinFieldName":"ip", "lookup":"IpAddress.ip" } },
{ "vertex": { "class" : "IpAddress", "skipDuplicates" : true }},
{ "edge": { "class": "Located",
"joinFieldName": "loc",
"lookup": "PhyLocation.loc",
"direction": "out",
"edgeFields": { "confidence": "${input.prob}" },
"unresolvedLinkAction": "NOTHING"
}
}
],
"loader": {
"orientdb": {
"dbURL": "plocal:/home/ubuntu/labvolume1/orientdb/databases/Bulk_Transfer_Test7",
"dbType": "graph",
"dbUser": "admin",
"dbPassword": "admin",
"serverUser": "admin",
"wal": false,
"tx":false,
"batchCommit":10000,
"serverPassword":"admin",
"classes": [
{"name": "IpAddress", "extends": "V"},
{"name": "PhyLocation", "extends": "V"},
{"name": "Located", "extends": "E"}
]
}
}
}
ここで何か間違ったことをしている場合はお知らせください。また、パフォーマンスを改善するためのより良い方法を提案してください