【问题标题】:PicklingError when copying a very large cassandra table using cqlsh使用 cqlsh 复制非常大的 cassandra 表时出现 PicklingError
【发布时间】:2017-10-15 18:09:49
【问题描述】:

当我尝试使用以下命令将表复制到 cassandra 时:

copy images from 'images.csv'

我得到错误:

'PicklingError: Can't pickle <class 'cqlshlib.copyutil.ImmutableDict'>: attribute lookup cqlshlib.copyutil.ImmutableDict failed'

我已成功导入所有其他表,但此表无法正常工作。与这个唯一的区别是它包含用于图像的大二进制 blob。

这是 csv 文件中的示例行:

b267ba01-5420-4be5-b962-7e563dc245b0,,0x89504e...[large binary blob]...426082,0,7e700538-cce3-495f-bfd2-6a4fa968bdf6,pentium_e6600,01fa819e-3425-47ca-82aa-a3eec319a998,0,7e700538-cce3-495f-bfd2-6a4fa968bdf6,,,png,0

这是导致错误的文件: https://www.dropbox.com/s/5mrl6nuwelpf3lz/images.csv?dl=0

这是我的架构:

CREATE TABLE dealtech.images (
    id uuid PRIMARY KEY,
    attributes map<text, text>,
    data blob,
    height int,
    item_id uuid,
    name text,
    product_id uuid,
    scale double,
    seller_id uuid,
    text_bottom int,
    text_top int,
    type text,
    width int
)

这些表是使用cassandra 2.x 导出的,我目前正在使用cassandra 3.0.9 导入它们。

【问题讨论】:

  • 能不能导入这个b267ba01-5420-4be5-b962-7e563dc245b0,,0x89504e426082,0,7e700538-cce3-495f-bfd2-6a4fa968bdf6,pentium_e6600,01fa819e-3425-47ca-82aa-a3eec319a998,0,7e700538-cce3-495f-bfd2-6a4fa968bdf6,,,png,0我已经导入成功了
  • 是的,我可以导入它。当我使用非常大的二进制 blob(例如图像)时,似乎会出现此问题。
  • 这是导致错误的图像文件。 dropbox.com/s/5mrl6nuwelpf3lz/images.csv?dl=0
  • 我找到了导入图像的解决方法。一次加载一行适用于:从'images.csv'复制dealtech.images,skirows = 0和maxrows = 1;从“images.csv”复制 dealtech.images,skirows=1 和 maxrows=2;从“images.csv”复制 dealtech.images,skirows=2 和 maxrows=3; ...当您尝试一次加载太大的文件时,可能只是内存错误。
  • 我也遇到了这个问题,但这是因为其他原因。我已经运行了 COPY 命令来导入一个大型数据集,但经过一些调查发现键空间复制不正确。我使用的是本地 docker 实例,尽管键空间定义使用 NetworkTopologyStrategy 来表示不存在的键空间。检查一下你是否也遇到了这个问题!

标签: java cassandra cqlsh


【解决方案1】:

我在使用 apache cassandra 3.9 时遇到了同样的问题,尽管我的数据集相当小(一个表中 46 行,另一个表中 262 行)。

PicklingError: Can't pickle &lt;class 'cqlshlib.copyutil.link'&gt;: attribute lookup cqlshlib.copyutil.link failed

PicklingError: Can't pickle &lt;class 'cqlshlib.copyutil.attribute'&gt;: attribute lookup cqlshlib.copyutil.attribute failed

linkattribute 是我定义的类型。

COPY 命令是 .cql 脚本的一部分,该脚本作为其设置过程的一部分在 Docker 容器内运行。

我在一些地方看到人们在 Windows 上看到此 PicklingError(似乎与 NTFS 有关),但在这种情况下 Docker 容器使用的是 Alpine Linux。

解决方法是将这些选项添加到我的 COPY 命令的末尾:

WITH MINBATCHSIZE=1 AND MAXBATCHSIZE=1 AND PAGESIZE=10;

http://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlshCopy.html

我没有看到 PicklingError 在本地运行这些包含 COPY 命令的 .cql 脚本,因此这似乎是一个仅在内存不足的情况下才引起注意的问题。

相关问题:

【讨论】:

  • 关于批处理和页面大小的好提示。也帮了我。谢谢!
猜你喜欢
  • 2016-06-30
  • 2011-10-24
  • 2017-01-09
  • 2012-08-26
  • 2020-01-13
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
相关资源
最近更新 更多