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 সস্তা আর নিরাপদ হওয়ার আগে তিনটা কাজ সারতে হয়:
- রূপান্তর (Transform): data পরিষ্কার করা, আর query-র উপযোগী format-এ নেওয়া (columnar Parquet, compress করা, partition করা)। এটাই ETL, আর AWS-এর serverless ETL service হলো AWS Glue।
- বর্ণনা (Describe): প্রতিটা dataset কী, লিখে রাখা: কোথায় থাকে, কী কী column, কোন type, কোন partition। এটা Glue Data Catalog, যেটা crawler নিজে নিজে ভরে দেয়।
- নিয়ন্ত্রণ (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 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 খুঁজে পায়।
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 করেছে, আর শুধু নতুনগুলো পড়ে।
প্রথম রাত। তিনটা file অপেক্ষা করছে: a, b আর c। Job তিনটাই পড়ে, কারণ সে আগে কখনো চলেনি।
#Glue Studio, DataBrew, Streaming ETL আর Data Quality
| Feature | এটা কী | কখন নেবে |
|---|---|---|
| Glue Studio | Glue ETL job বানানো, চালানো আর নজর রাখার visual interface: source, transform আর target টেনে এনে বসাও; Spark script Glue নিজে লেখে। Notebook-ও আছে | হাতে Spark না লিখে job বানাতে; job run-এর খবর রাখতে |
| Glue DataBrew | Data পরিষ্কার আর একরকম করার visual tool, ২৫০-টার বেশি তৈরি transformation সহ (তারিখ ঠিক করা, duplicate সরানো, column ভাগ করা, PII ঢাকা), কোনো code ছাড়া | যে analyst আর data scientist নিজেরাই data প্রস্তুত করেন |
| Glue Streaming ETL | Apache 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-এ তোলা।
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, এক জায়গা থেকে চালানো:
- S3 location-টা Lake Formation-এ register করো, এমন একটা role দিয়ে যেটা দিয়ে Lake Formation নিজে ওটা পড়ে।
- Database, table আর column-এ Lake Formation permission grant করো (
SELECT,INSERT,DESCRIBE,ALTER…), IAM user আর role, Identity Center-এর user আর group, SAML user, বা অন্য AWS account-কে। - Row আর cell-এর জন্য বানাও data filter: একটা row filter expression (
branch = 'Dhaka') আর একটা column তালিকা; দুটো মিলে cell-level security। - 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 পড়ে।
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 দিয়ে; তোমার নিজেরটা বসিয়ে নিও।
১. একটা 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২. 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"] # } # ]৩. 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৪. চালাও, আর 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।৫. 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":[] }'৬. আগে 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,nidcolumn ছাড়া।৭. 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 আর
IAMAllowedPrincipalsdefault সরাও, নইলে fine-grained grant পাশ কাটিয়ে যাওয়া যায়।
আগে নিজে উত্তর দাও, তারপর ব্যাখ্যাটা পড়ো। ঠিক হলেও পড়ো, কারণ ভুল Option-গুলো কেন ভুল, সেটাও ওখানে আছে।
নিজেকে যাচাই করোপ্রশ্ন
AWS Glue কী?
নিজেকে যাচাই করোপ্রশ্ন
Note-এ Glue-কে event-driven ETL service বলা হয়েছে। কোন কথাটা ঠিক?
নিজেকে যাচাই করোপ্রশ্ন
Glue Data Catalog কী রাখে?
নিজেকে যাচাই করোপ্রশ্ন
Glue crawler কী করে?
নিজেকে যাচাই করোপ্রশ্ন
AWS Glue-এ এক DPU মানে কী?
নিজেকে যাচাই করোপ্রশ্ন
Slide অনুযায়ী কোন তিনটা service data discovery-র জন্য Glue Data Catalog পড়ে?
নিজেকে যাচাই করোপ্রশ্ন
AWS Glue DataBrew কীসের জন্য?
নিজেকে যাচাই করোপ্রশ্ন
ঢাকার একটা e-commerce shop প্রতি ঘণ্টার order file CSV হিসেবে একটা S3 bucket-এ ফেলে। Analyst-রা Athena দিয়ে query করেন, আর মাসিক bill বাড়তেই থাকে, কারণ প্রতিটা query সব CSV scan করে। টিম চায় serverless উপায়ে, সবচেয়ে কম পরিচালনার ঝামেলায়, প্রতিটা নতুন file partition করা Parquet-এ রূপান্তর হোক। Architect কী করবেন?
নিজেকে যাচাই করোপ্রশ্ন
একটা S3 event যোগ করার পর, যেটা Glue job চালু করে, টিম দেখছে ঘণ্টায় হাজার হাজার job run আর বাড়তে থাকা bill। Job পড়ে s3://shop-data-example/ থেকে আর Parquet লেখে s3://shop-data-example/parquet/-এ। Event notification-এ কোনো prefix filter নেই। সবচেয়ে সম্ভাব্য কারণ কী?
নিজেকে যাচাই করোপ্রশ্ন
একটা Glue job প্রতি রাতে s3://wallet-raw-example/txn/-এর ওপর চলে। Job নতুন করে বানানোর পর থেকে প্রতিটা run পুরো মাস আবার process করছে, আর target table-এ duplicate জমছে। সবচেয়ে কম পরিশ্রমে কী ঠিক করবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা Glue job-এ bookmark চালু, তবু প্রতিটা run সব file আবার process করছে। Script create_dynamic_frame.from_catalog দিয়ে পড়ে transformation_ctx ছাড়া, আর কখনো job.commit() call করে না। সমস্যা কোথায়?
নিজেকে যাচাই করোপ্রশ্ন
একটা Glue job orders table-এ order_id key ধরে incremental JDBC bookmark ব্যবহার করে। Order তৈরি হওয়ার কয়েক দিন পরে তার status pending থেকে delivered হয়, আর lake-এ নতুন status কখনো আসে না। কেন?
নিজেকে যাচাই করোপ্রশ্ন
আজ সকালে s3://meters-example/readings/dt=2026-10-30/ নামে নতুন একটা folder এসেছে, কিন্তু Athena ওই দিনের কোনো row দেখাচ্ছে না। আগের দিনগুলো ঠিক আছে। সবচেয়ে ভালো দুটো সমাধান কী?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
s3://landing-example/-এ চালানো একটা crawler একটার বদলে ৪৭টা table বানিয়েছে। Folder-এ আছে shop-এর CSV, app-এর JSON আর কয়েকটা Excel export। সবচেয়ে ভালো সমাধান কী?
নিজেকে যাচাই করোপ্রশ্ন
একটা ride-sharing কোম্পানি চায় তাদের Amazon MSK cluster-এর trip event পরিষ্কার হয়ে, Parquet-এ রূপান্তর হয়ে, এক মিনিটের মধ্যে S3-এ লেখা হোক, কোনো server সামলানো ছাড়া, আর টিমে Spark জানা লোক আগে থেকেই আছে। কোন service সবচেয়ে মানানসই?
নিজেকে যাচাই করোপ্রশ্ন
AWS Glue নিয়ে কোন দুটো কথা সত্য?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
রাতের একটা Glue job ১০টা DPU দিয়ে ৩০ মিনিট চলে, দাম প্রতি DPU-hour US$0.44। একবার চালাতে খরচ কত?
নিজেকে যাচাই করোপ্রশ্ন
পরীক্ষার একটা option বলছে, একটা DynamoDB table-এর Redshift copy হালনাগাদ রাখতে AWS Glue Elastic Views নাও। তোমার কী জানা দরকার?
নিজেকে যাচাই করোপ্রশ্ন
AWS Lake Formation কী?
নিজেকে যাচাই করোপ্রশ্ন
Lake Formation কোন তিন ধরনের blueprint দেয়?
নিজেকে যাচাই করোপ্রশ্ন
একটা bank সব branch-এর লেনদেন রাখে S3 data lake-এর একটা table-এ। Head office-এর auditor-রা সব দেখবেন; প্রত্যেক branch manager দেখবেন শুধু নিজের branch-এর row, national ID column কখনোই না; query চলে Athena আর QuickSight দিয়ে। Bank চায় data-র একটাই copy আর এক জায়গা থেকে নিয়ন্ত্রণ। Architect কী নেবেন?
নিজেকে যাচাই করোপ্রশ্ন
শুধু S3 bucket policy আর IAM দিয়ে কেন একজন user-কে Parquet table-এর কিছু column-এ access দেওয়া যায় না?
নিজেকে যাচাই করোপ্রশ্ন
একটা data lake-এ ৩,০০০ table। Security টিম চায় marketing public sales data হিসেবে চিহ্নিত সব table আর column পড়তে পারুক, আগামী মাসে বানানো table সহ, একটা একটা করে grant না দিয়ে। কী ব্যবহার করবে?
নিজেকে যাচাই করোপ্রশ্ন
Finance account আর একটা sister concern-এর account-কে কেন্দ্রীয় data lake account-এর table query করতে হবে, data copy না করে, producer-এর column বাধা মেনে। কোন দুটো ধাপ উত্তরের অংশ?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
Lake Formation-এ grant দেওয়া হয়েছে, যাতে analyst-রা customers table-এর মাত্র তিনটা column দেখেন, কিন্তু Athena-য় তাঁরা এখনো সব column দেখছেন। Table বানানো হয়েছিল default setting-এ। সবচেয়ে সম্ভাব্য কারণ কী?
নিজেকে যাচাই করোপ্রশ্ন
একজন data scientist এখনো boto3 দিয়ে Parquet file download করা একটা Python script চালিয়ে সেই national ID column পড়তে পারছেন, যেটা Lake Formation লুকায়। Architect ফাঁকটা কীভাবে বন্ধ করবেন?
নিজেকে যাচাই করোপ্রশ্ন
Lake Formation নিয়ে কোন দুটো কথা সত্য?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
“Data lake বানানোর সময় common key নেই এমন record-এর duplicate সরানো” আর “code ছাড়া চোখে দেখে data পরিষ্কার করা”, এই দুটোর সাথে কোন দুটো মেলে?
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা কোম্পানি বছরে একবার audit-এর জন্য data রূপান্তর করে: 2 TB-র একটা CSV table থেকে Parquet। আরেকটা টিম প্রতি ঘণ্টায় নতুন order file রূপান্তর করে, খারাপ row বাদ দেয়, আর দুটো target-এ লেখে। কোন জোড়াটা সবচেয়ে উপযুক্ত?
নিজেকে যাচাই করোপ্রশ্ন
২০২৬-এ Lake Formation governed tables নিয়ে কোন কথাটা ঠিক?
নিজেকে যাচাই করোপ্রশ্ন
Glue Data Catalog নিয়ে কোন কথাটা সত্য নয় (NOT)?