اس پوسٹ میں ہم Twitch ڈیٹاسیٹ کے ساتھ لنک کی پیشن گوئی پر کام جاری رکھیں گے: ہم AWS کے ذریعے فراہم کردہ نیپچون-ایکسپورٹ یوٹیلیٹی کا استعمال کرتے ہوئے نیپچون ڈی بی کلسٹر سے گراف ڈیٹا کو S3 بالٹی میں ایکسپورٹ کریں گے۔ جب ہم ڈیٹا ایکسپورٹ ٹاسک بنائیں گے تو ہم 'neptune_ml' پروفائل کا انتخاب کریں گے اور یوٹیلیٹی 'training-data-configuration.json' فائل بنائے گی جسے ہم بعد میں پائپ لائن میں استعمال کریں گے۔ برآمد شدہ ڈیٹا فیچر انکوڈنگ اور ڈیٹا پروسیسنگ کے لیے تیار ہو جائے گا، جو کہ لنک کی پیشن گوئی کے لیے درکار اگلا مرحلہ ہے۔
حصہ 1 یہاں پڑھیں۔
ہم نیپچون بلک لوڈر API (جیسا کہ اس گائیڈ کے حصہ 1 میں بیان کیا گیا ہے) کا استعمال کرتے ہوئے عمودی اور کناروں کی فہرستیں اپ لوڈ کرنے کے بعد نیپچون DB میں موجود گراف ڈیٹا سے شروع کرتے ہیں۔
چوٹی صارفین کی نمائندگی کرتی ہے۔ تمام عمودی خصوصیات کا ایک ہی سیٹ پر مشتمل ہے، اور ایک ہی چوٹی اس طرح نظر آتی ہے:
{<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 کے ذریعے فراہم کردہ نیپچون ایکسپورٹ یوٹیلیٹی کا استعمال کریں گے۔ یوٹیلیٹی کو DB تک رسائی کی اجازت دینے کے لیے، ہم اسے VPC کے اندر ایک EC2 مثال پر چلائیں گے جہاں Neptune DB کلسٹر ہے۔ یوٹیلیٹی ڈی بی سے ڈیٹا حاصل کرے گی، اسے مقامی اسٹوریج (ایک EBS والیوم) میں محفوظ کرے گی، اور پھر یہ برآمد شدہ ڈیٹا کو S3 پر اپ لوڈ کرے گی۔
اگرچہ AWS ایک کلاؤڈفارمیشن ٹیمپلیٹ فراہم کرتا ہے جو آپ کے VPC کے اندر ایک نجی API کو تعینات کرتا ہے تاکہ HTTP درخواست کے ساتھ برآمد کے عمل کو شروع کیا جا سکے، ہم اس بار اس پر توجہ نہیں دیں گے۔ جیسا کہ ہمارا مقصد یہ ظاہر کرنا ہے کہ ڈیٹا پائپ لائن کس طرح کام کرتی ہے (اور API کو ترتیب دینے کے لیے نہیں)، ہم نیپچون ایکسپورٹ یوٹیلیٹی کے ساتھ تعامل کرنے کے لیے صرف EC2 مثال کے کنسول کا استعمال کریں گے۔ ویسے، وہ کنسول کمانڈز AWS سسٹمز مینیجر رن کمانڈ اور سٹیپ فنکشنز کے ساتھ خودکار ہو سکتے ہیں۔
آئیے EC2 مثال بنائیں جس پر ہم نیپچون ایکسپورٹ چلائیں گے۔ AMI کے لیے، ہم Ubuntu 24.04 LTS کا انتخاب کرتے ہیں۔ ہمیں یہ یقینی بنانے کی ضرورت ہے کہ نیپچون کلسٹر EC2 مثال سے قابل رسائی ہے، لہذا ہم اسی VPC میں مثال بنائیں گے جہاں نیپچون کلسٹر ہے، اور ہم مثال اور کلسٹر کے درمیان نیٹ ورک ٹریفک کی اجازت دینے کے لیے سیکیورٹی گروپس کو ترتیب دیں گے۔ برآمد شدہ ڈیٹا کو رکھنے کے لیے ہمیں کافی سائز کا EBS والیوم بھی منسلک کرنا ہوگا۔ اس ڈیٹاسیٹ کے لیے جس پر ہم کام کر رہے ہیں، ایک 8GB والیوم کافی ہے۔
جب کہ مثال شروع ہو رہی ہے، ہمیں ایک IAM کردار بنانے کی ضرورت ہے جو منزل S3 بالٹی تک تحریری رسائی کی اجازت دیتا ہے، اور کچھ RDS ایکشنز بھی، جیسا کہ ذیل کی پالیسی میں دکھایا گیا ہے۔ اگرچہ پالیسی کا پہلا بیان لازمی ہے، دوسرے کی صرف اس صورت میں ضرورت ہے جب آپ کلون شدہ کلسٹر سے ڈیٹا برآمد کرتے ہیں۔ کلون شدہ کلسٹرز سے ڈیٹا ایکسپورٹ کرنے پر اس پوسٹ میں بعد میں بات کی جائے گی۔
{ "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 مثال اور کردار تیار ہونے کے بعد، ہم مثال کے ساتھ کردار کو منسلک کریں گے۔
اگلا، ہمیں مثال کے طور پر نیپچون ایکسپورٹ یوٹیلیٹی کو انسٹال کرنے کی ضرورت ہے۔ ایسا کرنے کے لیے، ہم مثال میں لاگ ان ہوں گے اور 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 بالٹی تیار کر لی ہے، اور IAM کو وہ کردار منسلک کر دیا ہے جو مثال کے طور پر منزل S3 بالٹی تک تحریری رسائی کی اجازت دیتا ہے، ہم ڈیٹا برآمد کرنا شروع کر سکتے ہیں۔ ہم اس کمانڈ کو عمل شروع کرنے کے لیے استعمال کریں گے، 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 یوٹیلیٹی ڈیٹا بیس کا سنیپ شاٹ لے، اس سنیپ شاٹ سے ایک نیا نیپچون کلسٹر بنائیں، ڈیٹا کو پڑھنے کے لیے ان کی نقل تیار کریں، اور استعمال کریں۔ ایسا کرنے سے، آپ اس بات کو یقینی بنا سکتے ہیں کہ لائیو ڈیٹا بیس ڈیٹا ایکسپورٹ سے اضافی بوجھ سے متاثر نہیں ہوا ہے۔
پیرامیٹرز کی مکمل فہرست یہاں مل سکتی ہے ( https://docs.aws.amazon.com/neptune/latest/userguide/export-parameters.html )۔
جب برآمدی عمل مکمل ہو جاتا ہے، نیپچون-ایکسپورٹ کچھ اعدادوشمار کو پرنٹ کرتا ہے بشمول عمودی اور کناروں کی تعداد:
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 بالٹی میں بنائی گئی ہیں۔
'نوڈز' اور 'ایجز' ڈائرکٹریز میں نوڈس اور کناروں کی فہرستوں کے ساتھ CSV فائلیں ہوتی ہیں جو اس سے ملتی جلتی ہیں جو ہم نے ڈیٹا اپ لوڈ کرتے وقت حصہ 1 میں استعمال کیا تھا۔ بڑے گراف کے لیے، متعدد فائلیں ہیں، لیکن ہمارا ڈیٹاسیٹ چھوٹا ہے اور ہر ڈائرکٹری میں صرف ایک فائل ہے۔ Training-data-configuration.json فائل بھی ہے جسے ہم اپنے عمل کے اگلے مرحلے میں ترمیم اور استعمال کریں گے۔
اگر آپ ایک بار برآمد کر رہے ہیں، تو اب EC2 مثال اور EBS والیوم کو حذف کرنا محفوظ ہے، کیونکہ اگلے مرحلے میں ہدف S3 بالٹی میں صرف فائلیں استعمال کی جائیں گی۔ بصورت دیگر، آپ بیکار وقت کے لیے چارج ہونے سے بچنے کے لیے صرف EC2 مثال کو روک سکتے ہیں (آپ سے EBS اسٹوریج کے لیے تب تک چارج کیا جائے گا جب تک کہ آپ اسے حذف نہیں کرتے ہیں)۔
اس وقت ہمارے پاس S3 میں گراف ڈیٹا اس فارمیٹ میں موجود ہے جسے عمل کے اگلے مرحلے میں استعمال کیا جا سکتا ہے، اور ہم فیچر انکوڈنگ اور ڈیٹا پروسیسنگ کرنے کے لیے تیار ہیں، جس پر ہماری اگلی پوسٹ میں بات کی جائے گی۔