PageSourceSearch

https://marquezproject.ai/assets/js/bf8e7e8e.7669315b.js

js marquezproject.ai collected 2026-10-02 04:09:44 UTC 20,123 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkmarquez_website_docs=self.webpackChunkmarquez_website_docs||[]).push([[2453],{65488:(e,a,t)=>{t.d(a,{Z:()=>d});var r=t(87462),n=t(67294),l=t(86010),o=t(72389),s=t(67392),i=t(7094),p=t(12466);const u={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function m(e){const{lazy:a,block:t,defaultValue:o,values:m,groupId:d,className:c}=e,h=n.Children.map(e.children,(e=>{if((0,n.isValidElement)(e)&&"value"in e.props)return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})),k=m??h.map((e=>{let{props:{value:a,label:t,attributes:r}}=e;return{value:a,label:t,attributes:r}})),g=(0,s.l)(k,((e,a)=>e.value===a.value));if(g.length>0)throw new Error(`Docusaurus error: Duplicate values "${g.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`);const f=null===o?o:o??h.find((e=>e.props.default))?.props.value??h[0].props.value;if(null!==f&&!k.some((e=>e.value===f)))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${f}" but none of its children has the corresponding value. Available values are: ${k.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);const{tabGroupChoices:b,setTabGroupChoices:N}
1=(0,i.U)(),[w,_]=(0,n.useState)(f),y=[],{blockElementScrollPositionUntilNextRender:v}=(0,p.o5)();if(null!=d){const e=b[d];null!=e&&e!==w&&k.some((a=>a.value===e))&&_(e)}const T=e=>{const a=e.currentTarget,t=y.indexOf(a),r=k[t].value;r!==w&&(v(a),_(r),null!=d&&N(d,String(r)))},q=e=>{let a=null;switch(e.key){case"Enter":T(e);break;case"ArrowRight":{const t=y.indexOf(e.currentTarget)+1;a=y[t]??y[0];break}case"ArrowLeft":{const t=y.indexOf(e.currentTarget)-1;a=y[t]??y[y.length-1];break}}a?.focus()};return n.createElement("div",{className:(0,l.Z)("tabs-container",u.tabList)},n.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.Z)("tabs",{"tabs--block":t},c)},k.map((e=>{let{value:a,label:t,attributes:o}=e;return n.createElement("li",(0,r.Z)({role:"tab",tabIndex:w===a?0:-1,"aria-selected":w===a,key:a,ref:e=>y.push(e),onKeyDown:q,onClick:T},o,{className:(0,l.Z)("tabs__item",u.tabItem,o?.className,{"tabs__item--active":w===a})}),t??a)}))),a?(0,n.cloneElement)(h.filter((e=>e.props.value===w))[0],{className:"margin-top--md"}):n.createElement("div",{className:"margin-top--md"},h.map(((e,a)=>(0,n.cloneElement)(e,{key:a,hidden:e.props.value!==w})))))}function d(e){const a=(0,o.Z)();return n.createElement(m,(0,r.Z)({key:String(a)},e))}},34952:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>p,toc:()=>m});var r=t(87462),n=(t(67294),t(3905)),l=t(65488),o=t(85162);const s={title:"Apache Airflow\xae Tutorial",template:"basepage",sidebar_position:2,description:"Get started with Marquez and Airflow."},i=void 0,p={unversionedId:"tutorials/airflow_tutorial/index",id:"tutorials/airflow_tutorial/index",title:"Apache Airflow\xae Tutorial",description:"Get started with Marquez and Airflow.",source:"@site/docs/tutorials/airflow_tutorial/index.mdx",sourceDirName:"tutorials/airflow_tutorial",slug:"/tutorials/airflow_tutorial/",permalink:"/docs/tutorials/airflow_tutorial/",draft:!1,editUrl:"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/tutorials/airflow_tutorial/index.mdx",tags:[],version:"current",sidebarPosition:2,frontMatter:{title:"Apache Airflow\xae Tutorial",template:"basepage",sidebar_position:2,description:"Get started with Marquez and Airflow."},sidebar:"tutorialSidebar",previous:{title:"Tutorials",permalink:"/docs/category/tutorials"},next:{title:"Metadata API",permalink:"/docs/category/metadata-api"}},u={},m=[{value:"Table of Contents",id:"table-of-contents",level:2},{value:"Get and start Marquez",id:"get-marquez",level:2},{value:"Configure Airflow to send events to Marquez",id:"configure-airflow",level:2},{value:"View Airflow operational analytics and data lineage in Marquez",id:"view-airflow",level:2},{value:"Datasets lineage graph",id:"datasets-lineage-graph",level:3},{value:"Leveraging the Marquez graph",id:"leveraging-the-marquez-graph",level:3},{value:"Next steps",id:"next-steps",level:2},{value:"Feedback?",id:"feedback",level:2}],d={toc:m},c="wrapper";function h(e){let{components:a,...s}=e;return(0,n.kt)(c,(0,r.Z)({},d,s,{components:a,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"table-of-contents"},"Table of Contents"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"#prerequisites"},"Prerequisites")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"#get-marquez"},"Get and start Marquez")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"#configure-airflow"},"Configure Apache Airflow to send events to Marquez")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"#view-airflow"},"View Airflow operational analytics and data lineage in Marquez")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"#next-steps"},"Next steps")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"#feedback"},"Feedback?"))),(0,n.kt)("h1",{id:"prerequisites"},"Prerequisites"),(0,n.kt)("p",null,"Before you begin, make sure you have installed:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.docker.com/install"},"Docker 17.05+")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://airflow.apache.org/docs/apache-airflow/stable/start.html"},"Airflow 2.8+")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.postgresql.org"},"PostgreSQL 14+")))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://gitforwindows.org/"},"Git Bash")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://www.postgresql.org/"},"PostgreSQL 14+")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.docker.com/install"},"Docker 17.05+")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install"},"Docker Compose")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://airflow.apache.org/docs/apache-airflow/stable/start.html"},"Airflow 2.8+"))))),(0,n.kt)("h2",{id:"get-marquez"},"Get and start Marquez"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"To check out the Marquez source code, run:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ git clone https://github.com/MarquezProject/marquez && cd marquez\n"))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ git config --global core.autocrlf false\n$ git clone https://github.com/MarquezProject/marquez && cd marquez\n"))))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Both Airflow and Marquez require port 5432 for their metastores, but the Marquez services are easier to configure. You can also assign the database service to a new port on the fly. To start Marquez using port 2345 for the database, run:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ ./docker/up.sh --db-port 2345\n"))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("p",{parentName:"li"}
1,"Verify that Postgres and Bash are in your ",(0,n.kt)("inlineCode",{parentName:"p"},"PATH"),", then run:"),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ sh ./docker/up.sh --db-port 2345\n"))))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"To view the Marquez UI and verify it's running, open ",(0,n.kt)("a",{parentName:"p",href:"http://localhost:3000"},"http://localhost:3000"),". The UI allows you to: "),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"view cross-platform dependencies, meaning you can see the jobs across the tools in your ecosystem that produce or consume a critical table."),(0,n.kt)("li",{parentName:"ul"},"view run-level metadata of current and previous job runs, enabling you to see the latest status of a job and the update history of a dataset."),(0,n.kt)("li",{parentName:"ul"},"get a high-level view of resource usage, allowing you to see trends in your operations.")))),(0,n.kt)("h2",{id:"configure-airflow"},"Configure Airflow to send events to Marquez"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"To configure Airflow to emit OpenLineage events to Marquez, you need to define an OpenLineage transport. One way you can do this is by using an environment variable. To use ",(0,n.kt)("inlineCode",{parentName:"p"},"http")," and send events to the Marquez API running locally on port ",(0,n.kt)("inlineCode",{parentName:"p"},"5000"),", run:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ export AIRFLOW__OPENLINEAGE__TRANSPORT=\'{"type": "http", "url": "http://localhost:5000", "endpoint": "api/v1/lineage"}\'\n'))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},'$ set AIRFLOW__OPENLINEAGE__TRANSPORT=\'{"type": "http", "url": "http://localhost:5000", "endpoint": "api/v1/lineage"}\'\n'))))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"You also need to define a namespace for Airflow jobs. It can be any string. Run:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ export AIRFLOW__OPENLINEAGE__NAMESPACE='my-team-airflow-instance'\n"))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ set AIRFLOW__OPENLINEAGE__NAMESPACE='my-team-airflow-instance'\n"))))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"To add the required Airflow OpenLineage Provider package to your Airflow environment, run:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ pip install apache-airflow-providers-openlineage\n"))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ pip install apache-airflow-providers-openlineage\n"))))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"To enable adding a Postgres connection for this tutorial, run:"),(0,n.kt)(l.Z,{groupId:"os",mdxType:"Tabs"},(0,n.kt)(o.Z,{value:"macos",label:"MacOS/Linux",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ pip install apache-airflow-providers-postgres\n"))),(0,n.kt)(o.Z,{value:"windows",label:"Windows",mdxType:"TabItem"},(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-bash"},"$ pip install apache-airflow-providers-postgres\n"))))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Create a database in your local Postgres instance and create an Airflow Postgres connection using the default ID (",(0,n.kt)("inlineCode",{parentName:"p"},"postgres_default"),"). For help with the former, see: ",(0,n.kt)("a",{parentName:"p",href:"https://www.postgresql.org/docs/"},"Postgres Documentation"),". For help with the latter, see: ",(0,n.kt)("a",{parentName:"p",href:"https://airflow.apache.org/docs/apache-airflow/stable/howto/connection.html#managing-connections"},"Managing Connections"),".")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Add a flaky DAG to Airflow that will ",(0,n.kt)("em",{parentName:"p"},"often")," create a table in the Postgres database:"),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-py"},'from __future__ import annotations\nimport time\nimport random\n\nimport pendulum\nfrom airflow.decorators import dag, task\nfrom airflow.operators.empty import EmptyOperator\nfrom airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator\nfrom airflow.datasets import Dataset\n\nSQL="""CREATE TABLE IF NOT EXISTS airflowsample (\n    col1 VARCHAR(255), \n    col2 VARCHAR(255)\n)"""\n\n@dag(\n    schedule=\'@hourly\',\n    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),\n    catchup=False,\n    tags=["example"],\n    dag_display_name="Flaky DAG",\n)\n\ndef example_display_name_brkn():\n\n    sample_task_1 = EmptyOperator(\n        task_id="sample_task_1",\n        task_display_name="Sample Task 1",\n    )\n\n    sample_task_2 = SQLExecuteQueryOperator(\n        task_id="sample_task_3",\n        sql=SQL,\n        conn_id="postgres_default",\n    )\n\n    @task(\n        task_display_name="Sample Task 3",\n        outlets=[Dataset("sample_pg_table")]\n    )\n    def sample_task_3():\n        pers = [0, 60, 120, \'fail\']\n        per = random.choice(pers)\n        time.sleep(per)\n\n    sample_task_1 >>
1 sample_task_2 >> sample_task_3()\n\nexample_display_name_brkn()\n\n'))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Add another DAG that updates and then drops the Postgres table:"),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre",className:"language-py"},'from __future__ import annotations\nimport time\nimport random\n\nimport pendulum\nfrom airflow.decorators import dag, task\nfrom airflow.operators.empty import EmptyOperator\nfrom airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator\nfrom airflow.datasets import Dataset\n\nSQL_1="INSERT INTO airflowsample (col1) VALUES (\'row\')"\n\nSQL_2="DROP TABLE airflowsample"\n\n@dag(\n    schedule=[Dataset("sample_pg_table")],\n    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),\n    catchup=False,\n    tags=["example"],\n)\n\ndef example_insert_brkn():\n\n    sample_task_1 = EmptyOperator(\n        task_id="sample_insert_task_1",\n        task_display_name="Sample Task 1",\n    )\n\n    sample_task_2 = SQLExecuteQueryOperator(\n        task_id="sample_insert_task_2",\n        sql=SQL_1,\n        conn_id="postgres_default",\n    )\n\n    sample_task_3 = SQLExecuteQueryOperator(\n        task_id="sample_insert_task_3",\n        sql=SQL_2,\n        conn_id="postgres_default",\n    )\n\n    sample_task_1 >> sample_task_2 >> sample_task_3\n\nexample_insert_brkn()\n\n')),(0,n.kt)("p",{parentName:"li"},"This DAG is scheduled on the dataset passed to the ",(0,n.kt)("inlineCode",{parentName:"p"},"sample_task_3")," in the first DAG, so it will run automatically when that DAG completes a run.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Run your DAGs by triggering the ",(0,n.kt)("inlineCode",{parentName:"p"},"Flaky DAG"),". To verify that the OpenLineage Provider is configured correctly, check the task logs for an ",(0,n.kt)("inlineCode",{parentName:"p"},"INFO"),"-level log reporting the transport type you defined. In this case, the log will say: ",(0,n.kt)("inlineCode",{parentName:"p"},"OpenLineageClient will use http transport"),"."))),(0,n.kt)("h2",{id:"view-airflow"},"View Airflow operational analytics and data lineage in Marquez"),(0,n.kt)("p",null,"The DataOps view offers a high-level view of historical and in-process operations, including task-level run status and runtime information:"),(0,n.kt)("p",null,(0,n.kt)("img",{src:t(20068).Z,width:"1199",height:"881"})),(0,n.kt)("h3",{id:"datasets-lineage-graph"},"Datasets lineage graph"),(0,n.kt)("p",null,"In the Datasets view, click on the dataset to get a cross-platform-capable lineage graph. In this case, you will be able to see the upstream tasks across the two DAGs in your environment that feed the ",(0,n.kt)("inlineCode",{parentName:"p"},"airflowsample")," table in Airflow:"),(0,n.kt)("p",null,(0,n.kt)("img",{src:t(40528).Z,width:"1443",height:"535"})),(0,n.kt)("admonition",{type:"info"},(0,n.kt)("p",{parentName:"admonition"},"Dependencies in other platforms that modify or consume the same dataset will also appear in this graph.")),(0,n.kt)("h3",{id:"leveraging-the-marquez-graph"},"Leveraging the Marquez graph"),(0,n.kt)("p",null,"When data produced by multiple tools in your data ecosystem arrives late or becomes stale, root-cause analysis is much easier when you know:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"what jobs and datasets are upstream."),(0,n.kt)("li",{parentName:"ul"},"what the run status of each upstream job is."),(0,n.kt)("li",{parentName:"ul"},"how each upstream job has performed recently."),(0,n.kt)("li",{parentName:"ul"},"whether quality issues have affected upstream datasets.")),(0,n.kt)("p",null,"In the Marquez lineage graph, you can click on an upstream job node to see information including:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"the latest run status."),(0,n.kt)("li",{parentName:"ul"},"the last runtime."),(0,n.kt)("li",{parentName:"ul"},"the time last started."),(0,n.kt)("li",{parentName:"ul"},"the time last finished.")),(0,n.kt)("p",null,(0,n.kt)("img",{src:t(80730).Z,width:"1221",height:"412"})),(0,n.kt)("p",null,"You can also access a versioned table schema history from the Marquez graph, so you can see at a glance if data quality in a table has become compromised and when a loss occurred:"),(0,n.kt)("p",null,(0,n.kt)("img",{src:t(82208).Z,width:"1468",height:"641"})),(0,n.kt)("h2",{id:"next-steps"},"Next steps"),(0,n.kt)("p",null,"Continue your journey with Marquez by consulting the following resources:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://openlineage.io/docs/guides/airflow-backfill-dags"},"Backfilling Airflow DAGs Using Marquez")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://openlineage.io/docs/guides/dbt"},"Using Marquez with dbt")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://openlineage.io/docs/guides/spark"},"Using OpenLineage with Spark"))),(0,n.kt)("h2",{id:"feedback"},"Feedback?"),(0,n.kt)("p",null,"What did you think of this guide? You can reach out to us on ",(0,n.kt)("a",{parentName:"p",href:"https://join.slack.com/t/marquezproject/shared_invite/zt-2iylxasbq-GG_zXNcJdNrhC9uUMr3B7A"},"slack")," and leave us feedback, or ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/MarquezProject/marquez/blob/main/CONTRIBUTING.md#submitting-a-pull-request"},"open a pull request")," with your suggestions!"))}h.isMDXComponent=!0},80730:(e,a,t)=>{t.d(a,{Z:()=>r});const r=t.p+"assets/images/brkn_detail_lrg-fea0ede06f30872ff615318819197e22.png"},40528:(e,a,t)=>{t.d(a,{Z:()=>r});const r=t.p+"assets/images/brkn_graph-f9d2723c64370a43594bd61c27b2b53e.png"},20068:(e,a,t)=>{t.d(a,{Z:()=>r});const r=t.p+"assets/images/marquez_dataops-76bc7bf92d3eb9ab41fc1a30d458b2a9.png"},82208:(e,a,t)=>{t.d(a,{Z:()=>r});const r=t.p+"assets/images/marquez_dataset_versions-bd3762939df4443d77b0423548d1fd2c.png"}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.