跳转到主要内容

一个独立网络服务,用于解析CKAN站点数据文件的(CSV,TSV,Excel和ODS)内容,并将其推送到其数据存储中。通过qsv加速。

项目描述

DataPusher+

DataPusher+是Datapusher的分支,结合了ckanext-xloader的速度和健壮性与Datapusher的数据类型猜测。

DataPusher+使用CKAN Service Provider构建,用Messytables替换为qsv

TNRIS/TWDB提供了使用案例,这些案例为Datapusher+的开发提供了信息和支持,特别是为了支持资源优先上传工作流程

有关更详细的概述,请参阅CKAN每月直播2023年1月演示

它具有以下特点

  • 使用qsv的“万无一失”的超快速数据类型推断

    与仅扫描前几行来猜测列类型的Messytables不同,qsv扫描整个表格,因此其数据类型推断是保证的[^1]。

    尽管如此,即使扫描整个文件,qsv 仍然呈指数级地更快,因为它不仅推断数据类型,还计算摘要统计。例如,扫描一个包含270万行、124MB的CSV文件以获取类型和统计信息花费了0.16秒[^2]。

    由于qsv是用Rust编写的,是多线程的,并使用各种性能技术,特别是针对数据处理而设计的,所以它非常快。

  • 指数级快速加载速度

    类似于xloader,我们使用PostgreSQL COPY直接将数据管道输入数据存储,绕过Datapusher使用的额外处理/转换/API调用。

    但与xloader不同,我们使用适当的数据类型加载所有内容,而不是作为文本,因此不需要像xloader那样在调整数据字典后重新加载数据。

  • 存储效率更高且性能更好的数据存储,更容易编写SQL查询

    由于我们使用qsv保证的类型推断,以每个列最有效的PostgreSQL数据类型创建数据存储表 - 数据存储不仅更高效地存储,在加载和查询方面也表现得更加出色。

    它具有“smartint”数据类型(qsv推断列值范围内的最有效整数数据类型)、综合的日期格式推断(支持19种日期格式,每种格式都有几个变体,并提供可配置的DMY/MDY偏好解析)以及将日期自动格式化为RFC3339格式以便作为Postgres时间戳存储;具有基数感知的可配置自动索引;自动清洗列名以确保有效的PostgreSQL列标识符;加载后自动PostgreSQL真空和资源分析;等等 - DP+使数据存储能够充分发挥PostgreSQL的全部功能。

    可配置的资源自动别名也使编写SQL查询更容易,因为您可以使用更直观的资源别名而不是难以理解的资源ID。

  • 生产就绪的健壮性

    在生产中,支持问题的主要来源是Datapusher - 主要是因为数据质量问题以及Datapusher无法正确推断数据类型、优雅地处理错误[^3]以及提供数据发布者可操作的信息来纠正数据。

    Datapusher+'的设计直接解决了所有这些问题。

  • 更详细的数据存储加载消息

    Datapusher+的消息设计得更加详细和可操作,因此数据发布者的用户体验远更好,并使得以资源为中心的上传工作流程成为可能。

  • 使用qsv进行扩展预处理

    Datapusher+利用qsv

    • 创建“更智能”的数据字典,具有
      • 保证的数据类型推断
      • 可选的自动选择最佳整数PostgreSQL数据类型(“smartint”)的能力,根据数字列的范围(PostgreSQL的int、bigint和numeric类型)以实现最佳的存储/索引效率和SQL查询性能。
      • 清洗列名(保证有效的PostgreSQL列标识符)同时保留原始列名作为标签,该标签用于在DataTables_view中标记列。
      • 一个可选的“摘要统计”资源,作为数据字典的扩展,为每个列提供全面的摘要统计信息 - 总和、最小/最大/范围、最小/最大长度、平均值、标准差、方差、空值计数、稀疏度、四分位数、四分位距、下/上限边界、偏度、中位数、众数/多众数以及基数。
    • 将 Excel 和 OpenOffice/LibreOffice Calc (ODS) 文件转换为 CSV,可以默认选择使用哪个工作表(例如,0 是第一个工作表,-1 是最后一个工作表,-2 是倒数第二个工作表等)。
    • 转换各种日期格式(识别 19 种日期格式,每种格式都有几个变体;总共约 80 种日期格式排列)到标准的 RFC 3339 格式。
    • 通过创建 CSV 索引来启用对 CSV 的随机访问 - 这也使得可以同时并行处理 CSV 的不同部分(这是类型推断和统计计算如此快速的主要原因)。
    • 通过 CSV 索引即时计算行数。
    • 验证上传的 CSV 是否符合 RFC-4180 标准。
    • 将 CSV/TSV 方言标准化和转码为标准的 UTF-8 编码的 RFC-4180 CSV 格式。
    • 可选地创建一个预览子集,可以仅下载文件的前 n 行预览,而不是整个文件(例如,仅下载 3 GB CSV 文件的前 1,000 行 - 特别适合于仅想要收集/编目外部站点元数据和每个文件的少量样本的情况)。
    • 可选地从文件末尾创建预览子集(例如,最后 1,000 行,适用于时间序列/传感器数据)。
    • 自动根据列的基数/格式创建索引(为具有所有唯一值的列创建唯一索引,自动索引基数低于给定阈值的列;自动索引日期列)。
    • 检查重复项,并可选项删除重复行。
    • 可选地筛选个人信息(PII),可选择将 PII 候选行“隔离”在单独的资源中,同时仍创建筛选后的资源。
    • 可选地指定自定义 PII 筛选正则表达式集,而不是 默认 PII 筛选正则表达式集

    即使有所有这些预处理任务,qsv 通常在 5 秒内完成所有分析任务,即使是 100 MB 的 CSV 文件。

    Datapusher+ 的未来版本将进一步利用 qsv 的 80 多条命令来执行额外的预处理、数据处理和验证。路线图可在 此处 查看。欢迎提出想法、建议和反馈!

[^1]: 为什么使用 qsv 而不是像 pandas 这样的“正确”的 Python 数据分析库? [^2]: 在 Ryzen 4800H(8 个物理/16 个逻辑核心)、32 GB 内存和 1 TB SSD 上使用索引运行 qsv statsqsv 演习示例文件 需要 0.16 秒。没有索引,需要 1.3 秒。[^3]: 假设你有一个 100 万行的 CSV,最后一行有一个数值列的无效值(例如,“N/A”而不是数字)。在花费数小时缓慢推送数据后,旧的数据推送器会在最后一行中断,整个作业无效。好吧,这很糟糕,但更糟糕的是,旧的表已经删除,Datapusher 也没有告诉你作业失败的原因!天哪!!!

开发安装

Datapusher+ 是 Datapusher 的直接替代品,因此安装方式相同。

  1. 安装所需的包。

    sudo apt install python3-virtualenv python3-dev python3-pip python3-wheel build-essential libxslt1-dev libxml2-dev zlib1g-dev git libffi-dev libpq-dev file
    
  2. 使用至少 python 3.8 为 Datapusher+ 创建虚拟环境。

    cd /usr/lib/ckan
    sudo python3.8 -m venv dpplus_venv
    sudo chown -R $(whoami) dpplus_venv
    . dpplus_venv/bin/activate
    cd dpplus_venv
    

    ℹ️ 注意: DP+ 至少需要 Python 3.8,因为它大量使用了 3.7/3.8 版本中引入的 subprocess 模块 的新功能。如果您正在使用 Ubuntu 18.04 或更早版本,请按照以下步骤安装 Python 3.8

    sudo add-apt-repository ppa:deadsnakes/ppa
    # we use 3.8 here, but you can get a higher version by changing the version suffix of the packages below
    sudo apt install python3.8 python3.8-venv python3.8-dev
    # install additional dependencies
    sudo apt install build-essential libxslt1-dev libxml2-dev zlib1g-dev git libffi-dev
    

    请注意,DP+ 仍然与 CKAN≤2.8 兼容,后者使用较旧的 Python 版本。

  3. 获取代码。

    mkdir src
    cd src
    git clone --branch 0.11.0 https://github.com/datHere/datapusher-plus
    cd datapusher-plus
    
  4. 安装依赖项。

    pip install wheel
    pip install -r requirements-dev.txt
    pip install -e .
    
  5. 安装 qsv

    下载适合您平台的预编译二进制文件 并将其复制到相应的目录中,例如对于 Linux

    wget https://github.com/jqnatividad/qsv/releases/download/0.108.0/qsv-0.108.0-x86_64-unknown-linux-gnu.zip
    unzip qsv-0.108.0-x86_64-unknown-linux-gnu.zip
    rm qsv-0.108.0-x86_64-unknown-linux-gnu.zip
    sudo mv qsv* /usr/local/bin
    

    或者,如果您想从源代码安装 qsv,请按照此处的说明进行操作。注意,当从源代码编译时,您可能需要查看性能调整部分以从 qsv 中提取更多性能。

    另外,如果您在启动 qsv 时遇到 glibc 错误,您的 Linux 发行版可能没有所需的 GNU C 库版本(当运行 Ubuntu 18.04 或更早版本时将出现这种情况)。如果是这样,请使用 qsvdp_glibc-2.31 二进制文件,因为它链接到较旧的 glibc 版本。如果仍然失败,请使用 unknown-linux-musl.zip 存档,因为它与 MUSL C 库静态链接。

    如果您已经安装了 qsv,请使用 --update 选项将其更新到最新版本。

    qsvdp --update

    ℹ️ 注意: qsv 是一个通用的 CSV 数据处理工具包,定期更新。要更新到最新版本,只需使用 --update 选项运行 qsv,它将检查最新版本并按需更新。

  6. 配置 Datapusher+ 数据库。

    确保创建 datapusher PostgreSQL 用户和 datapusher_jobs 数据库(请参阅DataPusher+ 数据库设置)。

  7. datapusher/dot-env.template 复制到 datapusher/.env修改您的配置

    cd /usr/lib/ckan/dpplus_env/src/datapusher-plus/datapusher
    cp dot-env.template .env
    # configure your installation as required
    nano .env
    
  8. dpplus_venv 虚拟环境中运行 Datapusher+。

    python main.py config.py
    

    默认情况下,DP+ 应该在以下端口运行

    http://localhost:8800/

生产部署

有两种方法可以部署 Datapusher+

  1. 手动部署

    这些说明在端口 8800 上设置了 DataPusher web 服务,该服务在 uWSGI 上运行,但可以轻松地适应其他 WSGI 服务器,如 Gunicorn。您可能需要设置 Nginx 作为其前面的反向代理,并使用类似 Supervisor 的工具来保持进程运行。

    # Install requirements for DataPusher+. Be sure to have at least Python 3.8
    sudo apt install python3-virtualenv python3-dev python3-pip python3-wheel build-essential libxslt1-dev libxml2-dev zlib1g-dev git libffi-dev libpq-dev file
    
    # Install qsv, if required
    wget https://github.com/jqnatividad/qsv/releases/download/0.108.0/qsv-0.108.0-x86_64-unknown-linux-gnu.zip -P /tmp
    unzip /tmp/qsv-0.108.0-x86_64-unknown-linux-gnu.zip -d /tmp
    rm /tmp/qsv-0.108.0-x86_64-unknown-linux-gnu.zip
    sudo mv /tmp/qsv* /usr/local/bin
    
    # if qsv is already installed, be sure to update it to the latest release
    sudo qsvdp --update
    
    # if you get a glibc error when running `qsvdp --update`
    # you're on an old distro (e.g. Ubuntu 18.04) without the required version of the glibc libraries.
    # If so, try running the qsvdp_glibc-2.31 binary instead. If it runs, you can use it instead of the default qsvdp binary.
    # If that still doesnt work, use the statically linked MUSL version instead
    # https://github.com/jqnatividad/qsv/releases/download/0.108.0/qsv-0.108.0-x86_64-unknown-linux-musl.zip
    
    # find out the locale settings
    locale
    
    # ONLY IF LANG is not "en_US.UTF-8", set locale
    export LC_ALL="en_US.UTF-8"
    export LC_CTYPE="en_US.UTF-8"
    sudo dpkg-reconfigure locales
    
    # Create a virtualenv for DataPusher+. DP+ requires at least python 3.8.
    sudo python3.8 -m venv /usr/lib/ckan/dpplus_venv
    sudo chown -R $(whoami) dpplus_venv
    
    # install datapusher-plus in the virtual environment
    . /usr/lib/ckan/dpplus_venv/bin/activate
    pip install wheel
    pip install datapusher-plus
    
    # create an .env file and tune DP+ settings. Tune the uwsgi.ini file as well
    sudo mkdir -p /etc/ckan/datapusher-plus
    sudo curl https://raw.githubusercontent.com/dathere/datapusher-plus/master/datapusher/dot-env.template -o /etc/ckan/datapusher-plus/.env
    sudo curl https://raw.githubusercontent.com/dathere/datapusher-plus/master/deployment/datapusher-uwsgi.ini -o /etc/ckan/datapusher-plus/uwsgi.ini
    
    # Be sure to initialize the database if required. (See Database Setup section below)
    # Be sure to edit the .env file and set the right database connect strings!
    
    # Create a user to run the web service (if necessary)
    sudo addgroup www-data
    sudo adduser -G www-data www-data
    

    在此阶段,您可以使用以下命令运行 DataPusher+

    /usr/lib/ckan/dpplus_venv/bin/uwsgi --enable-threads -i /etc/ckan/datapusher-plus/uwsgi.ini
    

    在使用不同用户时,您可能需要更改 uwsgi.ini 文件中的 uidguid

    要使用 supervisor 部署它

    sudo curl https://raw.githubusercontent.com/dathere/datapusher-plus/master/deployment/datapusher-uwsgi.conf -o /etc/supervisor/conf.d/datapusher-uwsgi.conf
    sudo service supervisor restart
    
  2. 容器化部署

    由于 Datapusher+ 的复杂性,如上述程序所示,容器化安装将使将 DP+ 部署到生产环境以及进行实验变得更加容易。

    设置 DP+ Docker 实例的说明可以在此处找到。

    DP+ Docker 还将公开其他功能和行政接口,不仅用于管理 Datapusher+ 任务,还用于管理 CKAN 数据存储。

配置

CKAN 配置

datapusher 添加到您的 CKAN 配置文件中的插件(通常位于 /etc/ckan/default/ckan.ini

ckan.plugins = <other plugins> datapusher

为了告诉 CKAN 该 webservice 的位置,必须将以下内容添加到 CKAN 配置文件的 [app:main] 部分

ckan.datapusher.url = http://127.0.0.1:8800/

CKAN 配置中还有其他选项允许您自定义 CKAN - DataPusher 集成。有关更多详细信息,请参阅 CKAN 文档中的DataPusher 设置部分。

ℹ️ 注意: DP+ 识别一些额外的 TSV 和电子表格子格式 - Excel 电子表格的 xlsmxlsb,以及 TSV 文件的 tab。为了处理这些子格式,请在 CKAN.INI 文件中将 ckan.datapusher.formats 设置如下

ckan.datapusher.formats = csv xls xlsx xlsm xlsb tsv tab application/csv application/vnd.ms-excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ods application/vnd.oasis.opendocument.spreadsheet

并将此条目添加到您的 CKAN 的 resource_formats.json 文件中。

["TAB", "Tab Separated Values File", "text/tab-separated-values", []],

数据推送器+ 配置

数据推送器+ 实例配置在 DP+ 工作目录中的 .env 文件中(在生产部署时为 /etc/ckan/datapusher-plus。在开发安装时为 datapusher-plus/datapusher 源目录。)

有关可用配置选项的摘要,请参阅 dot-env.template

数据推送器+ 数据库设置

DP+ 需要一个名为 datapusher 的专用 PostgreSQL 账户来连接到 CKAN 数据存储。

为了创建 datapusher 用户并授予其对 datastore_default 数据库所需的权限

su - postgres
psql -d datastore_default
CREATE ROLE datapusher LOGIN PASSWORD 'YOURPASSWORD';
GRANT CREATE, CONNECT, TEMPORARY, SUPERUSER ON DATABASE datastore_default TO datapusher;
GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA public TO datapusher;
\q

DP+ 还需要一个自己的 job_store 数据库来跟踪所有 DP+ 作业。在原始 Datapusher 中,这默认是一个 sqlite 数据库。尽管 DP+ 仍然可以使用 sqlite 数据库,但我们不建议使用它。

为了设置 datapusher_jobs 数据库及其用户

sudo -u postgres createuser -S -D -R -P datapusher_jobs
sudo -u postgres createdb -O datapusher_jobs datapusher_jobs -E utf-8

使用方法

任何具有支持格式(在 ckan.datapusher.formats 中定义)的文件都将尝试加载到数据存储中。

您还可以手动触发资源重新提交。当在 CKAN 中编辑资源时(在资源页面上单击“管理”按钮),将出现一个名为“数据存储”的新选项卡。它将包含上次尝试上传的日志和一个重新尝试上传的按钮。一旦资源已“推送”到数据存储中,还将在“数据字典”选项卡中进行调整,数据发布者可以精细调整推断的数据字典。

DataPusher+ UI DataPusher+ UI 2

命令行

运行以下命令将所有资源提交给数据推送器,尽管它将跳过数据文件哈希值没有更改的文件

ckan -c /etc/ckan/default/ckan.ini datapusher resubmit

在 CKAN<=2.8

paster --plugin=ckan datapusher resubmit -c /etc/ckan/default/ckan.ini

要重新提交特定的资源,无论数据文件哈希值是否更改:

ckan -c /etc/ckan/default/ckan.ini datapusher submit {dataset_id}

在 CKAN<=2.8

paster --plugin=ckan datapusher submit <pkgname> -c /etc/ckan/default/ckan.ini

测试

要测试 Datapusher-plus,您可以使用以下测试脚本,该脚本在 GitHub 上提供:测试脚本

卸载数据推送器+

如果您需要删除 Datapusher+,并且遵循了上述开发或生产安装程序

# if you're running inside the dpplus_venv virtual environment, deactivate it first
deactivate

# remove the DP+ python virtual environment
sudo rm -rf /usr/lib/ckan/dpplus_venv

# remove the supervisor DP+ configuration
sudo rm -rf /etc/supervisor/conf.d/datapusher-uwsgi.conf

# remove the DP+ production deployment directory
sudo rm -rf /etc/ckan/datapusher-plus

# remove qsv binary variants
sudo rm /usr/local/bin/qsv /usr/local/bin/qsvdp /usr/local/bin/qsvlite /usr/local/bin/qsv_nightly /usr/local/bin/qsvdp_nightly /usr/local/bin/qsvlite_nightly

# restart the supervisor, without the Datapusher+ service
sudo service supervisor reload

# ========= DATABASE objects ============
# OPTIONAL: backup the datapusher_jobs database first if 
# you want to retain the DP+ job history
sudo -u postgres pg_dump --format=custom -d datapusher_jobs > datapusher_jobs.dump

# to remove the Datapusher+ job database and the datapusher_jobs user/role
sudo -u postgres dropdb datapusher_jobs
sudo -u postgres dropuser datapusher_jobs

# to drop the datapusher user which DP+ uses to write to the CKAN Datastore
sudo -u postgres dropuser datapusher

为了确保数据推送器+ 服务在上传表格资源时不会自动调用,请从您的 ckan.ini 文件中的 ckan.plugins 中删除 datapusher

还要从您的 ckan.ini 中删除/注释以下 ckan.datapusher 条目

  • ckan.datapusher.formats
  • ckan.datapusher.url
  • ckan.datapusher.callback_url_base
  • ckan.datapusher.assume_task_stale_after

请注意,之前已推送的资源仍可在 CKAN 数据存储中找到。您必须单独使用 UI 或 CKAN resource_delete API 删除这些资源。

如果您不再使用 CKAN 数据存储

  • 编辑您的 ckan.ini 并从 ckan.plugins 中删除/注释 datastore
  • 删除/注释 ckan.datastore.write_urlckan.datastore.read_url 条目。

为了确认卸载成功,上传一个新的表格资源并检查

  • 表格资源视图(例如,datatables_view、recline_view 等)不再可用
  • 数据存储数据字典 选项卡不再可用
  • 资源页面上的 下载 按钮不再提供其他下载格式(CSV、TSV、JSON、XML)
  • 表格资源上的 数据存储 API 按钮不再显示

许可证

本材料版权(c)2020 开放知识基金会及其他贡献者

它开源并许可在 GNU Affero 通用公共许可证(AGPL)v3.0 下,其完整文本可在以下位置找到

http://www.fsf.org/licensing/licenses/agpl-3.0.html

项目详情


下载文件

下载适合您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分布

datapusher-plus-0.16.4.tar.gz (28.9 kB 查看哈希值)

上传时间 源代码

构建分布

datapusher_plus-0.16.4-py3-none-any.whl (22.4 kB 查看哈希值)

上传时间 Python 3

由以下组织支持