┌─────────────────────────────────────────────────────────────────┐
│ ETL Pipeline Architecture │
└─────────────────────────────────────────────────────────────────┘
┌──────────────────┐
│ Data Sources │
│ (CSV Files) │
└────────┬─────────┘
│
▼
┌──────────────────────────────┐
│ EXTRACT LAYER │
│ ┌────────────────────────┐ │
│ │ • CSV Reader │ │
│ │ • Encoding Detection │ │
│ │ • Error Handling │ │
│ └────────────────────────┘ │
└────────┬─────────────────────┘
│
▼
┌──────────────────────────────┐
│ TRANSFORM LAYER │
│ ┌────────────────────────┐ │
│ │ • Column Normalization │ │
│ │ • Data Cleaning │ │
│ │ • Type Conversion │ │
│ │ • Deduplication │ │
│ └────────────────────────┘ │
└────────┬─────────────────────┘
│
▼
┌──────────────────────────────┐
│ LOAD LAYER │
│ ┌────────────────────────┐ │
│ │ • Batch Insert │ │
│ │ • Connection Pooling │ │
│ │ • Error Handling │ │
│ └────────────────────────┘ │
└────────┬─────────────────────┘
│
▼
┌──────────────────┐
│ PostgreSQL │
│ Database │
└──────────────────┘
┌──────────────────────────────────────────┐
│ Supporting Infrastructure │
├──────────────────────────────────────────┤
│ • Logging (File & Console) │
│ • Health Checks │
│ • Configuration Management │
│ • Error Handling & Retries │
│ • Performance Monitoring │
│ • REST API & Scheduler │
│ • Database Migrations │
│ • Data Validation │
└──────────────────────────────────────────┘
Responsibilities:
- Read CSV files from
data/raw/ - Detect and handle encoding automatically
- Validate file structure
- Handle large files with streaming
Features:
- Automatic encoding detection (UTF-8, UTF-16, Latin-1, etc.)
- Error handling with custom ExtractionError
- Logging of extraction metrics
- Support for custom delimiters
Flow:
CSV File → Detect Encoding → Read Data → Validate → Return DataFrame
Responsibilities:
- Normalize column names (snake_case, lowercase)
- Clean and validate data
- Handle missing values
- Deduplicate records
- Convert data types
Features:
- Column name normalization
- Removal of special characters
- Type inference and conversion
- Duplicate row removal
- Logging of transformation stats
Flow:
DataFrame → Normalize Columns → Clean Data → Deduplicate → Type Conversion → Validated DataFrame
Responsibilities:
- Connect to PostgreSQL database
- Create tables if needed
- Insert data in batches
- Handle connection pooling
- Retry on failure
Features:
- Connection pooling for performance
- Batch insert for efficiency
- Automatic table creation
- Error handling and retries
- Transaction management
Flow:
DataFrame → Prepare Data → Batch Insert → Commit → Log Results
Responsibilities:
- Load environment variables from
.env - Validate configuration
- Provide access to settings
- Support different environments
- Support optional AWS helper configuration via
config/aws_config.yamland dataset definitions inconfig/domains.yaml
Key Classes:
DatabaseConfig: Database connection settingsPipelineConfig: Pipeline execution settingsConfig: Main configuration container
Responsibilities:
- Check database connectivity
- Verify file system accessibility
- Validate dependencies
- Generate status reports
Checks:
- Database health
- File system availability
- Dependencies installation
Responsibilities:
- Track schema versions
- Apply migrations safely
- Support rollbacks
- Maintain migration history
Features:
- Version tracking
- Execution time logging
- Rollback support
- Migration status reporting
Responsibilities:
- Configure logging for the application
- Manage log rotation
- Validate logging setup
- Provide logger instances
Log Files:
logs/pipeline.log: All logslogs/errors.log: Error logs only
Responsibilities:
- Provide REST endpoints for pipeline control
- Schedule periodic executions
- Report pipeline status
- Expose health information
Endpoints:
GET /health: Health checkPOST /api/v1/pipeline/run: Trigger pipelineGET /api/v1/pipeline/status: Pipeline statusGET /api/v1/pipeline/config: ConfigurationPOST /api/v1/scheduler/schedule: Schedule execution
1. INITIALIZATION
└─ Load configuration from .env
└─ Initialize logging
└─ Run health checks
└─ Apply database migrations
2. EXTRACTION PHASE
└─ Scan data/raw/ for CSV files
└─ Read each file with encoding detection
└─ Collect statistics (rows, columns)
3. TRANSFORMATION PHASE
└─ Normalize column names
└─ Clean and validate data
└─ Remove duplicates
└─ Convert data types
└─ Save to data/processed/
4. LOADING PHASE
└─ Connect to PostgreSQL
└─ Create/verify tables
└─ Batch insert data
└─ Commit transactions
5. REPORTING
└─ Log final statistics
└─ Report errors
└─ Generate audit trail
6. CLEANUP
└─ Close database connections
└─ Finalize logs
-- cars table
CREATE TABLE cars (
id SERIAL PRIMARY KEY,
make VARCHAR(255),
model VARCHAR(255),
year INTEGER
);
-- dealers table
CREATE TABLE dealers (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
location VARCHAR(255)
);
-- sales table
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
car_id INTEGER REFERENCES cars(id),
dealer_id INTEGER REFERENCES dealers(id),
price DECIMAL(10, 2),
sale_date DATE
);
-- schema_migrations table (for migration tracking)
CREATE TABLE schema_migrations (
id SERIAL PRIMARY KEY,
version VARCHAR(255) UNIQUE,
description TEXT,
installed_on TIMESTAMP,
execution_time_ms INTEGER
);Services:
1. db (PostgreSQL 15)
- Persistent volume for data
- Environment variables for config
- Health checks
2. etl (Python Application)
- Depends on db service
- Mounts data volumes
- Runs pipeline on startup┌─────────────────────┐
│ Error Occurs │
└──────────┬──────────┘
│
▼
┌──────────────┐
│ Log Error │
└──────┬───────┘
│
▼
┌────────────────────┐
│ Retry? (if < max) │
└─────┬──────────┬───┘
│ Yes │ No
│ ▼
│ ┌─────────────┐
│ │ Report Error│
│ └─────┬───────┘
│ │
└───────┬───┘
│
▼
┌────────────────┐
│ Continue/Stop │
└────────────────┘
-
Chunked Processing
- Default: 10,000 rows per chunk
- Configurable via
CHUNK_SIZE
-
Connection Pooling
- Reuses database connections
- Reduces connection overhead
-
Batch Inserts
- Groups multiple rows
- Reduces database round trips
-
Parallel Processing (Future)
- Process multiple files concurrently
- Utilize multi-core systems
- Files processed
- Rows extracted/transformed/loaded
- Execution time
- Error count
- Memory usage
- Database response time
- DEBUG: Detailed execution information
- INFO: General progress and statistics
- WARNING: Recoverable issues
- ERROR: Unrecoverable errors
- CRITICAL: System failures
-
Database Credentials
- Stored in
.env(not in version control) - Use strong passwords
- Consider encrypted secrets in production
- Stored in
-
File Permissions
- Data directories protected from unauthorized access
- Log files contain sensitive information
-
Input Validation
- CSV files validated before processing
- SQL injection prevention via parameterized queries
-
API Security (Future)
- Authentication/authorization
- Rate limiting
- HTTPS/TLS encryption
-
Partition Data
- Split files by source system
- Process in parallel
-
Optimize Database
- Add indexes on key columns
- Use partitioned tables
-
Infrastructure
- Use Kubernetes for orchestration
- Distribute across multiple nodes
- Use managed database services
- API authentication & authorization
- Advanced scheduling (Airflow integration)
- Data quality monitoring
- Web dashboard
- Incremental/CDC support
- Multiple data sources (APIs, databases)
- Data lineage tracking
- Advanced error recovery