Course-এর সূচি

17.6

AWS Glue আর Lake Formation

ETL job, Parquet-এ রূপান্তর, crawler আর Data Catalog, job bookmark, আর নিয়ম মেনে চলা data lake।

24 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই লেসন শেষে তুমি পারবে

  • AWS Glue কী (Apache Spark-এর ওপর serverless ETL), একটা job কীভাবে চালু হয় (নিজে চালালে, schedule-এ, trigger-এ বা event থেকে), আর DPU-hour ধরে কীভাবে bill হয়, বুঝিয়ে বলতে।
  • পরিচিত “Athena-র জন্য CSV থেকে Parquet” flow-টা বানাতে, আর যে job নিজেই নিজেকে চালু করে সেই ফাঁদ এড়াতে।
  • Glue Data Catalog আর crawler কী, আর কেন Athena, Redshift Spectrum, EMR আর Lake Formation সবাই একই table-এর সংজ্ঞার ওপর নির্ভর করে, বলতে।
  • পুরোনো data বারবার process করা থামাতে job bookmark ব্যবহার করতে, আর কখন bookmark-ও বাঁচাতে পারে না তা জানতে।
  • Glue Studio, Glue DataBrew, Glue Streaming ETL আর Glue Data Quality কোথায় বসে, আর কোন feature বন্ধ হয়ে গেছে (Elastic Views, governed tables), চিনতে।
  • Glue-এর ওপরে Lake Formation কী যোগ করে বলতে: blueprint, permission-এর এক জায়গা, column-, row- আর cell-level security, LF-Tags, আর অন্য account-এর সাথে share।
  • Lake Formation setup-এর দুটো পরিচিত ফাঁক (সরাসরি S3 access আর IAM-only default) ধরতে, আর পরীক্ষার “data lake-এর জন্য centralised, fine-grained security” প্রশ্নের উত্তর দিতে।

#Data lake-এর কেন একটা আঠা লাগে

Chapter 10-এ দেখেছ, data রাখার সবচেয়ে সস্তা আর টেকসই জায়গা S3, আর lesson 17.1-এ দেখেছ, Athena S3-এর file-এ সরাসরি SQL চালাতে পারে। কিন্তু বাস্তবে S3-তে যে data এসে পড়ে, সেটা খুব কমই এর জন্য তৈরি থাকে। Shop থেকে order আসে CSV-তে, app-এর event আসে JSON-এ, হিসাবের database থেকে রাতে আসে একটা dump, IoT reading আসে হাজার হাজার ছোট file-এ। Column-এর নাম কেউ লিখে রাখেনি, format একেকটার একেক রকম, তারিখ লেখা তিন রকমে, আর প্রতিটা query-কে সবকিছু scan করতে হয়।

Analytics সস্তা আর নিরাপদ হওয়ার আগে তিনটা কাজ সারতে হয়:

  1. রূপান্তর (Transform): data পরিষ্কার করা, আর query-র উপযোগী format-এ নেওয়া (columnar Parquet, compress করা, partition করা)। এটাই ETL, আর AWS-এর serverless ETL service হলো AWS Glue।
  2. বর্ণনা (Describe): প্রতিটা dataset কী, লিখে রাখা: কোথায় থাকে, কী কী column, কোন type, কোন partition। এটা Glue Data Catalog, যেটা crawler নিজে নিজে ভরে দেয়।
  3. নিয়ন্ত্রণ (Govern): কে কোন table, কোন column, কোন row দেখবে, এক জায়গা থেকে ঠিক করা, সব query engine-এর জন্য। এটা AWS Lake Formation, যেটা Glue-এর ওপর বানানো।

#AWS Glue: serverless ETL

AWS Glue একটা fully managed, serverless ETL (extract, transform, load) service, analytics-এর জন্য data প্রস্তুত আর রূপান্তর করতে কাজে লাগে। তোমাকে কখনো cluster বানাতে হয় না: Glue-কে একটা script আর কতটা capacity লাগবে বলে দাও, Glue worker চালু করে, job চালায়, তারপর worker বন্ধ করে দেয়।

  • Extract: পড়ে S3 থেকে, JDBC দিয়ে database থেকে (RDS, Aurora, Redshift, অফিসের নিজস্ব database), DynamoDB থেকে, stream থেকে (Kinesis Data Streams, Kafka, MSK), আর connector দিয়ে অনেক SaaS উৎস থেকে।
  • Transform: Apache Spark-এ চলা একটা script, Python (PySpark) বা Scala-য় লেখা। সে column-এর নাম আর type বদলাতে পারে, খারাপ row বাদ দিতে পারে, dataset join করতে পারে, PII ঢেকে দিতে পারে, duplicate সরাতে পারে, format বদলাতে পারে, যেমন CSV থেকে Parquet।
  • Load: ফলাফল লেখে S3-এ (data lake), Redshift-এ (warehouse) বা অন্য কোনো database-এ, আর চাইলে Data Catalog আপডেট করে।

Spark job (batch আর streaming) ছাড়াও Glue হালকা কাজের জন্য ছোট Python shell job চালায়, যেখানে cluster লাগে না, আর Ray job-ও চালায়।

Slide-এ মূল ছবিটা এরকম: বাঁয়ে S3 আর Amazon RDS, মাঝখানে Glue ETL extract আর transform করছে, ডানে data warehouse হিসেবে Redshift।

#Glue job কীভাবে চালু হয়: শুধু event দিয়ে না

Note-এ Glue-কে বলা হয়েছে “serverless event-driven ETL service”। এখানে একটু শুধরে নিতে হবে: Glue job নিজে থেকে কোনো event-এ সাড়া দেয় না। কেউ চালু করলে তবেই job চলে:

কীভাবে চালু হয়উদাহরণ
হাতে চালানো (on demand)তুমি Run চাপলে, বা aws glue start-job-run call করলে
Scheduled triggerপ্রতি রাত ২টায় (cron expression)
Conditional trigger“clean orders” job সফল হলে “daily sales” job চালু হও (Glue workflow-এর ভেতরে শিকলের মতো)
Event, Lambda দিয়েPUT-এ S3 event notification একটা Lambda function চালায়, সে StartJobRun call করে
Event, EventBridge দিয়েS3 “Object Created” event EventBridge-এ পাঠায়; একটা rule Glue workflow চালু করে, চাইলে কয়েকটা event জমা হলে বা একটা সময় পার হলে

মানে Glue event-driven design-এর অংশ হতে পারে, কিন্তু event-এর তার জোড়ার কাজটা (lesson 10.7-এর S3 event notification, Lambda, EventBridge) তোমার।

#পরিচিত flow: Athena-র জন্য CSV থেকে Parquet

এটা slide-এর Glue pattern, আর পরীক্ষার খুব প্রিয় ছবি। File input bucket-এ CSV হয়ে নামে; একটা S3 event notification একটা Lambda function চালায় (বিকল্প হিসেবে EventBridge-ও চলে), সে Glue ETL job trigger করে; job CSV import করে Parquet লেখে একটা output bucket-এ; আর Athena সেই Parquet বিশ্লেষণ করে।

এত ঝামেলা কেন? Athena টাকা নেয় যতটা data scan করে তার ওপর। CSV row ধরে সাজানো, compress করা না: একটা column যোগ করতেও Athena প্রতিটা row-এর প্রতিটা byte পড়ে। Parquet columnar আর compress করা: Athena শুধু query-র দরকারি column-গুলো পড়ে, আর file-এর ভেতরের min/max হিসাব দেখে পুরো পুরো row group বাদ দেয়। সাথে তারিখ ধরে partition করলে, এক দিনের query শুধু একটা folder পড়ে। সংখ্যাগুলো lesson 17.1-এ আছে; scan করা data ৭০% থেকে ৯০% কমে যাওয়া খুব সাধারণ ব্যাপার।

Glue ETL: Athena-র জন্য CSV থেকে Parquet

ঢাকার একটা e-commerce shop প্রতি ঘণ্টার order file CSV হিসেবে S3-তে ফেলে। একটা Glue job প্রতিটা file-কে partition করা Parquet বানায়, যেটা Athena কম খরচে query করতে পারে। দেখো job-টা কে চালু করে, আর দুইভাবে কীভাবে গোলমাল হয়।

পরিস্থিতি

Slide-এর pattern: নতুন file এলে S3 event ওঠে, Lambda job চালু করে, Athena Parquet পড়ে।

Shop app
Input bucketCSV
Glue jobSpark
Output bucketParquet
Athena
Lambda
orders_0930.csv
ধাপ 1 / 6
1

Shop app raw/ prefix-এ orders_0930.csv লিখল। Glue নিজে থেকে bucket পাহারা দেয় না: কেউ job চালু না করলে এখনো কিছুই হবে না।

#Worker, DPU আর bill

Glue capacity মাপে DPU (data processing unit) দিয়ে। এক DPU মানে ৪টা vCPU আর 16 GB memory। তুমি একটা worker type বেছে নাও (G.1X মানে worker প্রতি ১ DPU, G.2X মানে ২ DPU, আর বেশি memory লাগে এমন job-এর জন্য আরও বড়গুলো আছে) আর কয়টা worker; একটা Spark job-এ অন্তত ২টা DPU লাগে। Run চলার সময় Glue worker-এর সংখ্যা নিজে auto scale-ও করতে পারে।

টাকা দাও DPU-hour ধরে, সেকেন্ড হিসাবে bill, Glue 2.0 আর তার পরের Spark job-এ ১ মিনিটের minimum। us-east-1-এ তালিকা দাম প্রতি DPU-hour US$0.44, আর Flex execution (যে job তাড়াহুড়োর না, ফাঁকা capacity-তে চলে) US$0.29। Glue 6.0 (আগস্ট ২০২৬) Spark-এর দাম প্রায় ৩০% কমিয়েছে, তবে শুধু সেই job-এর জন্য যেগুলো version 6.0-তে set করা।

একটা হিসাব করে দেখি: রাতের একটা job ১০টা G.1X worker-এ (১০ DPU) চলে ১৫ মিনিট। তাহলে ১০ × ০.২৫ = ২.৫ DPU-hour, আর ২.৫ × ০.৪৪ = US$1.10 প্রতি রাতে, মাসে প্রায় US$33। বাকি পৌনে চব্বিশ ঘণ্টা কোনো cluster অলস বসে থাকে না, serverless ETL-এর মূল কথাই এটা।

Crawler-এর bill-ও একইভাবে হয় (DPU-hour ধরে, সেকেন্ড হিসাবে)। Data Catalog প্রতি মাসে প্রথম ১০ লাখ object আর প্রথম ১০ লাখ request পর্যন্ত free, তারপর প্রতি ১,০০,০০০ object-এ মাসে US$1।

#Glue Data Catalog: সব dataset-এর একটা তালিকা

Glue Data Catalog হলো একটা centralized metadata repository: তোমার সব dataset-এর একটা তালিকা, data নিজে না। প্রতিটা table-এর জন্য সে রাখে:

  • data কোথায় আছে (একটা S3 path, বা JDBC দিয়ে পাওয়া কোনো database table, বা একটা DynamoDB table);
  • schema: column-এর নাম আর data type;
  • format আর কীভাবে পড়তে হবে (comma দিয়ে আলাদা CSV, JSON, Parquet, ORC, Avro…);
  • partition (যেমন প্রতিটা dt= folder-এর জন্য একটা) আর table-এর অন্যান্য property।

Table-গুলো থাকে database-এর ভেতরে (এগুলো শুধু metadata-র folder, RDS database-এর সাথে কোনো সম্পর্ক নেই)। প্রতি account-এ প্রতি Region-এ একটাই Data Catalog, আর এটা Apache Hive metastore-এর সাথে মেলে, তাই এত engine একে ব্যবহার করতে পারে।

Slide-এর ছবি: S3, RDS, DynamoDB আর JDBC উৎস scan করে একটা Glue crawler, যে Data Catalog-এ metadata লেখে; Glue job ETL-এর জন্য সেই table ব্যবহার করে; আর Athena, Redshift Spectrum আর EMR একই catalog দিয়ে data discovery করে: আগে table খোঁজে, তারপর data যেখানে আছে সেখান থেকে পড়ে। QuickSight query করে Athena দিয়ে, আর Lake Formation নিজের permission রাখে এই একই table-গুলোর ওপর।

#Crawler: schema খুঁজে বের করার কাজটা Glue-কে দাও

Crawler একটা process, যে একটা data store-এ ঢোকে, কিছু file বা table নমুনা হিসেবে পড়ে, classifier দিয়ে format চিনে নেয় (CSV, JSON, Parquet, ORC, Avro, XML আর আরও অনেক কিছুর জন্য built-in classifier আছে, নিজেরটাও বানানো যায়), column আর type অনুমান করে, dt=2026-10-30/-এর মতো folder-এর নাম থেকে partition বোঝে, আর Data Catalog-এ table তৈরি বা আপডেট করে।

  • চালাও হাতে, schedule-এ (যেমন প্রতি ঘণ্টায়), বা S3 event mode-এ, যেখানে সে শুধু বদলানো folder-গুলো crawl করে, SQS দিয়ে আসা S3 event notification দেখে।
  • Schema change policy বলে দেয় data বদলালে কী করতে হবে: table আপডেট করো, শুধু নতুন column যোগ করো, নাকি শুধু খবরটা log করো।
  • Crawler ব্যবহার করতেই হবে এমন না: Glue job নিজেও catalog table বানাতে আর আপডেট করতে পারে, আর Athena-য় DDL দিয়ে হাতেও table বানানো যায়।

Crawler আর Data Catalog: সব engine-এর জন্য একটাই table-এর সংজ্ঞা

একটা garments কারখানার smart meter S3-তে reading পাঠায়। একটা crawler schema আর partition বের করে Data Catalog-এ লেখে, আর Athena, Redshift Spectrum, EMR সবাই সেই একটা সংজ্ঞাই ব্যবহার করে।

পরিস্থিতি

Crawler file-ভরা folder-কে একটা table বানায়; তারপর প্রতিটা engine catalog দিয়ে data খুঁজে পায়।

S3-এর dataদিন ধরে folder
Glue crawler
Data Catalog
Athena
Redshift Spectrum
EMR
ধাপ 1 / 7
1

Reading-গুলো আছে s3://meters-example/readings/dt=2026-10-29/ আর এরকম আরও folder-এ। S3-এর কাছে এগুলো শুধু object: কোনো column-এর নাম নেই, type নেই।

#Glue-এর যে feature-গুলো মোটামুটি জানতে হবে

#Job bookmark: একই data দুবার process কোরো না

যে daily job s3://shop-raw-example/orders/ পড়ে, সে folder-এর সব file পড়ে, গতকালেরগুলোসহ, যদি না মনে রাখে কোথায় থেমেছিল। Job bookmark হলো সেই স্মৃতি: প্রতিটা সফল run-এর পরে Glue state save করে (S3-এর ক্ষেত্রে কোন file-গুলো আগেই process হয়েছে; JDBC উৎসের ক্ষেত্রে একটা key column-এর সবচেয়ে বড় মান), আর পরের run শুধু নতুন data পড়ে।

  • Job ধরে চালু করো: --job-bookmark-option job-bookmark-enable (বাকি দুটো মান job-bookmark-disable আর job-bookmark-pause)।
  • Script-এ প্রতিটা source-এর একটা transformation_ctx নাম লাগে, আর শেষে job.commit() call করতে হয়; এগুলো ছাড়া কিছুই save হয় না।
  • ব্যর্থ run bookmark সরায় না, তাই পরের run একই file-গুলো আবার চেষ্টা করে।
  • Bug ঠিক করার পরে সব আবার process করতে bookmark reset করা যায়, বা আগের কোনো run-এ ফিরিয়ে নেওয়া যায়।
  • JDBC উৎসে bookmark key-কে শুধু বাড়তেই হবে (auto-increment ID বা created-at সময়); আপডেট হওয়া পুরোনো row আর দেখা যায় না।

Job bookmark: প্রতিটা file একবারই

একটা mobile wallet-এর রাতের Glue job দিনের লেনদেনের file-গুলোকে fraud dashboard-এর জন্য Parquet বানায়। তুলনা করো: bookmark সহ job, bookmark ছাড়া, আর bookmark চালু কিন্তু কখনো save হয় না এমন job।

পরিস্থিতি

Job মনে রাখে কোন file-গুলো সে আগে process করেছে, আর শুধু নতুনগুলো পড়ে।

Raw bucket১ম রাত: a–c
Glue job
Curated bucket
Athena
Bookmarksave করা অবস্থা
a, b, c
ধাপ 1 / 5
1

প্রথম রাত। তিনটা file অপেক্ষা করছে: a, b আর c। Job তিনটাই পড়ে, কারণ সে আগে কখনো চলেনি।

#Glue Studio, DataBrew, Streaming ETL আর Data Quality

Featureএটা কীকখন নেবে
Glue StudioGlue ETL job বানানো, চালানো আর নজর রাখার visual interface: source, transform আর target টেনে এনে বসাও; Spark script Glue নিজে লেখে। Notebook-ও আছেহাতে Spark না লিখে job বানাতে; job run-এর খবর রাখতে
Glue DataBrewData পরিষ্কার আর একরকম করার visual tool, ২৫০-টার বেশি তৈরি transformation সহ (তারিখ ঠিক করা, duplicate সরানো, column ভাগ করা, PII ঢাকা), কোনো code ছাড়াযে analyst আর data scientist নিজেরাই data প্রস্তুত করেন
Glue Streaming ETLApache Spark Structured Streaming-এ চলা Glue job, যে Kinesis Data Streams, Apache Kafka বা Amazon MSK থেকে একটানা পড়ে, ছোট ছোট micro-batch-এ process করে, আর S3 বা অন্য target-এ লেখেStreaming data কয়েক সেকেন্ড থেকে কয়েক মিনিটের মধ্যে পরিষ্কার বা রূপান্তর করে lake-এ তোলা (lesson 17.7-এ Managed Flink-এর সাথে তুলনা আছে)
Glue Data Quality“amount কখনো ঋণাত্মক না” বা “order_id অনন্য”-এর মতো rule, catalog table-এ বা job-এর ভেতরে যাচাই হয়, আর খারাপ load আটকে দিতে পারেখারাপ data report পর্যন্ত পৌঁছানো থামাতে
ML transform (FindMatches)এমন duplicate বা মিলে যাওয়া record খোঁজে, যাদের কোনো common key নেই (“Md. Karim, Mirpur 10” আর “Mohammad Karim, Mirpur-10”)Data lake-এ duplicate সরানো; slide-এ Lake Formation-এর প্রসঙ্গে এর কথা আছে

DataBrew-এর দাম আলাদা: প্রতিটা ৩০ মিনিটের interactive session-এ US$1, আর job-এর জন্য প্রতি node-hour-এ US$0.48।

#AWS Lake Formation: কয়েক দিনে data lake

Data lake হলো analytics-এর জন্য তোমার সব data রাখার একটা কেন্দ্রীয় জায়গা, গোছানো (table) আর অগোছালো (log, ছবি, document) দুটোই, কাঁচা আর পরিষ্কার দুই রূপেই, সাধারণত S3-এ। হাতে বানাতে গেলে অনেক ধাপ: bucket বানাও, ingestion job লেখো, crawl করো, রূপান্তর করো, catalog-এ তোলো, duplicate সরাও, তারপর IAM-এ, S3 bucket policy-তে আর catalog-এ permission বসাও। AWS Lake Formation একটা fully managed service, যে এই ধাপগুলো স্বয়ংক্রিয় করে দেয়, তাই নিরাপদ একটা data lake মাসের বদলে কয়েক দিনে তৈরি হয়।

এটা তোমাকে যা দেয়:

  • S3 location-গুলো lake-এর অংশ হিসেবে register করা; তারপর ওগুলোর access সামলায় Lake Formation।
  • Blueprint: তৈরি করে রাখা ingestion workflow। একটা blueprint Glue crawler, job আর trigger বানিয়ে দেয়, যেগুলো হাতে চালালে বা schedule-এ lake-এ data load করে:
    • Database snapshot: JDBC উৎস থেকে (RDS, Aurora, অফিসের SQL Server বা Oracle…) সব table load বা আবার load করে।
    • Incremental database: bookmark column দেখে শুধু নতুন row load করে।
    • Log file: CloudTrail, Elastic Load Balancing আর ALB-এর log একসাথে load করে।
    • Slide-এ S3 আর NoSQL উৎসের কথাও আছে: S3-এ আগে থেকেই থাকা data শুধু register করে crawl করা হয়, আর অন্য উৎস load হয় Glue job আর connector দিয়ে।
  • খোঁজা, পরিষ্কার করা, রূপান্তর, catalog-এ তোলা আর duplicate সরানো, ভেতরে Glue দিয়েই (crawler, ETL job, Data Catalog, FindMatches)।
  • Permission-এর এক জায়গা, column, row আর cell পর্যন্ত, যেটা মানে Athena, Redshift Spectrum, EMR, Glue আর QuickSight (Athena দিয়ে)। পরীক্ষায় সবচেয়ে বেশি প্রশ্ন আসে এই অংশ থেকেই।

Lake Formation AWS Glue-এর ওপরেই বানানো: তার table মানে Glue Data Catalog-এর table, তার workflow মানে Glue workflow। Permission নিজে free; টাকা দাও Glue, S3 আর query engine-এর জন্য।

Lake Formation blueprint: database থেকে data lake

একটা garments group তার RDS আর অফিসের নিজস্ব SQL Server-এর order এক S3 data lake-এ চায়। Lake Formation-এর একটা blueprint সেই Glue crawler, job আর trigger বানিয়ে দেয়, যেগুলো data load করে।

পরিস্থিতি

প্রথম load: database-এর সব table, Parquet হিসেবে লেখা আর catalog-এ তোলা।

RDS / Aurora
অফিসের DBSQL Server
Lake Formationblueprintblueprint বাছাই
Data lakeS3, Parquet
Data Catalog
Athena
Redshift, EMR
ধাপ 1 / 4
1

Data lake admin s3://garments-lake-example/ Lake Formation-এ register করেন, তারপর RDS-এর JDBC connection দিয়ে database snapshot blueprint বেছে নেন।

Data lake (S3 + Glue + Lake Formation)Data warehouse (Redshift, lesson 17.2)

  • যেকোনো data: table, JSON, log, ছবি; কাঁচা আর পরিষ্কার
  • Schema বসে পড়ার সময় (“schema on read”)
  • খুব সস্তা storage, অনেক engine (Athena, EMR, Spectrum, SageMaker)
  • খুঁজে দেখা, ML আর সবকিছু রেখে দেওয়ার জন্য সেরা
  • গোছানো, model করা table, ETL বা ELT দিয়ে load করা
  • Load-এর আগেই schema ঠিক করা (“schema on write”)
  • BI আর dashboard-এর জন্য দ্রুত, ধারাবাহিক SQL
  • জানা report আর একসাথে অনেক user-এর জন্য সেরা

বেশিরভাগ কোম্পানি দুটোই রাখে: lake সব রেখে দেয়, আর warehouse-এ থাকে পরিষ্কার করা সেই অংশটা, যেখানে dashboard সারাদিন query করে। Redshift Spectrum (lesson 17.2) দুটোকে জোড়া লাগায়।

#এক জায়গা থেকে permission

Lake Formation ছাড়া lake-এর একটা table-এ একজন analyst-কে access দিতে গেলে কয়েকটা জায়গায় হাত দিতে হয়, প্রত্যেকটার আলাদা ভাষা:

  • Athena, Glue catalog-এর action আর s3:GetObject-এর জন্য একটা IAM policy;
  • S3 bucket policy (আর data নিজের customer key দিয়ে encrypt করা থাকলে KMS key policy);
  • অন্য account-এর জন্য একটা Glue Data Catalog resource policy;
  • আর প্রতিটা engine-এ আলাদা করে: EMR, Redshift Spectrum, SageMaker।

তার চেয়েও খারাপ, S3-এর permission চলে object ধরে, column বা row ধরে না। customers Parquet file-এ যদি national ID-র column থাকে, তাহলে যে object পড়তে পারে, সে তার সব column আর সব row পড়তে পারে। একটা column লুকাতে টিমগুলো data copy করে একটা ছাঁটা dataset বানাত, আর তারপর দুটো copy মিলিয়ে রাখার ঝামেলা।

Lake Formation এর জায়গায় আনে একটাই permission model, এক জায়গা থেকে চালানো:

  1. S3 location-টা Lake Formation-এ register করো, এমন একটা role দিয়ে যেটা দিয়ে Lake Formation নিজে ওটা পড়ে।
  2. Database, table আর column-এ Lake Formation permission grant করো (SELECT, INSERT, DESCRIBE, ALTER…), IAM user আর role, Identity Center-এর user আর group, SAML user, বা অন্য AWS account-কে।
  3. Row আর cell-এর জন্য বানাও data filter: একটা row filter expression (branch = 'Dhaka') আর একটা column তালিকা; দুটো মিলে cell-level security।
  4. User যখন কোনো integrated engine দিয়ে query করে (Athena, Redshift Spectrum, EMR, Glue, Athena দিয়ে QuickSight), engine Lake Formation-কে জিজ্ঞেস করে user কী দেখতে পারবে। Lake Formation grant মিলিয়ে দেখে, আর engine-কে S3 data-র জন্য অস্থায়ী credential দেয় (credential vending)। Engine শুধু অনুমোদিত column আর row ফেরত দেয়।

Slide-এর centralised-permission উদাহরণ ঠিক এটাই দেখায়: S3, RDS আর Aurora থেকে data lake-এ ঢুকছে, Lake Formation column-level security লাগাচ্ছে, আর Athena ও QuickSight-এর user-রা শুধু ততটুকুই দেখছেন যতটুকু তাঁদের দেওয়া হয়েছে।

Lake Formation permission: একই table, আলাদা উত্তর

একটা bank সব branch-এর লেনদেন রাখে data lake-এর একটা table-এ, যেখানে national ID-র একটা column আছে। প্রতিটা query-তে কোন column আর কোন row ফেরত যাবে, ঠিক করে Lake Formation; আর scenario-গুলো দেখায় কোন ফাঁকগুলো বন্ধ করতে হবে।

পরিস্থিতি

Integrated engine আগে Lake Formation-কে জিজ্ঞেস করে, তারপর Lake Formation-এর দেওয়া credential দিয়ে S3 পড়ে।

Auditorhead office
Athena
Lake Formation
Data lakebranch_txn
ঢাকার manager
QuickSight
select *
ধাপ 1 / 5
1

Head office-এর auditor নিজের IAM role দিয়ে ঢুকে Athena-য় select * from branch_txn চালান।

একই table নিজে চালিয়ে দেখো। একটা role আর একটা পথ বেছে নাও, তারপর query চালাও:

Lake Formation permission matrix

Data lake-এ bank-এর একটা table, branch_txn। কে জিজ্ঞেস করছে আর কোন পথে data-য় পৌঁছাচ্ছে বেছে নাও, তারপর query চালিয়ে দেখো কোন row আর কোন column ফেরত আসে।

কে জিজ্ঞেস করছে

কোন পথে

ফল দেখতে “Query চালাও” চাপো।

#LF-Tags: যে permission বড় হতে পারে

Table ধরে ধরে grant দেওয়া হাজার হাজার table-এ চলে না। LF-Tags (Lake Formation-এর tag-ভিত্তিক access control) দিয়ে database, table আর column-এ domain = sales বা sensitivity = pii-এর মতো tag লাগাও, আর permission দাও tag expression-এর ওপর: “marketing role domain = sales আর sensitivity = public tag-ওয়ালা সবকিছু SELECT করতে পারবে”। একই tag পাওয়া নতুন table নিজে থেকেই এর আওতায় চলে আসে; কাউকে আলাদা grant দিতে হয় না।

#অন্য account-এর সাথে share

অনেক কোম্পানি lake রাখে একটা producer account-এ, আর অন্য account-গুলোকে (finance account, একটা sister concern) query করতে দেয়। Lake Formation একটা table, বা একটা LF-Tag expression, অন্য AWS account-কে বা একটা organisation unit-কে grant করতে পারে। Share-টা পৌঁছায় AWS Resource Access Manager দিয়ে; তারপর consumer account-এর data lake admin নিজের user-দের আবার grant করেন, আর তারা নিজেদের Athena বা Redshift দিয়ে query করে। Data কখনো producer-এর bucket ছেড়ে যায় না, copy-ও হয় না।

#কোথায় গোলমাল হয়

লক্ষণকারণসমাধান
Glue job বারবার চলছে, bill বাড়ছেইJob output লিখছে সেই bucket আর prefix-এই, যেটা তাকে trigger করে, তাই প্রতিটা output file নতুন event তোলেOutput লেখো আলাদা bucket বা prefix-এ; event notification-এ input prefix আর .csv suffix দিয়ে filter দাও
Athena-য় আজকের কোনো row নেইS3-এ নতুন partition folder আছে, catalog-এ নেইCrawler schedule-এ বা S3 event mode-এ চালাও, MSCK REPAIR TABLE / ALTER TABLE ADD PARTITION, partition projection (17.1), বা job-কেই catalog আপডেট করতে দাও
এক folder থেকে কয়েক ডজন tableএক prefix-এর নিচে নানা format বা schema, crawler এগুলো এক করতে পারেনিDataset প্রতি একটা prefix, exclude pattern, custom classifier, বা path প্রতি একটা schema বানানোর crawler option
আবার চালানোর পর মোট হিসাব দ্বিগুণJob bookmark নেই, বা script-এ transformation_ctx / job.commit() নেইBookmark চালু করো, script ঠিক করো; লেখা idempotent করো (দিনের partition overwrite করো)
আপডেট হওয়া row কখনো lake-এ পৌঁছায় নাIncremental blueprint বা JDBC bookmark শুধু বড় key-ওয়ালা row দেখেছোট table-এর জন্য snapshot blueprint; বা DMS দিয়ে CDC, কিংবা Glue job দিয়ে Iceberg table-এ merge
Job out-of-memory-তে ব্যর্থWorker কম বা ছোট, বা একপেশে (skewed) joinবড় worker type (G.2X বা তার ওপরে), বেশি worker, auto scaling, skew ঠিক করা
Lake Formation যে column লুকানোর কথা, user সেটা দেখছেUser পুরোনো IAM বা bucket policy দিয়ে সরাসরি S3 object পড়ছেসরাসরি S3 access সরাও; bucket শুধু Lake Formation-এর registration role পড়বে
Lake Formation-এর grant কোনো কাজ করছে নাDefault IAMAllowedPrincipals group-এর এখনো Super আছে, আর “Use only IAM access control” চালুDatabase আর table থেকে IAMAllowedPrincipals তুলে নাও, default setting বদলাও (বা migration-এর সময় hybrid access mode)
কোনো query engine row filter মানছে নাওই feature-এর জন্য engine-টা Lake Formation-এর সাথে যুক্ত না, বা এর বাইরে চলে (EC2-এ তোমার নিজের Spark)Integrated engine ব্যবহার করো; বাকি সবকিছুর জন্য সরাসরি S3 access বন্ধ রাখো

#System design-এ Glue আর Lake Formation

  • যেখানে সস্তা, সেখানে রূপান্তর করো। একবারের রূপান্তর: Athena-র CREATE TABLE AS SELECT। বারবার চলা, schedule করা pipeline: একটা Glue job (serverless, সেকেন্ড ধরে টাকা)। বিশাল, অনেকক্ষণ চলা বা বিশেষ big-data framework (নিজের cluster-এ Hive, Presto বা Flink, ঘণ্টার পর ঘণ্টার কাজে Spot-এর দাম): EMR (lesson 17.4)। Stream-এর ভেতরে record ধরে ধরে সহজ রূপান্তর: Firehose-এর Lambda transform (lesson 13.6)।
  • Database বিশ্লেষণ না, সরাতে চাও? সেটা DMS (chapter 23)। Glue analytics pipeline-এর জন্য; DMS একটা target database-কে মিলিয়ে রাখে।
  • যে analyst code লেখেন না, তিনি data প্রস্তুত করেন DataBrew-এ; engineer-রা Glue job লেখেন, বা Glue Studio-তে চোখে দেখে বানান।
  • সব engine-এর জন্য একটাই catalog। Athena, Redshift Spectrum আর EMR-কে একই Glue Data Catalog দেখাও, তাহলে একবার সংজ্ঞা দেওয়া table সব জায়গা থেকে query করা যায়।
  • Raw, curated, reporting zone। কাঁচা file এক prefix বা bucket-এ অক্ষত রাখো, Glue পরিষ্কার Parquet লেখে curated zone-এ, যোগফলগুলো যায় reporting zone-এ। Job-এ bug থাকলে কাঁচা data আবার process করে সবসময় ঠিক করা যায়।
  • প্রতিটা app-এ না, lake-এই নিয়ন্ত্রণ করো। Lake Formation-এর grant আর data filter ছাঁটা copy-র জায়গা নেয়; QuickSight user-রা Athena দিয়ে সেই নিয়মই পান (lesson 17.5)।
  • Lesson 17.8 এই টুকরোগুলো জুড়ে একটা serverless big-data pipeline বানায়।

#নিজে করে দেখো

এই command-গুলো AWS CLI দিয়ে, এমন একটা account-এ যেটা নিজেই নিজের data lake admin। Bucket-এর নাম শেষ হয়েছে -example দিয়ে; তোমার নিজেরটা বসিয়ে নিও।

  1. ১. একটা catalog database আর একটা crawler বানাও

    aws glue create-database --database-input '{"Name":"shop_raw"}'
    
    aws glue create-crawler \
      --name orders-raw-crawler \
      --role arn:aws:iam::111122223333:role/GlueCrawlerRole \
      --database-name shop_raw \
      --targets '{"S3Targets":[{"Path":"s3://shop-raw-example/orders/"}]}' \
      --schedule "cron(15 * * * ? *)" \
      --schema-change-policy UpdateBehavior=UPDATE_IN_DATABASE,DeleteBehavior=LOG
    
    aws glue start-crawler --name orders-raw-crawler
    
  2. ২. Crawler কী খুঁজে পেল দেখো

    aws glue get-tables --database-name shop_raw \
      --query 'TableList[].{name:Name,cols:StorageDescriptor.Columns[].Name,parts:PartitionKeys[].Name}'
    # [
    #   {
    #     "name": "orders",
    #     "cols": ["order_id", "customer_id", "district", "amount", "created_at"],
    #     "parts": ["dt"]
    #   }
    # ]
    
  3. ৩. Bookmark চালু রেখে CSV-থেকে-Parquet job বানাও

    aws glue create-job \
      --name orders-to-parquet \
      --role arn:aws:iam::111122223333:role/GlueJobRole \
      --command Name=glueetl,ScriptLocation=s3://shop-scripts-example/orders_to_parquet.py,PythonVersion=3 \
      --glue-version 5.0 --worker-type G.1X --number-of-workers 10 \
      --default-arguments '{"--job-bookmark-option":"job-bookmark-enable","--enable-auto-scaling":"true"}'
    

    Script-এর মূল অংশ (PySpark): transformation_ctx দিয়ে catalog থেকে পড়ো, partition করা Parquet লেখো, bookmark commit করো।

    orders = glueContext.create_dynamic_frame.from_catalog(
        database="shop_raw", table_name="orders", transformation_ctx="orders_src")
    clean = orders.filter(lambda r: r["amount"] is not None and r["amount"] >= 0)
    glueContext.write_dynamic_frame.from_options(
        frame=clean, connection_type="s3", format="parquet",
        connection_options={"path": "s3://shop-curated-example/orders/", "partitionKeys": ["dt"]},
        transformation_ctx="orders_out")
    job.commit()   # without this, the bookmark is not saved
    
  4. ৪. চালাও, আর run-টা দেখো

    aws glue start-job-run --job-name orders-to-parquet
    # { "JobRunId": "jr_3f1c0e9a5b..." }
    
    aws glue get-job-run --job-name orders-to-parquet --run-id jr_3f1c0e9a5b... \
      --query 'JobRun.{state:JobRunState,secs:ExecutionTime,dpuSecs:DPUSeconds}'
    # { "state": "SUCCEEDED", "secs": 412, "dpuSecs": 3610.0 }
    

    সাথে সাথে আবার চালাও: bookmark চালু থাকায় দ্বিতীয় run কোনো নতুন file পায় না, এক মিনিটের কম সময়ে শেষ হয়। Bug ঠিক করার পরে সব আবার process করতে: aws glue reset-job-bookmark --job-name orders-to-parquet।

  5. ৫. Lake-টা Lake Formation-এর অধীনে আনো

    # Register the curated bucket; Lake Formation reads it with its service-linked role
    aws lakeformation register-resource \
      --resource-arn arn:aws:s3:::shop-curated-example --use-service-linked-role
    
    # Stop the IAM-only default for new databases and tables
    aws lakeformation put-data-lake-settings --data-lake-settings '{
      "DataLakeAdmins":[{"DataLakePrincipalIdentifier":"arn:aws:iam::111122223333:role/DataLakeAdmin"}],
      "CreateDatabaseDefaultPermissions":[], "CreateTableDefaultPermissions":[] }'
    
  6. ৬. আগে column, তারপর row grant করো

    # Marketing: only branch and amount
    aws lakeformation grant-permissions \
      --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:role/Marketing \
      --permissions SELECT \
      --resource '{"TableWithColumns":{"DatabaseName":"bank","Name":"branch_txn","ColumnNames":["branch","amount"]}}'
    
    # Dhaka manager: Dhaka rows, every column except nid
    aws lakeformation create-data-cells-filter --table-data '{
      "TableCatalogId":"111122223333","DatabaseName":"bank","TableName":"branch_txn",
      "Name":"dhaka_no_nid","RowFilter":{"FilterExpression":"branch = '\''Dhaka'\''"},
      "ColumnWildcard":{"ExcludedColumnNames":["nid"]} }'
    
    aws lakeformation grant-permissions \
      --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:role/DhakaManager \
      --permissions SELECT \
      --resource '{"DataCellsFilter":{"TableCatalogId":"111122223333","DatabaseName":"bank","TableName":"branch_txn","Name":"dhaka_no_nid"}}'
    

    এখন ঢাকার manager Athena-য় SELECT * FROM bank.branch_txn চালালে পান শুধু ঢাকার row, nid column ছাড়া।

  7. ৭. Tag দিয়ে access, তারপর পরিষ্কার করো

    aws lakeformation create-lf-tag --tag-key sensitivity --tag-values public pii
    aws lakeformation add-lf-tags-to-resource \
      --resource '{"Table":{"DatabaseName":"bank","Name":"branch_txn"}}' \
      --lf-tags TagKey=sensitivity,TagValues=public
    
    # Remove the demo
    aws glue delete-job --job-name orders-to-parquet
    aws glue delete-crawler --name orders-raw-crawler
    aws lakeformation deregister-resource --resource-arn arn:aws:s3:::shop-curated-example
    

#সারসংক্ষেপ

মূল কথাগুলো

  • Glue হলো Apache Spark-এর ওপর serverless, managed ETL: S3, JDBC database, DynamoDB আর stream থেকে extract, PySpark বা Scala দিয়ে transform, S3 বা Redshift-এ load। Bill হয় DPU-hour ধরে (৪ vCPU, 16 GB), সেকেন্ড হিসাবে, ১ মিনিটের minimum।
  • Glue নিজে event-driven না: job চলে হাতে চালালে, schedule-এ, আরেকটা job-এর পরে, বা S3 event থেকে Lambda বা EventBridge চালু করলে।
  • পরিচিত pattern: S3-এ CSV নামে → event → Lambda বা EventBridge → Glue job → আরেক bucket-এ Parquet → Athena অনেক কম scan করে। যেখানে লিখলে job আবার চালু হয়, সেখানে কখনো output লিখো না।
  • Glue Data Catalog হলো central metadata repository (location, schema, format, partition), যেটা ব্যবহার করে Athena, Redshift Spectrum, EMR, Glue আর Lake Formation। Crawler schema আর partition অনুমান করে; নতুন partition catalog-এ না ঢোকা পর্যন্ত অদৃশ্য।
  • Job bookmark বারবার process থামায়; এর জন্য transformation_ctx আর job.commit() লাগে, আর JDBC bookmark শুধু নতুন row দেখে। Studio হলো visual editor, DataBrew code ছাড়া পরিষ্কারের tool, Streaming ETL Kinesis, Kafka আর MSK পড়ে, Data Quality rule যাচাই করে। Elastic Views আর governed tables বন্ধ।
  • Lake Formation Glue-এর ওপর কয়েক দিনে data lake দাঁড় করায়: S3 location register, blueprint (database snapshot, incremental database, log file), duplicate সরানো, আর এক জায়গা থেকে fine-grained permission: column, row (data filter) আর cell, বড় মাপে LF-Tags, copy ছাড়া অন্য account-এর সাথে share।
  • এর নিয়ম খাটে শুধু integrated engine-এ: সরাসরি S3 access আর IAMAllowedPrincipals default সরাও, নইলে fine-grained grant পাশ কাটিয়ে যাওয়া যায়।