この投稿では、Twitch データセットを使用したリンク予測の作業を続けます。AWS が提供する neptune-export ユーティリティを使用して、グラフデータを Neptune DB クラスターから S3 バケットにエクスポートします。データエクスポートタスクを作成するときに「neptune_ml」プロファイルを選択すると、ユーティリティによってパイプラインの後半で使用する「training-data-configuration.json」ファイルが作成されます。エクスポートされたデータは、リンク予測に必要な次のステップである特徴エンコーディングとデータ処理の準備が整います。
パート1はここで読んでください。
Neptune Bulk Loader API (このガイドのパート 1 で説明) を使用して頂点とエッジのリストをアップロードした後、Neptune DB にあるグラフ データから始めます。
頂点はユーザーを表します。すべての頂点には同じプロパティ セットが含まれており、1 つの頂点は次のようになります。
{<T.id: 1>: '153', <T.label: 4>: 'user', 'days': 1629, 'mature': True, 'views': 3615, 'partner': False}
すべてのエッジは同じラベル (「フォロー」) を持ち、各エッジは 2 人のユーザーを接続します。単一のエッジは次のようになります。
{<T.id: 1>: '0', <T.label: 4>: 'follows', <Direction.IN: 'IN'>: {<T.id: 1>: '255', <T.label: 4>: 'user'}, <Direction.OUT: 'OUT'>: {<T.id: 1>: '6194', <T.label: 4>: 'user'}}
私たちの目標は、データをエクスポートして、データ パイプラインの次の部分である前処理と特徴のエンコードで使用できるようにすることです。
AWS が提供するneptune-exportユーティリティを使用して、データベースからデータをエクスポートします。ユーティリティが DB にアクセスできるようにするには、Neptune DB クラスターがある VPC 内の EC2 インスタンスでユーティリティを実行します。ユーティリティは DB からデータを取得し、ローカル ストレージ (EBS ボリューム) に保存してから、エクスポートしたデータを S3 にアップロードします。
AWS は、VPC 内にプライベート API をデプロイして HTTP リクエストでエクスポートプロセスを開始できるようにする Cloudformation テンプレートを提供していますが、今回はそれについては取り上げません。私たちの目標はデータパイプラインがどのように機能するかを示すことであり (API を設定することではない)、EC2 インスタンスのコンソールを使用して neptune-export ユーティリティと対話するだけです。ちなみに、これらのコンソールコマンドは、AWS Systems Manager Run Command と Step Functions を使用して自動化できます。
neptune-export を実行する EC2 インスタンスを作成しましょう。AMI には、Ubuntu 24.04 LTS を選択します。EC2 インスタンスから Neptune クラスターにアクセスできることを確認する必要があるため、Neptune クラスターと同じ VPC にインスタンスを作成し、インスタンスとクラスター間のネットワーク トラフィックを許可するようにセキュリティ グループを構成します。また、エクスポートされたデータを格納するのに十分なサイズの EBS ボリュームをアタッチする必要があります。作業中のデータセットの場合、8 GB のボリュームで十分です。
インスタンスの起動中に、以下のポリシーに示すように、宛先 S3 バケットへの書き込みアクセスといくつかの RDS アクションを許可する IAM ロールを作成する必要があります。ポリシーの最初のステートメントは必須ですが、2 番目のステートメントはクローン クラスターからデータをエクスポートする場合にのみ必要です。クローン クラスターからのデータのエクスポートについては、この投稿の後半で説明します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequiredPart", "Effect": "Allow", "Action": [ "rds:ListTagsForResource", "rds:DescribeDBInstances", "rds:DescribeDBClusters" ], "Resource": "*" }, { "Sid": "OptionalPartOnlyRequiredForExportingFromClonedCluster", "Effect": "Allow", "Action": [ "rds:AddTagsToResource", "rds:DescribeDBClusters", "rds:DescribeDBInstances", "rds:ListTagsForResource", "rds:DescribeDBClusterParameters", "rds:DescribeDBParameters", "rds:ModifyDBParameterGroup", "rds:ModifyDBClusterParameterGroup", "rds:RestoreDBClusterToPointInTime", "rds:DeleteDBInstance", "rds:DeleteDBClusterParameterGroup", "rds:DeleteDBParameterGroup", "rds:DeleteDBCluster", "rds:CreateDBInstance", "rds:CreateDBClusterParameterGroup", "rds:CreateDBParameterGroup" ], "Resource": "*" } ] }
「リソース」フィールドを編集することで、すべてのクラスターではなく、ターゲット クラスターのみへのアクセスを許可できます。
ロールには、EC2 がロールを引き受けることを許可する信頼ポリシーも必要です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
EC2 インスタンスとロールの準備ができたら、ロールをインスタンスにアタッチします。
次に、インスタンスに neptune-export ユーティリティをインストールする必要があります。そのためには、インスタンスにログインし、次のコマンドを使用して JDK 8 をインストールし、ユーティリティをダウンロードします。
sudo apt update -y sudo apt install -y openjdk-8-jdk curl -O https://s3.amazonaws.com/aws-neptune-customer-samples/neptune-export/bin/neptune-export.jar
EC2 インスタンス、宛先 S3 バケットを準備し、宛先 S3 バケットへの書き込みアクセスを許可する IAM ロールをインスタンスにアタッチしたので、データのエクスポートを開始できます。必要なパラメータを JSON オブジェクトとして指定して、次のコマンドを使用してプロセスを開始します。
java -jar /home/ubuntu/neptune-export.jar nesvc \ --root-path /home/ubuntu/neptune-export \ --json '{ "command": "export-pg", "outputS3Path" : "s3://YOUR_TARGET_S3_BUCKET/neptune-export", "params": { "endpoint" : "YOUR_CLUSTER_ENDPOINT", "profile": "neptune_ml" } }'
ここでは必要なパラメータのみを使用しましたが、設定は簡単に拡張できます。「フィルター」パラメータを使用して、グラフのどの部分をエクスポートするかを選択できます。ノード、エッジ、およびそれらのプロパティを選択できます。
ライブ データベースからデータをエクスポートする場合は、「 cloneCluster 」および「 cloneClusterReplicaCount 」パラメータを使用して、neptue-export ユーティリティでデータベースのスナップショットを取得し、そのスナップショットから新しい Neptune クラスターを作成し、リードレプリカをデプロイして、それらを使用してデータをエクスポートできます。これにより、ライブ データベースがデータのエクスポートによる追加の負荷の影響を受けないようにすることができます。
パラメータの完全なリストについては、こちら ( https://docs.aws.amazon.com/neptune/latest/userguide/export-parameters.html ) をご覧ください。
エクスポート プロセスが完了すると、neptune-export は頂点とエッジの数を含むいくつかの統計情報を出力します。
Source: Nodes: 7126 Edges: 70648 Export: Nodes: 7126 Edges: 70648 Properties: 28504 Details: Nodes: user: 7126 |_ days {propertyCount=7126, minCardinality=1, maxCardinality=1, recordCount=7126, dataTypeCounts=[Integer:7126]} |_ mature {propertyCount=7126, minCardinality=1, maxCardinality=1, recordCount=7126, dataTypeCounts=[Boolean:7126]} |_ views {propertyCount=7126, minCardinality=1, maxCardinality=1, recordCount=7126, dataTypeCounts=[Integer:7126]} |_ partner {propertyCount=7126, minCardinality=1, maxCardinality=1, recordCount=7126, dataTypeCounts=[Boolean:7126]} Edges: (user)-follows-(user): 70648
そして、エクスポートされたデータを S3 にアップロードします。
ターゲット S3 バケットに作成されたファイルを見てみましょう。
「nodes」および「edges」ディレクトリには、パート 1 でデータをアップロードしたときに使用したものと類似したノードとエッジのリストを含む CSV ファイルが含まれています。大きなグラフの場合は複数のファイルがありますが、データセットは小さいため、各ディレクトリには 1 つのファイルしかありません。また、プロセスの次のステップで編集して使用するtraining-data-configuration.jsonファイルもあります。
1 回限りのエクスポートを行う場合は、次のステップではターゲット S3 バケット内のファイルのみを使用するため、EC2 インスタンスと EBS ボリュームを削除しても問題ありません。それ以外の場合は、アイドル時間に対する課金を回避するために、EC2 インスタンスを停止するだけです (削除しない限り、EBS ストレージに対して課金されます)。
この時点で、プロセスの次のステップで使用できる形式で S3 にグラフ データが格納されており、特徴のエンコードとデータ処理を実行する準備が整いました。これについては次の投稿で説明します。