Dagster asset cho crawl pipeline: ba asset, metadata và chạy lại
Dagster asset cho crawl pipeline là cách mô tả một pipeline crawl thành các tài sản dữ liệu có tên, có phụ thuộc và có lịch sử, thay vì một chuỗi bước chạy theo lịch. Mỗi lần một asset được tạo lại, Dagster ghi một lần materialization kèm metadata như số URL, số trang lỗi, số dòng xuất ra. ProxyVN chạy Dagster 1.13.28 ngày 03/11/2026 với ba asset tải, phân tích và xuất dữ liệu trên một website giả lập, cố ý làm hỏng bước phân tích, rồi chạy lại chỉ phần cần thiết. Bài ghi lại đồ thị asset, nhật ký materialization và những gì Dagster không tự báo.
Dagster asset cho crawl pipeline: mục tiêu và phạm vi không lặp
Phần này chốt bài toán, đầu ra và ranh giới với các công cụ điều phối khác.
Bài toán
Một pipeline crawl gồm ba việc: tải HTML từ danh sách URL, trích giá từ HTML, xuất bảng giá ra tệp. Khi bước trích giá lỗi vì website đổi giao diện, người vận hành muốn sửa parser rồi chạy lại từ bước trích giá, không tải lại toàn bộ trang. Họ cũng muốn biết lần tải gần nhất lấy được bao nhiêu trang và trang nào lỗi.
Đầu ra nghiệm thu
Đầu ra gồm đồ thị asset cho thấy phụ thuộc giữa ba bước, và nhật ký materialization qua hai lần chạy, trong đó lần đầu có một asset thất bại. Nhật ký phải cho biết asset nào đã được tạo ở lần chạy nào, với metadata gì.
Ranh giới với Prefect, Luigi và Airflow
Prefect tập trung vào task và cơ chế thử lại. Luigi dựa vào tệp đích để quyết định việc đã xong chưa. Airflow lên lịch các task theo DAG. Dagster đặt trọng tâm vào chính dữ liệu: asset là thứ được tạo ra, materialization là bằng chứng nó đã được tạo, metadata mô tả nó.
Bài không viết lại cùng pipeline bằng bốn công cụ chỉ đổi decorator. Trọng tâm là những gì riêng của asset: phụ thuộc, metadata, lịch sử và chạy lại theo lựa chọn.
Không phải bài về crawler
Website trong lab là máy chủ HTTP cục bộ với tám trang sản phẩm, trong đó một trang trả 404 và một trang không có giá. Bài không bàn cách tải trang hiệu quả hay xử lý chặn. Phần tải chỉ đủ để có dữ liệu đi qua các asset.
Phiên bản đã khóa
Lab dùng dagster 1.13.28, Python 3.12 trên Windows. Lab chạy asset bằng hàm materialize trong cùng tiến trình với một instance tạm trong bộ nhớ, không mở giao diện web, không chạy daemon. Mọi con số lấy từ lần chạy này.
Vì sao không gộp ba bước vào một asset
Một asset duy nhất làm cả tải, phân tích và xuất thì đơn giản hơn. Nhưng khi parser lỗi, chạy lại asset đó nghĩa là tải lại toàn bộ trang. Với vài nghìn URL, việc tải lại tốn thời gian và tạo thêm tải cho website nguồn. Tách bước là để chạy lại rẻ và lịch sự với website.
Ai nên đọc
Người đang chạy crawl bằng tập lệnh cron và muốn có lịch sử rõ ràng hơn. Người đã dùng Dagster cho pipeline phân tích và muốn đưa bước crawl vào cùng đồ thị. Người cần chạy lại một phần pipeline mà không tải lại dữ liệu từ web.
Biểu diễn fetch parse export thành Dagster assets có phụ thuộc và metadata với Dagster asset cho crawl pipeline
Trước khi viết mã, cần nắm vài khái niệm của Dagster.
Asset là gì
Theo trang Defining assets trong tài liệu Dagster, asset là một đối tượng lưu trữ bền vững như bảng, tệp hay mô hình, được định nghĩa bằng một hàm Python có decorator asset. Hàm mô tả cách tạo ra asset. Dagster lo việc gọi hàm theo đúng thứ tự phụ thuộc.
Materialization
Materialization là một lần chạy hàm asset thành công, tạo ra phiên bản mới của asset. Mỗi materialization được ghi vào instance kèm mã lần chạy và metadata. Lịch sử materialization trả lời câu hỏi asset này được tạo lần cuối khi nào, bởi lần chạy nào.
Phụ thuộc bằng deps
Asset khai báo phụ thuộc bằng tham số deps. Lab dùng deps thay vì truyền dữ liệu qua tham số hàm, vì mỗi asset tự ghi và đọc tệp trên đĩa. Cách này giữ dữ liệu crawl ngoài bộ lưu trữ mặc định của Dagster, hợp với dữ liệu lớn.
Metadata
Hàm asset có thể trả về MaterializeResult kèm metadata. Metadata là cặp khóa và giá trị, có thể là số, chuỗi, JSON, Markdown hay đường dẫn. Dagster lưu metadata cùng materialization. Với crawl, metadata hữu ích nhất là số URL, số trang thành công, danh sách lỗi HTTP và mã của danh sách URL.
Ba asset của lab
raw_pages tải tám URL và ghi HTML ra tệp raw.json. parsed_prices đọc raw.json, trích giá và ghi parsed.json. exported_csv đọc parsed.json và ghi gia.csv. Mỗi asset phụ thuộc asset trước nó.
Instance là nơi giữ lịch sử
Instance là thành phần lưu nhật ký sự kiện và lịch sử materialization. Lab dùng instance tạm trong bộ nhớ, mất khi tiến trình kết thúc. Môi trường thật dùng instance lưu trên đĩa hoặc cơ sở dữ liệu. Mọi khả năng đối soát trong bài đều dựa vào instance, nên chọn instance lưu bền là việc đầu tiên khi đưa vào dùng thật.
Đồ thị đọc từ định nghĩa

Đồ thị asset
Lab dựng Definitions từ ba asset rồi đọc đồ thị. Kết quả: raw_pages không có cha, parsed_prices có cha là raw_pages, exported_csv có cha là parsed_prices. Đồ thị này đến từ khai báo deps, không phải từ thứ tự viết hàm.
Định nghĩa raw, parsed và exported assets với phụ thuộc trong Dagster asset cho crawl pipeline
Phần này trình bày mã của ba asset.
Asset tải trang
@asset(group_name="crawl", description="Tai HTML cac URL trong manifest")
def raw_pages(context):
pages, codes = {}, {}
for u in URLS:
try:
r = urllib.request.urlopen(u, timeout=5)
codes[u] = r.status; pages[u] = r.read().decode()
except urllib.error.HTTPError as e:
codes[u] = e.code
json.dump(pages, open("out/raw.json", "w", encoding="utf-8"))
return MaterializeResult(metadata={
"so_url": len(URLS),
"so_200": sum(c == 200 for c in codes.values()),
"loi_http": MetadataValue.json({u: c for u, c in codes.items() if c != 200}),
"manifest_sha": sha256(json.dumps(URLS))[:16]})
Asset ghi HTML của trang thành công, đồng thời ghi metadata về toàn bộ lần tải. Trang lỗi không có trong raw.json, nhưng có trong metadata loi_http.
Asset phân tích
@asset(group_name="crawl", deps=[raw_pages])
def parsed_prices(context):
pages = json.load(open("out/raw.json", encoding="utf-8"))
rows = []
for u, h in pages.items():
p = re.search(r"class='price'>([^<]*)<", h).group(1)
p = p.replace(".", "").replace("đ", "")
rows.append({"url": u, "price": int(p)})
json.dump(rows, open("out/parsed.json", "w"))
return MaterializeResult(metadata={"so_dong": len(rows)})
Phiên bản đầu gọi int trên chuỗi giá mà không kiểm chuỗi rỗng. Trang sản phẩm 4 không có giá, nên phiên bản này sẽ lỗi.
Regex là điểm yếu dễ đoán
Parser trong lab dùng biểu thức chính quy tìm thẻ có class price. Website đổi tên class là parser trả về không khớp, và asset sẽ lỗi ở dòng group. Đây là kiểu lỗi phổ biến nhất của crawl. Tách parser thành asset riêng giúp sửa và chạy lại nhanh mỗi khi website đổi giao diện.
Asset xuất
Asset exported_csv đọc parsed.json, ghi gia.csv với hai cột url và price, trả metadata số dòng và đường dẫn tệp. Không có gì đặc biệt, ngoài việc nó chỉ chạy được khi parsed_prices đã thành công.
Ghi lỗi HTTP thay vì ném lỗi
Asset tải không ném lỗi khi một trang trả 404. Nó ghi mã lỗi vào metadata rồi đi tiếp. Nếu ném lỗi, một trang hỏng sẽ làm cả lần tải thất bại và không có trang nào được lưu. Với crawl, vài trang lỗi là bình thường. Ngưỡng bao nhiêu lỗi thì dừng là quyết định riêng, nên đặt thành điều kiện rõ ràng trong hàm.
Timeout cho từng trang
Lab đặt timeout 5 giây cho mỗi trang. Không có timeout, một trang treo có thể giữ asset chạy mãi. Dagster không tự đặt timeout cho mã bên trong asset. Đặt timeout ở thư viện HTTP là cách đơn giản nhất.
group_name
Ba asset cùng nhóm crawl. Trong giao diện web, nhóm giúp gom asset của một pipeline lại với nhau. Với nhiều nguồn crawl, mỗi nguồn một nhóm là cách đặt tên dễ theo dõi.
Tệp trên đĩa thay vì IO manager
Dagster có IO manager để lưu giá trị trả về của asset. Lab không dùng, mà để asset tự ghi tệp. Lý do là dữ liệu crawl thường lớn và cần định dạng riêng. Hệ quả là Dagster không biết tệp nằm đâu, trừ khi ta ghi đường dẫn vào metadata như asset xuất làm.
Chỗ đặt URL manifest
Danh sách URL nằm trong mã. Ngoài thực tế, nó nên là một asset riêng hoặc một tệp cấu hình có phiên bản. Lab ghi mã SHA-256 của danh sách vào metadata để biết lần tải nào dùng danh sách nào. Khi danh sách đổi, mã đổi theo.
Gắn metadata URL manifest và row count khi materialize trong Dagster asset cho crawl pipeline
Phần này chạy lần đầu và đọc metadata.
Lệnh chạy
inst = DagsterInstance.ephemeral()
r = materialize([raw_pages, parsed_prices, exported_csv],
instance=inst, raise_on_error=False)
raise_on_error bằng False để lần chạy lỗi không ném ngoại lệ ra ngoài, cho phép đọc sự kiện sau đó. Instance tạm sống trong bộ nhớ của tiến trình, đủ để giữ lịch sử giữa hai lần chạy trong cùng tiến trình.
Metadata của raw_pages
Lần chạy đầu, raw_pages thành công với metadata: so_url bằng 8, so_200 bằng 7, loi_http chứa URL sản phẩm 7 với mã 404, manifest_sha bằng 96ef379915810124.
Chỉ nhìn metadata là biết lần tải này thiếu một trang và trang nào thiếu. Không cần mở tệp raw.json.
Trang 404 biến mất khỏi dữ liệu
raw.json chỉ chứa bảy trang thành công. Các asset sau không thấy URL sản phẩm 7. Tệp gia.csv cuối cùng có bảy dòng, không có dòng nào cho sản phẩm 7. Thông tin về trang lỗi chỉ còn trong metadata của raw_pages.
Đây là điểm cần quyết định. Nếu người dùng bảng giá cần biết sản phẩm nào không lấy được, phải đưa URL lỗi vào dữ liệu, ví dụ một dòng với giá rỗng và cột trạng thái. Dagster không tự làm điều đó.
Mã manifest giúp gì
Mã SHA-256 của danh sách URL là dấu vân tay ngắn gọn. Hai lần tải có cùng mã nghĩa là cùng danh sách, nên so số trang thành công giữa chúng là công bằng. Hai lần tải khác mã thì phải xem danh sách đã thêm hay bớt URL nào trước khi kết luận về tỷ lệ lỗi.
Metadata dạng Markdown
Lab ghi thêm danh sách URL dạng Markdown vào metadata manifest. Trong giao diện web, trường này hiện thành danh sách đọc được. Với vài nghìn URL, trường này quá dài. Nên chỉ ghi mã SHA và đường dẫn tới tệp danh sách.
Metadata giúp so hai lần tải
Khi có nhiều materialization của raw_pages, so metadata giữa các lần cho thấy xu hướng. so_200 giảm dần qua các ngày là dấu hiệu website đang chặn dần hoặc đổi cấu trúc URL. manifest_sha đổi nghĩa là danh sách URL đã thay đổi, nên số trang khác là chuyện bình thường. Không có metadata, những thay đổi này chỉ lộ ra khi dữ liệu cuối cùng sai.
Đếm dòng ở mỗi bước
Mỗi asset ghi số dòng của mình. So số dòng giữa các bước cho biết dữ liệu rơi ở đâu. Tám URL, bảy trang, bảy dòng phân tích, bảy dòng xuất. Nếu số dòng phân tích nhỏ hơn số trang, parser đã bỏ qua trang nào đó.
Metadata không phải kiểm tra
Metadata chỉ ghi lại, không chặn gì. so_200 bằng 1 trên 8 vẫn là một materialization thành công. Muốn chặn khi tỷ lệ lỗi cao, phải tự ném lỗi trong hàm asset, hoặc dùng asset check của Dagster. Lab chưa thử asset check.
Làm một asset lỗi rồi xem downstream bị ảnh hưởng với Dagster asset cho crawl pipeline
Phần này đọc kết quả của bước lỗi.
Lần chạy 1 thất bại
Lần chạy đầu có success bằng False, trạng thái run là FAILURE. Sự kiện cho thấy raw_pages thành công, parsed_prices thất bại. Lỗi gốc là ValueError: invalid literal for int() with base 10 với chuỗi rỗng, đúng trang sản phẩm 4 không có giá.
Lỗi gốc nằm trong cause
Sự kiện STEP_FAILURE mang lỗi bọc ngoài là DagsterExecutionStepExecutionError. Lỗi thật nằm ở trường cause của lỗi đó. Người đọc nhật ký chỉ nhìn dòng đầu sẽ thấy một tên lỗi chung chung của Dagster. Phải đọc cause mới thấy ValueError và chuỗi gây lỗi.
Downstream không chạy, cũng không báo bỏ qua

Asset phía sau bị chặn
exported_csv trong lần chạy 1 chỉ có một sự kiện: ASSET_MATERIALIZATION_PLANNED, nghĩa là đã được lên kế hoạch. Không có sự kiện bắt đầu, không có sự kiện thành công, cũng không có sự kiện bỏ qua. Nó đơn giản là không được chạy vì cha của nó lỗi.
Khi đọc nhật ký, cần hiểu rằng asset có kế hoạch mà không có materialization là asset bị chặn bởi lỗi phía trên. Đừng tìm lỗi trong exported_csv.
Một lần chạy, nhiều trạng thái
Lần chạy 1 thất bại về tổng thể, nhưng bên trong có một asset thành công, một asset lỗi và một asset không chạy. Trạng thái FAILURE của run không nói hết câu chuyện. Khi báo cáo sự cố, nên liệt kê trạng thái từng asset thay vì chỉ nói lần chạy lỗi.
Tệp cũ vẫn nằm trên đĩa
Vì exported_csv không chạy, tệp gia.csv từ lần chạy trước, nếu có, vẫn còn nguyên. Ai đọc tệp mà không xem Dagster sẽ tưởng dữ liệu mới. Đây là lý do nên ghi thời gian hoặc mã lần chạy vào chính tệp xuất, hoặc đọc dữ liệu qua Dagster thay vì đọc thẳng tệp.
Lỗi chạy khác lỗi dữ liệu
ValueError trong lab là lỗi mã: parser không lường trước trang không có giá. Lỗi kiểu này làm asset thất bại. Ngược lại, parser đúng nhưng trích ra giá sai là lỗi dữ liệu, asset vẫn thành công. Dagster chỉ thấy loại thứ nhất. Loại thứ hai cần kiểm riêng, bằng asset check hay bằng công cụ kiểm chất lượng dữ liệu.
raw_pages vẫn được ghi nhận
Dù lần chạy thất bại, materialization của raw_pages đã được ghi. Lịch sử cho thấy raw_pages có một phiên bản mới từ lần chạy 1. Lần chạy lỗi không xóa bước đã thành công.
Đừng sửa bằng cách bỏ qua mọi lỗi
Cách sửa nhanh là bọc toàn bộ vòng lặp trong try và bỏ qua mọi lỗi. Asset sẽ luôn thành công, nhưng mọi trang có cấu trúc lạ đều biến mất khỏi dữ liệu mà không ai biết. Cách sửa trong lab xử lý đúng một trường hợp đã biết là chuỗi rỗng, và đếm số trường hợp đó vào metadata.
Sửa parser
Phiên bản sửa của parsed_prices kiểm chuỗi rỗng: chuỗi rỗng thành giá None, chuỗi có số thành số nguyên. Metadata ghi thêm thieu_gia để đếm số dòng không có giá. Đây là sửa ở mã, không phải ở dữ liệu.
Chạy lại asset cần thiết và đối soát materialization history trong Dagster asset cho crawl pipeline
Phần này chạy lại từ bước lỗi và đọc lịch sử.
Chọn asset để chạy lại

Chạy lại từ bước lỗi
r = materialize([raw_pages, parsed_prices, exported_csv], instance=inst,
selection="parsed_prices*", raise_on_error=False)
Cú pháp parsed_prices kèm dấu sao nghĩa là parsed_prices và mọi asset phía sau nó. raw_pages không nằm trong lựa chọn nên không chạy lại. Trang web không bị tải lại.
Lần chạy 2 thành công
Lần chạy 2 có success bằng True. parsed_prices tạo bảy dòng, thieu_gia bằng 1. exported_csv tạo bảy dòng và ghi đường dẫn out/gia.csv. Dòng sản phẩm 4 trong tệp có giá rỗng.
Lịch sử sau hai lần chạy
Asset |
Số materialization |
Lần chạy |
Metadata chính |
|---|---|---|---|
raw_pages |
1 |
lần 1 |
8 URL, 7 trang 200, 1 lỗi 404 |
parsed_prices |
1 |
lần 2 |
7 dòng, 1 thiếu giá |
exported_csv |
1 |
lần 2 |
7 dòng, out/gia.csv |
raw_pages chỉ có một materialization, từ lần chạy 1. parsed_prices và exported_csv mỗi asset một materialization, từ lần chạy 2. Lần chạy 1 không để lại materialization nào cho hai asset này.
Đọc lịch sử bằng mã
Lab đọc lịch sử bằng fetch_materializations trên instance, truyền khóa asset. Kết quả là danh sách bản ghi, mỗi bản ghi có mã lần chạy và metadata. Cách đọc này dùng được trong tập lệnh kiểm tra tự động, ví dụ báo động khi raw_pages không có materialization mới trong 26 giờ.
Đối soát bằng mã lần chạy
Bảng trên cho thấy dữ liệu xuất ra ở lần 2 dựa trên trang tải ở lần 1. Mã lần chạy là cầu nối. Nếu ai hỏi bảng giá này từ lần tải nào, câu trả lời là lần chạy có mã bắt đầu bằng 240e8b02, kèm metadata manifest_sha.
Chạy lại cả đồ thị
Nếu không truyền selection, materialize chạy cả ba asset. raw_pages sẽ tải lại tám trang, tạo materialization thứ hai. Trong lab, điều này không gây hại. Với website thật, tải lại khi không cần là thêm tải vô ích cho máy chủ nguồn, và có thể làm tăng nguy cơ bị chặn.
Khi nào phải tải lại
Chạy lại từ parsed_prices chỉ đúng khi lỗi nằm ở parser. Nếu lỗi nằm ở dữ liệu tải về, ví dụ nhận trang thử thách thay vì trang sản phẩm, phải chạy lại cả raw_pages. Metadata của raw_pages giúp quyết định: so_200 thấp bất thường thì tải lại.
Dữ liệu cũ của bước trên
Dagster không ngăn bạn chạy parsed_prices trên raw.json đã cũ vài ngày. Giao diện web có thể đánh dấu asset phía sau là cũ hơn asset phía trước, nhưng lab không mở giao diện nên chưa xác nhận cách hiển thị. Trong mã, có thể đọc thời điểm materialization cuối của raw_pages và từ chối chạy nếu quá cũ.
Lịch chạy theo asset
Dagster cho lên lịch theo job hoặc tự materialize khi asset phía trên thay đổi. Với crawl, lịch thường đặt ở asset tải, các asset sau chạy theo. Lab không thử lịch chạy, chỉ gọi materialize bằng tay. Nguyên tắc chọn asset để chạy lại vẫn giữ nguyên khi có lịch.
Nhiều nguồn, một đồ thị
Khi crawl nhiều website, mỗi nguồn có bộ ba asset riêng. Asset tổng hợp cuối cùng có thể phụ thuộc vào tất cả asset xuất của các nguồn. Một nguồn lỗi chỉ chặn nguồn đó và asset tổng hợp, các nguồn khác vẫn có materialization mới.
Đầu ra nghiệm thu: asset graph và materialization log với một asset thất bại của Dagster asset cho crawl pipeline
Phần cuối gom kết quả thành bộ bàn giao.
Bộ bàn giao
Bộ bàn giao gồm tệp lab.py định nghĩa ba asset và máy chủ giả lập, đồ thị asset in từ Definitions, nhật ký hai lần chạy với sự kiện và metadata, tệp gia.csv cuối cùng. Người nhận chạy lại lab.py, phải thấy lần 1 lỗi ở parsed_prices với ValueError, lần 2 thành công, raw_pages chỉ có một materialization.
Tiêu chí đạt
Đồ thị đúng ba nút và hai cạnh. Asset lỗi ghi lỗi gốc đọc được. Asset phía sau không chạy khi cha lỗi. Chạy lại theo lựa chọn không tải lại trang. Lịch sử cho biết mỗi asset được tạo ở lần chạy nào.
Quy tắc khi dựng crawl bằng asset
Tách tải, phân tích, xuất thành asset riêng để chạy lại từng phần. Ghi metadata về số URL, số lỗi, danh sách lỗi và mã manifest ở asset tải. Đưa URL lỗi vào dữ liệu nếu người dùng cần biết. Đọc lỗi ở trường cause. Ghi mã lần chạy vào tệp xuất.
Khi nào cần proxy với Dagster asset cho crawl pipeline
Dagster không tải trang, hàm asset của bạn mới tải. Proxy, nếu cần, đặt trong mã của asset raw_pages hoặc trong thư viện HTTP mà nó dùng. Ba asset còn lại xử lý tệp trên đĩa, không cần mạng.
Với website được phép thu thập nhưng hiển thị theo vùng, có lúc cần IP tại Việt Nam để nhận đúng trang. Khi đó anh em có thể mua proxy tĩnh Việt Nam tại trang chủ ProxyVN, rồi cấu hình cho riêng asset tải. Proxy không sửa parser và không làm materialization thành công hơn nếu mã sai. Vai trò hợp lệ của proxy trong thu thập dữ liệu được phân tích ở bài Web Scraping proxy là gì.
Proxy chỉ ở asset tải
Đặt cấu hình proxy trong asset tải, không đặt biến môi trường cho cả tiến trình Dagster. Biến môi trường chung sẽ áp lên mọi kết nối, kể cả kết nối tới cơ sở dữ liệu của instance hay kho dữ liệu nội bộ. Giới hạn proxy trong đúng chỗ cần giúp tránh những lỗi kết nối khó hiểu ở các asset khác.
Ghi nhãn cấu hình mạng vào metadata
Nếu raw_pages có thể chạy qua nhiều cấu hình mạng, ghi nhãn cấu hình vào metadata, ví dụ vn-static hoặc không dùng proxy. Không ghi chuỗi proxy có mật khẩu, vì metadata hiện trong giao diện và lưu lâu dài. Cách viết chuỗi proxy đúng định dạng có trong bài định dạng proxy.
Ai đọc nhật ký
Nhật ký materialization có ích cho người vận hành pipeline. Người dùng bảng giá cuối cùng thường không mở Dagster. Nên đưa một phần metadata ra chỗ họ thấy, ví dụ ghi vào tệp xuất thời điểm tải, số trang lỗi và mã lần chạy. Như vậy người dùng tự biết bảng mình đang đọc có đầy đủ hay không.
Giữ lại tệp trung gian
raw.json và parsed.json là tệp trung gian. Giữ lại vài phiên bản gần nhất cho phép chạy lại phân tích trên lần tải cũ khi cần điều tra. Nên đặt tên tệp theo mã lần chạy thay vì ghi đè một tệp duy nhất như lab làm, để mỗi materialization trỏ được tới đúng dữ liệu của nó.
Những gì lab chưa thử
Lab chưa mở giao diện web, chưa thử daemon và lịch chạy, chưa thử asset check, partition theo ngày, hay IO manager. Lab cũng chưa thử instance lưu bền trên đĩa, nên lịch sử chỉ sống trong một tiến trình. Môi trường thật cần instance có cơ sở dữ liệu để giữ lịch sử qua nhiều ngày.
Checklist Dagster asset cho crawl pipeline

Checklist
- Ba asset tải, phân tích, xuất, nối bằng deps.
- Asset tải ghi số URL, số trang thành công, lỗi HTTP, mã manifest.
- Quyết định có đưa URL lỗi vào dữ liệu hay không.
- Đọc lỗi gốc ở trường cause của STEP_FAILURE.
- Hiểu asset có kế hoạch mà không chạy là bị chặn bởi cha lỗi.
- Chạy lại bằng selection, chỉ tải lại khi lỗi ở dữ liệu tải.
- Ghi mã lần chạy vào tệp xuất.
- Không ghi chuỗi proxy có mật khẩu vào metadata.
Câu hỏi thường gặp về Dagster asset cho crawl pipeline
Asset khác task thế nào?
Task là việc cần làm. Asset là dữ liệu được tạo ra, có lịch sử materialization và metadata riêng.
Asset phía sau có chạy khi asset phía trước lỗi không?
Không. Lab cho thấy exported_csv chỉ có sự kiện lên kế hoạch, không có sự kiện chạy hay bỏ qua.
Chạy lại có phải tải lại trang không?
Không, nếu chọn từ asset phân tích trở đi. Lab chạy lại bằng selection parsed_prices kèm dấu sao, raw_pages giữ nguyên một materialization.
Vì sao lỗi hiện là DagsterExecutionStepExecutionError?
Đó là lỗi bọc ngoài. Lỗi thật nằm ở trường cause, trong lab là ValueError.
Metadata có chặn được dữ liệu xấu không?
Không. Metadata chỉ ghi lại. Muốn chặn phải ném lỗi trong hàm asset hoặc dùng asset check.
Dagster có cần proxy không?
Không. Chỉ mã tải trang trong asset raw_pages mới có thể cần.
Dagster asset cho crawl pipeline và những điều cần nhớ
Dagster asset cho crawl pipeline biến pipeline crawl thành ba tài sản có lịch sử, chạy lại được từng phần. Lab trên Dagster 1.13.28 cho thấy asset lỗi chặn asset phía sau mà không ghi sự kiện bỏ qua, lỗi gốc nằm ở trường cause, và chạy lại theo lựa chọn giữ nguyên lần tải cũ. Trang 404 chỉ còn trong metadata, không có trong dữ liệu xuất, nên cần quyết định có đưa nó vào hay không. Cần IP tĩnh cho asset tải trang trước khi chạy Dagster asset cho crawl pipeline, liên hệ Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam.