云服务器内容精选

  • 回答 在Spark配置中,“spark.yarn.executor.memoryOverhead”参数的值应大于CarbonData配置参数“sort.inmemory.size.inmb”与“Netty offheapmemory required”参数值的总和,或者“carbon.unsafe.working.memory.in.mb”、“carbon.sort.inememory.storage.size.in.mb”与“Netty offheapmemory required”参数值的总和。否则,如果堆外(off heap)访问超出配置的executor内存,则YARN可能会停止executor。 “Netty offheapmemory required”说明:当“spark.shuffle.io.preferDirectBufs”设为true时,Spark中netty传输服务从“spark.yarn.executor.memoryOverhead”中拿掉部分堆内存[~ 384 MB or 0.1 x 执行器内存]。 详细信息请参考常见配置Spark Executor堆内存参数。
  • 回答 使用当前可得的最近的tablestatus文件进行恢复,分为如下两个场景来进行恢复: 场景一:当前批次的CarbonData数据文件和.segment文件损坏无法恢复。 进入客户端节点,执行如下命令,查看HDFS对应表的tablestatus文件,找到最近的tablestatus版本号。 cd 客户端安装路径 source bigdata_env source Spark/component_env kinit 组件业务用户 (普通集群无需执行kinit命令) hdfs dfs -ls /user/hive/warehouse/hrdb.db/car01/Metadata 上图中,当前批次文件tablestatus_1669028899548损坏,需要使用tablestatus_1669028852132文件。 进入spark sql,执行如下命令来修改表属性latestversion为当前最近的版本号。 alter table car01 set SERDEPROPERTIES ('latestversion'='1669082252132'); 需要退出当前session,重新连接后执行查询。该方式已尽可能恢复客户数据,一般现网情况下,如断电场景segment数据文件也会存在不可恢复情况。 场景二:当前批次的Carbondata数据文件和.segment文件完整,可恢复。 使用TableStatusRecovery恢复工具,当前工具仅针对非分区表进行恢复。进入Spark客户端节点,执行如下命令: cd 客户端安装路径 source bigdata_env source Spark/component_env kinit 组件业务用户 (普通集群无需执行kinit命令) spark-submit --master yarn --class org.apache.carbondata.recovery.tablestatus.TableStatusRecovery Spark/spark/carbonlib/carbondata-spark_*.jar hrdb car01 参数说明:hrdb car01表名称。 TableStatusRecovery恢复工具限制: 合并后,如果tablestatus文件丢失或损坏,使用该工具无法恢复合并状态的segment,因为丢失或损坏的tablestatus文件才存在该segment合并信息。 Delete segment by Id/Date后,如果tablestatus文件丢失或损坏,则无法恢复已删除的segment信息,因为只有丢失或损坏的tablestatus文件才存在该segment的删除信息。 不支持在mv表上使用该工具。 由于最新的tablestatus文件存在问题,使用该工具恢复后无法正常查询时,可以移除最新的tablestatus文件,使用上一个tablestatus文件进行恢复。
  • 回答 当源表或子查询具有大数据量的Partition时,创建Hive表失败。执行查询需要很多的task,此时输出的文件数就会很多,从而导致driver OOM。 可以在创建Hive表的语句中增加distribute by子句来解决这个问题,其中distribute by的字段要选取合适的cardinality(即distinct值的个数)。 distribute by子句限制了Hive表的Partition数量。增加distribute by 子句后,最终的输出文件数取决于指定列的cardinality和“spark.sql.shuffle.partitions”参数值。但如果distribute by的字段的cardinality值很小,例如,“spark.sql.shuffle.partitions”参数值为200,但distribute by字段的cardinality只有100,则输出的200个文件中,只有其中100个文件有数据,剩下的100个文件为空文件。也就是说,如果选取的字段的cardinality过低,如1,则会造成严重的数据倾斜,从而严重影响查询性能。 因此,建议选取的distribute by字段的cardinality个数要大于“spark.sql.shuffle.partitions”参数,可大于2~3倍。 示例: create table hivetable1 as select * from sourcetable1 distribute by col_age;
  • 回答 在Spark配置中,“spark.yarn.executor.memoryOverhead”参数的值应大于CarbonData配置参数“sort.inmemory.size.inmb” 与“Netty offheapmemory required”参数值的总和,或者“carbon.unsafe.working.memory.in.mb” 、 “carbon.sort.inememory.storage.size.in.mb” 与 “Netty offheapmemory required”参数值的总和。否则,如果堆外(off heap)访问超出配置的executor内存,则YARN可能会停止executor。 “Netty offheapmemory required”说明:当“spark.shuffle.io.preferDirectBufs”设为true时,Spark中netty 传输服务从"spark.yarn.executor.memoryOverhead"中拿掉部分堆内存[~ 384 MB or 0.1 x 执行器内存]。 详细信息请参考常见配置Spark Executor堆内存参数。
  • 回答 在这种场景下,CarbonData会给每个节点分配一个INSERT INTO或LOAD DATA任务。如果Executor不是不同的节点分配的,CarbonData将会启动较少的task。 解决措施: 您可以适当增大Executor内存和Executor核数,以便YARN可以在每个节点上启动一个Executor。具体的配置方法如下: 配置Executor核数。 将“spark-defaults.conf”中的“spark.executor.cores”配置项或者“spark-env.sh”中的“SPARK_EXECUTOR_CORES”配置项设置为合适大小。 在使用spark-submit命令时,添加“--executor-cores NUM”参数设置核数。 配置Executor内存。 将“spark-defaults.conf”中的“spark.executor.memory”配置项或者“spark-env.sh”中的“SPARK_EXECUTOR_MEMORY”配置项设置为合适大小。 在使用spark-submit命令时,添加“--executor-memory MEM”参数设置内存。
  • 回答 当执行器中此次数据查询和加载所需要的堆外内存不足时,便会发生此异常。 在这种情况下,请增大“carbon.unsafe.working.memory.in.mb”和“spark.yarn.executor.memoryOverhead”的值。 详细信息请参考如何在CarbonData中配置非安全内存? 该内存被数据查询和加载共享。所以如果加载和查询需要同时进行,建议将“carbon.unsafe.working.memory.in.mb”和“spark.yarn.executor.memoryOverhead”的值配置为2048 MB以上。 可以使用以下公式进行估算: 数据加载所需内存: (“carbon.number.of.cores.while.loading”的值[默认值 = 6]) x 并行加载数据的表格 x (“offheap.sort.chunk.size.inmb”的值[默认值 = 64 MB] + “carbon.blockletgroup.size.in.mb”的值[默认值 = 64 MB] + 当前的压缩率[64 MB/3.5]) = ~900 MB 每表格 数据查询所需内存: (SPARK_EXECUTOR_INSTAN CES . [默认值 = 2]) x ( carbon.blockletgroup.size.in.mb [默认值 = 64 MB] +“carbon.blockletgroup.size.in.mb”解压内容[默认值 = 64 MB * 3.5]) x (每个执行器核数[默认值 = 1]) = ~ 600 MB