当前位置: 首页 > 知识库问答 >
问题:

加载到配置单元分区拼花表时内存不足

南宫俊喆
2023-03-14

先声明一下,这不是Hadoop的生产环境。这是一个我们测试工作流的单节点环境

set mapreduce.input.fileinputformat.split.minsize
set mapreduce.input.fileinputformat.split.maxsize
set mapreduce.job.maps
DROP TABLE IF EXISTS web.traffic_pageviews;

CREATE TABLE web.traffic_pageviews(
    SESSION_ID STRING,
    COOKIE_ID STRING,
    TS TIMESTAMP,
    PAGE STRING,
    PAGE_URL_BASE STRING,
    PAGE_URL_QUERY STRING,
    PAGE_REFERRAL_URL_BASE STRING,
    PAGE_REFERRAL_URL_QUERY STRING)
    PARTITIONED BY (DS STRING)
    STORED AS PARQUET;

INSERT OVERWRITE TABLE web.traffic_pageviews PARTITION(ds='2016-12-28')

select
    session_id,
    cookie_id,
    ts,
    page,
    SPLIT(PAGE_URL,'\\?')[0] PAGE_URL_BASE,
    SPLIT(PAGE_URL,'\\?')[1] PAGE_URL_QUERY,
    SPLIT(PAGE_REFERRAL_URL,'\\?')[0] PAGE_REFERRAL_URL_BASE,
    SPLIT(PAGE_REFERRAL_URL,'\\?')[1] PAGE_REFERRAL_URL_QUERY
from    
    web.stg_traffic_pageviews
where
    ds='2016-12-28';
2017-01-03 07:11:02,053 INFO [main] org.apache.hadoop.hive.ql.io.parquet.write.ParquetRecordWriterWrapper: real writer: parquet.hadoop.ParquetRecordWriter@755cce4b
2017-01-03 07:11:02,057 INFO [main] org.apache.hadoop.hive.ql.exec.FileSinkOperator: FS[1]: records written - 1
2017-01-03 07:11:02,062 INFO [main] org.apache.hadoop.hive.ql.exec.MapOperator: MAP[2]: records read - 1
2017-01-03 07:11:02,064 INFO [main] org.apache.hadoop.hive.ql.exec.FileSinkOperator: FS[1]: records written - 10
2017-01-03 07:11:02,064 INFO [main] org.apache.hadoop.hive.ql.exec.MapOperator: MAP[2]: records read - 10
2017-01-03 07:11:02,082 INFO [main] org.apache.hadoop.hive.ql.exec.FileSinkOperator: FS[1]: records written - 100
2017-01-03 07:11:02,082 INFO [main] org.apache.hadoop.hive.ql.exec.MapOperator: MAP[2]: records read - 100
2017-01-03 07:11:02,356 INFO [main] org.apache.hadoop.hive.ql.exec.FileSinkOperator: FS[1]: records written - 1000
2017-01-03 07:11:02,356 INFO [main] org.apache.hadoop.hive.ql.exec.MapOperator: MAP[2]: records read - 1000
2017-01-03 07:11:03,775 INFO [main] org.apache.hadoop.hive.ql.exec.FileSinkOperator: FS[1]: records written - 10000
2017-01-03 07:11:03,775 INFO [main] org.apache.hadoop.hive.ql.exec.MapOperator: MAP[2]: records read - 10000
2017-01-03 07:12:03,679 FATAL [LeaseRenewer:cloudera@quickstart.cloudera:8020] org.apache.hadoop.yarn.YarnUncaughtExceptionHandler: Thread Thread[LeaseRenewer:cloudera@quickstart.cloudera:8020,5,main] threw an Error.  Shutting down now...
java.lang.OutOfMemoryError: Java heap space

共有1个答案

皇甫树
2023-03-14

在指定表上的压缩后,问题自行解决。具体来说:

CREATE TABLE web.traffic_pageviews(
    ...
    )
    PARTITIONED BY (DS STRING)
    STORED AS PARQUET
    TBLPROPERTIES ("parquet.compression"="SNAPPY");

虽然这是答案,但我不明白为什么它能起作用。如果有人有洞察力,将不胜感激。

 类似资料:
  • 我正在使用Spark生成拼花文件(通过分区,使用Snappy压缩),并将它们存储在HDFS位置。 拼花数据文件存储在下 然后为其创建配置单元表,如下所示:

  • 我试图为我的表创建分区,以便更新一个值。 这是我的样本数据 我想把珍妮特的部门更新到B。 为此,我创建了一个以Department为分区的表。 创建外部表trail(EmployeeID Int、FirstName String、Designation String、Salary Int),按(Department String)行格式分隔字段进行分区,以“,”location'/user/sre

  • 更新:恰恰相反。实际上,我们的表非常大,就像3个TB有2000个分区。3TB/256MB实际上会达到11720,但我们的分区数量与表的物理分区数量完全相同。我只想了解任务是如何在数据量上生成的。

  • 我对alter table有一个问题,它改变了表模式,而不是parquet模式。 例如,我有一个<code>PARQUET<code>表,其中包含以下列: 现在,我尝试用 使用描述表,我可以看到第2列不再存在; 现在我尝试执行但我收到这样的错误: “data.0.parq”的类型与列column4的表架构不兼容。预期类型:INT64。实际类型:字节数组" 已删除列的值尚存在于具有 5 列而不是 4