【问题标题】:Pig & Cassandra & DataStax Splits ControlPig & Cassandra & DataStax 拆分控制
【发布时间】:2013-11-03 17:22:10
【问题描述】:

我一直在使用 Pig 和我的 Cassandra 数据来完成各种惊人的分组壮举,而这些壮举几乎不可能用命令式编写。我正在使用 DataStax 的 Hadoop 和 Cassandra 集成,我不得不说它非常令人印象深刻。向那些家伙致敬!

我有一个非常小的沙盒集群(2 个节点),我正在对这个系统进行一些测试。我有一个 CQL 表,它有大约 53M 行(大约 350 字节 ea。),我注意到 Mapper 稍后需要很长时间才能通过这 53M 行。我开始查看原木,我可以看到地图反复溢出(我从映射器中看到 177 次溢出),我认为这是问题的一部分。

CassandraInputFormat 和 JobConfig 的组合只创建了一个映射器,所以这个映射器必须从表中读取 100% 的行。我称之为 反平行 :)

现在,这张照片中有很多齿轮在起作用,包括:

  • 2 个物理节点
  • hadoop 节点位于“分析”DC(默认配置)中,但物理上位于同一机架中。
  • 我可以使用 LOCAL_QUORUM 查看作业

谁能告诉我如何让 Pig 创建更多输入 Splits 以便我可以运行更多映射器?我有 23 个插槽;一直只用一个好像有点可惜。

或者,我是不是完全疯了,不明白问题所在?我欢迎这两种答案!

【问题讨论】:

    标签: hadoop cassandra apache-pig datastax-enterprise datastax


    【解决方案1】:

    你应该设置pig.noSplitCombination = true。您可以在三个地方之一执行此操作。

    调用脚本时:

    dse pig -Dpig.noSplitCombination=true /path/to/script.pig
    

    在 Pig 脚本本身中:

    SET pig.noSplitCombination true
    table = LOAD 'cfs://ks/cf' USING CqlStorage();
    

    或永久在/etc/dse/pig/pig.properties。取消注释:

    pig.noSplitCombination=true
    

    否则,Pig 可能会将您的总输入路径(组合)设置为处理:1。

    【讨论】:

    • 添加 SET pig.noSplitCombination true 对我有用。谢谢!
    • SET pig.noSplitCombination true 在使用 LOAD 'cfs://ks/cf' USING CqlStorage(); 时也为我工作,但如果我使用像 LOAD 'cfs://ks/cf?where_clause=x%3D3' USING CqlStorage(); 这样的加载功能,它总是只需要一个映射器。有什么想法吗?
    • @Shri 如果没有关于架构的更多信息,很难说,但您使用 where_clause 缩小范围的数据可能只是包含在一个拆分中。
    【解决方案2】:

    您可以将 cassandra.input.split.size 设置为小于 64k(默认拆分大小)的值,这样您可以获得更多拆分。 Cql 表的每个节点有多少行?你能发布你的表架构吗?

    将 split_size 添加到 url 参数中

    对于 CassandraStorage,使用以下参数 cassandra://[用户名:密码@]/[?slice_start=&slice_end=[&reversed=true][&limit=1][&allow_deletes=true][&widerows=true][&use_secondary=true][&comparator=][&split_size=] [&partitioner=][&init_address=][&rpc_port=]]

    对于 CqlStorage,使用以下参数 cql://[username:password@]/[?[page_size=][&columns=][&output_query=][&where_clause=][&split_size=][&partitioner=][&use_secondary=true|false][&init_address=][&rpc_port =]]

    【讨论】:

    • 嗨!这是表格:
       CREATE TABLE events (     id uuid PRIMARY KEY,     body text,     eventname text,     marshaledclass text,     time timestamp     ) WITH     bloom_filter_fp_chance=0.010000 AND     caching='KEYS_ONLY' AND     comment='' AND     dclocal_read_repair_chance=0.000000 AND     gc_grace_seconds=864000 AND     read_repair_chance=0.100000 AND     replicate_on_write='true' AND     populate_io_cache_on_flush='false' AND     compaction={'class': 'SizeTieredCompactionStrategy'} AND     compression={'sstable_compression': 'SnappyCompressor'}; 
    • 我已经尝试(在静脉中)将cassandra.input.split.size 覆盖为 64k 值以外的值,但似乎没有任何改变。我什至将它添加到 mapred-site.xml,但它仍然没有改变。我也尝试从 pig 脚本本身进行覆盖,但仍然没有运气。
    • @alexLiu 在 Pig 从 Cassandra 加载数据时,是否有关于 split_size 和 page_size 的文档?大约 800 万行的列族需要大约 40 分钟才能完成第一个 Map 阶段,并且只需要一个映射器。降低 split_size 并不会增加初始阶段的映射器数量,同时调整 split_size 和 page_size 对性能没有帮助。
    • @sudheer 你有什么解决办法吗?
    • @nate 不,我仍然面临同样的问题stackoverflow.com/questions/22911149/… 如果我执行 SET pig.splitCombination false,即使有 10 行或 10M 行,它也会针对任何大小的输入运行 513 个映射:-(
    【解决方案3】:

    设置 pig.noSplitCombination = true 将我带到另一个极端 - 有了这个标志,我开始有 769 个地图任务

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2014-10-11
      • 2015-12-20
      • 2015-11-10
      • 2018-01-29
      • 2016-01-19
      • 2014-09-25
      • 2014-01-27
      • 2016-11-15
      相关资源
      最近更新 更多