IPython magic commands to interact with HDFS via WebHDFS/Knox
Project description
webhdfsmagic
webhdfsmagic is a Python package that provides IPython magic commands to interact with HDFS via WebHDFS/Knox Gateway directly from your Jupyter notebooks.
๐ Why webhdfsmagic?
Simplify your HDFS interactions in Jupyter:
Before (with PyWebHdfsClient):
from pywebhdfs.webhdfs import PyWebHdfsClient
hdfs = PyWebHdfsClient(host='...', port='...', user_name='...', ...)
data = hdfs.read_file('/data/file.csv')
df = pd.read_csv(BytesIO(data))
Now (with webhdfsmagic):
%hdfs get /data/file.csv .
df = pd.read_csv('file.csv')
93% less code! โจ
๐ฌ See it in Action
Complete workflow demo: mkdir โ put โ ls โ cat โ get โ chmod โ rm
โจ Features
| Command | Description |
|---|---|
%hdfs ls [path] |
List files and directories (returns pandas DataFrame) |
%hdfs mkdir <path> |
Create directory (parents created automatically) |
%hdfs put <local> <hdfs> |
Upload one or more files (supports wildcards *.csv) |
%hdfs get <hdfs> <local> |
Download files (supports wildcards and ~ for home directory) |
%hdfs cat <file> [-n lines] [--format type] [--raw] |
Display file content with smart formatting for CSV/Parquet |
%hdfs rm [-r] <path> |
Delete files/directories (-r for recursive, supports wildcards) |
%hdfs chmod [-R] <mode> <path> |
Change permissions (-R for recursive) |
%hdfs chown [-R] <user:group> <path> |
Change owner (-R for recursive, requires superuser) |
๐ฆ Installation
pip install webhdfsmagic
Install from source:
git clone https://github.com/ab2dridi/webhdfsmagic.git
cd webhdfsmagic
pip install -e .
# Enable autoload (creates startup script)
jupyter-webhdfsmagic
๐ง Configuration
Automatic Loading
After installation, enable autoload to have webhdfsmagic load automatically in all Jupyter sessions:
jupyter-webhdfsmagic
This creates ~/.ipython/profile_default/startup/00-webhdfsmagic.py so the extension loads automatically.
Alternative: Load manually in each notebook:
%load_ext webhdfsmagic
Configuration File
Create ~/.webhdfsmagic/config.json:
{
"knox_url": "https://hostname:port/gateway/default",
"webhdfs_api": "/webhdfs/v1",
"username": "your_username",
"password": "your_password",
"verify_ssl": false
}
SSL Options:
"verify_ssl": falseโ Disable SSL verification (development only)"verify_ssl": trueโ Use system certificates"verify_ssl": "/path/to/cert.pem"โ Use custom certificate (supports~)
Configuration Examples:
See examples/config/ for complete configurations (with/without SSL, custom certificate, etc.)
Sparkmagic Fallback:
If ~/.webhdfsmagic/config.json doesn't exist, the package tries ~/.sparkmagic/config.json and extracts configuration from kernel_python_credentials.url.
Logging & Debugging
All operations are automatically logged to ~/.webhdfsmagic/logs/webhdfsmagic.log for debugging and auditing purposes.
Log Features:
- โ Automatic rotation (10MB per file, keeps 5 backups)
- โ Detailed HTTP request/response logging
- โ Operation tracing with timestamps
- โ Error tracking with full stack traces
- โ Password masking for security
- โ File-level DEBUG logging
- โ Console-level WARNING/ERROR logging
View Recent Logs:
# View last 50 lines
tail -50 ~/.webhdfsmagic/logs/webhdfsmagic.log
# Follow logs in real-time
tail -f ~/.webhdfsmagic/logs/webhdfsmagic.log
# Search for errors
grep "ERROR" ~/.webhdfsmagic/logs/webhdfsmagic.log
# View specific operation
grep "hdfs put" ~/.webhdfsmagic/logs/webhdfsmagic.log
Log Format:
2025-12-08 10:30:15 - webhdfsmagic - INFO - [magics.py:145] - >>> Starting operation: hdfs ls
2025-12-08 10:30:15 - webhdfsmagic - DEBUG - [client.py:85] - HTTP Request: GET http://...
2025-12-08 10:30:15 - webhdfsmagic - DEBUG - [client.py:105] - HTTP Response: 200 from http://...
2025-12-08 10:30:15 - webhdfsmagic - INFO - [magics.py:180] - <<< Operation completed: hdfs ls - SUCCESS
๐ก Usage
# The extension is already loaded automatically!
%hdfs help
# List files
%hdfs ls /data
# Create a directory
%hdfs mkdir /user/hdfs/output
# Upload multiple CSV files using wildcards
%hdfs put ~/data/*.csv /user/hdfs/input/
# Download a file to home directory
%hdfs get /user/hdfs/results/output.csv ~/downloads/
# Download multiple files with wildcards
%hdfs get /user/hdfs/results/*.csv ./local_results/
# ===== SMART CAT (File Preview) =====
# Display first 50 lines (default grid table format)
%hdfs cat /user/hdfs/data/file.csv -n 50
# Smart CSV formatting with automatic table display
%hdfs cat /user/hdfs/data/sales.csv
# Display Parquet file as table
%hdfs cat /user/hdfs/data/records.parquet -n 20
# Pandas format (classic DataFrame representation)
%hdfs cat /user/hdfs/data/data.csv --format pandas
# Polars format (shows schema + explicit types, 3.7x faster for Parquet!)
%hdfs cat /user/hdfs/data/records.parquet --format polars
# Raw text display (unformatted original content)
%hdfs cat /user/hdfs/data/file.csv --raw
# ===== File Management =====
# Delete files with wildcards
%hdfs rm /user/hdfs/temp/*.log
# Delete a directory recursively
%hdfs rm -r /user/hdfs/temp
# Change permissions recursively
%hdfs chmod -R 755 /user/hdfs/data
# Change owner recursively (requires superuser privileges)
%hdfs chown -R hdfs:hadoop /user/hdfs/data
Integration with pandas:
# Download and read directly
%hdfs get /data/sales.csv .
df = pd.read_csv('sales.csv')
df.head()
๐ฏ Advanced Features
Wildcard Operations
Upload, download, and delete multiple files using shell-style wildcards:
# Upload all CSV files
%hdfs put data/*.csv /hdfs/input/
# Download specific pattern
%hdfs get /hdfs/output/result_*.csv ./downloads/
# Delete log files
%hdfs rm /hdfs/temp/*.log
Smart File Formatting (CSV & Parquet)
Automatically format structured files as readable tables:
# CSV files are automatically detected and formatted
%hdfs cat /data/sales.csv
# โโโโโโโโโโโโโโฌโโโโโโโโโโฌโโโโโโโโโ
# โ date โ product โ amount โ
# โโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโค
# โ 2025-12-08 โ laptop โ 1200 โ
# โ 2025-12-09 โ phone โ 800 โ
# โโโโโโโโโโโโโโดโโโโโโโโโโดโโโโโโโโโ
# Parquet files work seamlessly
%hdfs cat /data/records.parquet -n 100
# TSV and other delimiters are auto-detected
%hdfs cat /data/data.tsv # Detects tab delimiter
# Force specific format
%hdfs cat /data/file.csv --format pandas # Pandas DataFrame (classic)
%hdfs cat /data/file.csv --format polars # Polars with schema and types
%hdfs cat /data/file.csv --raw # Raw text, no formatting
# Supported formats:
# - CSV (comma, tab, semicolon, pipe - auto-detected)
# - Parquet (uses Polars for 3.7x faster processing)
# - TSV (tab-separated values)
๐ Format Options Explained:
- Default (grid): Beautiful ASCII table, perfect for reports
--format pandas: Classic pandas display, familiar to data scientists--format polars: Shows schema with explicit types (str, i64, f64, bool) - ideal for data validation--raw: Original file content without any parsing
๐ Performance: Parquet files are processed using Polars, providing ultra-fast reads and minimal memory usage (3.7x faster than PyArrow+Pandas).
Memory Protection: By default, the cat command limits downloads to 50 MB to prevent memory saturation. This protection applies when using -n <lines> option. To read entire large files, use -n -1:
# Safe: Limited to 50 MB download
%hdfs cat /huge_file.csv -n 100
# Full read: No memory limit (use with caution on large files)
%hdfs cat /small_file.csv -n -1
โ ๏ธ Large Parquet Files: Files > 100 MB will show a warning recommending to download first with %hdfs get for better performance.
๐ Built-in Help System
Get detailed help directly in your notebook:
# Show all available commands with descriptions
%hdfs help
This displays a comprehensive interactive help with:
- All available commands (ls, mkdir, put, get, cat, rm, chmod, chown)
- Options and flags for each command
- Format descriptions for the
catcommand - Auto-detection features explanation
The help command is always available and shows the most up-to-date documentation for your installed version.
Recursive Permissions
Apply permission changes to entire directory trees:
# Recursive chmod
%hdfs chmod -R 755 /hdfs/project/
# Recursive chown (requires superuser)
%hdfs chown -R hdfs:hadoop /hdfs/project/
Home Directory Expansion
Use ~ as a shortcut for your home directory:
# Download to home directory
%hdfs get /hdfs/file.csv ~/downloads/
# Works in subdirectories too
%hdfs get /hdfs/data/*.csv ~/projects/analysis/
๐ Documentation and Examples
- examples/demo.ipynb - Full demo with real HDFS cluster (Docker)
- examples/examples.ipynb - Examples with mocked tests (no cluster needed)
- examples/config/ - Configuration file examples
- ROADMAP.md - Upcoming features
๐งช Testing
Unit tests (no HDFS cluster required):
pytest tests/ -v
Test with Docker HDFS cluster:
# Start the demo environment
cd demo
docker-compose up -d
# Wait 30 seconds for initialization
sleep 30
# Configure webhdfsmagic (if not already done)
mkdir -p ~/.webhdfsmagic
cat > ~/.webhdfsmagic/config.json << 'EOF'
{
"knox_url": "http://localhost:8080/gateway/default",
"webhdfs_api": "/webhdfs/v1",
"username": "testuser",
"password": "testpass",
"verify_ssl": false
}
EOF
# Test with demo notebook
cd ..
jupyter notebook examples/demo.ipynb
See demo/README.md for complete Docker environment documentation.
๐ Troubleshooting
Check Logs
All operations are logged to ~/.webhdfsmagic/logs/webhdfsmagic.log:
# View recent activity
tail -50 ~/.webhdfsmagic/logs/webhdfsmagic.log
# Check for errors
grep -i "error" ~/.webhdfsmagic/logs/webhdfsmagic.log
# View specific command execution
grep "hdfs put" ~/.webhdfsmagic/logs/webhdfsmagic.log -A 5
Common Issues
Connection Errors:
- Check Knox gateway URL in
~/.webhdfsmagic/config.json - Verify SSL settings (
verify_ssl: falsefor testing) - Check logs for HTTP error details
Authentication Errors:
- Verify username/password in config
- Check if credentials have expired
- Review authentication errors in logs
File Transfer Issues:
- Check local file paths exist
- Verify HDFS paths are absolute (start with
/) - Review detailed HTTP request/response in logs
- Check disk space on both local and HDFS
Permission Errors:
- Verify HDFS user permissions
- Check file/directory ownership in HDFS
- Review operation logs for specific error messages
๐ค Contributing
Contributions are welcome! To contribute:
- Fork the project
- Create a branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'feat: add new feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
Testing and code quality:
# Run tests
pytest tests/ -v
# Check code style
ruff check .
ruff format .
๐ License
This project is licensed under the MIT License. See LICENSE for details.
๐ Links
- PyPI: https://pypi.org/project/webhdfsmagic/
- GitHub: https://github.com/ab2dridi/webhdfsmagic
- Issues: https://github.com/ab2dridi/webhdfsmagic/issues
๐ฌ Contact
For questions or suggestions, open an issue on GitHub.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file webhdfsmagic-0.0.3.tar.gz.
File metadata
- Download URL: webhdfsmagic-0.0.3.tar.gz
- Upload date:
- Size: 33.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b3b3048a21ff64530d3237806769e8c9a0bace2b6d06f1b843d5ac28fcf6e12
|
|
| MD5 |
81dc315d5ecc3b8092efa80dd3d0bbac
|
|
| BLAKE2b-256 |
18c853b1f8cdadfefa6296a3b149d3af89c144b4679a11990d5152d23ec38771
|
File details
Details for the file webhdfsmagic-0.0.3-py3-none-any.whl.
File metadata
- Download URL: webhdfsmagic-0.0.3-py3-none-any.whl
- Upload date:
- Size: 30.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b13b9847b3a85be115d1da877beb6799649fa5d7c401f17d6cf10b1c3a5c0154
|
|
| MD5 |
1f209ec0c789dcb1b12952fd69e0c3c4
|
|
| BLAKE2b-256 |
88e2a9d480fca3ed984a46805054a6a1becfc31d285f4744353062b216e744aa
|