Hadoop 配置单元-将大型有序查询结果集拆分为多个连续文件
我正在使用HIVE对S3上的原始数据进行ETL处理。我生成结构化输出数据,在加载到另一个数据库(红移)之前对其进行排序。 数据需要以可管理块的排序顺序加载到红移中,例如,每个块50-100亿行,其中总数据集是1000亿条记录 我正在寻找一种方法,让hive对数据进行排序,然后将其分成更小的可管理的块,这些块可以按排序顺序单独上传。 到目前为止,我还没有能够想出一个方法,让我做到这一点。由于我使用了一个“orderby”子句,所以我得到了一个庞大的文件,所以配置单元中的减缩器数量强制为1我无法将这么大的文件从S3中移出以进行解压缩/拆分/重新压缩/重新加载,因为我没有地方来完成所有这些。 使用“clusterby”生成内部排序的块,但不能保证块之间的顺序 sort by键是一个复合字母数字键,且不同计数太大,无法按其进行分区 群集/分发问题:Hadoop 配置单元-将大型有序查询结果集拆分为多个连续文件,hadoop,amazon-s3,hive,amazon-redshift,Hadoop,Amazon S3,Hive,Amazon Redshift,我正在使用HIVE对S3上的原始数据进行ETL处理。我生成结构化输出数据,在加载到另一个数据库(红移)之前对其进行排序。 数据需要以可管理块的排序顺序加载到红移中,例如,每个块50-100亿行,其中总数据集是1000亿条记录 我正在寻找一种方法,让hive对数据进行排序,然后将其分成更小的可管理的块,这些块可以按排序顺序单独上传。 到目前为止,我还没有能够想出一个方法,让我做到这一点。由于我使用了一个“orderby”子句,所以我得到了一个庞大的文件,所以配置单元中的减缩器数量强制为1我无法将这
根据我的理解,集群和分发选项的问题是,分发是基于分发密钥的散列进行的。如果x
NAME
split - split a file into pieces
SYNOPSIS
split [OPTION]... [INPUT [PREFIX]]
DESCRIPTION
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is 'x'. With no INPUT, or when INPUT is -, read
standard input.
Mandatory arguments to long options are mandatory for short options too.
-a, --suffix-length=N
use suffixes of length N (default 2)
-b, --bytes=SIZE
put SIZE bytes per output file
-C, --line-bytes=SIZE
put at most SIZE bytes of lines per output file
-d, --numeric-suffixes
use numeric suffixes instead of alphabetic
-l, --lines=NUMBER
put NUMBER lines per output file
--verbose
print a diagnostic just before each output file is opened
--help display this help and exit
--version
output version information and exit
SIZE may be (or may be an integer optionally followed by) one of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.
比如说:
拆分-l 5000000000文件名
可能有用。从蜂巢加载S3: 您可以使用
LOCATION's3:///etc
为配置单元指定一个外部文件(当您使用Order By配置单元生成一个大文件时),这样配置单元将直接将其放入s3中
手动加载:使用Sort By时,应对一个减速机中的数据进行排序。您是否尝试使用单独的密钥,以便在对数据进行排序时,通过某个密钥分发数据
选择分发密钥时,应确保应该在一个存储桶中的所有记录不会转到任何其他文件 您可以尝试将表扣起来,这样会创建一些大小接近相等的分区,从而更易于操作
Create table mytable (
record_ID string,
var1 double
)
clustered by record_ID into 100 buckets;
set hive.enforce.bucketing = true;
from my_other_table
insert overwrite table mytable
select *;
此外,您还可以创建一个随机数并用它进行分区。在hive中使用random()udf同样容易。我在帖子中已经提到,我没有空间从S3中取出这个文件来执行此操作并将其放回原处。这一个文件可能很容易被删除,因为我已经在S3中生成了一个非常大的文件。但我不能一次加载它,这就是为什么我需要一种方法来打破它。现在,分发密钥的问题是,数据是基于密钥的散列进行分发的。假设我的数据是按名称排序的。将名称散列到不同的文件将打破文件之间的排序顺序。每个文件都将按名称排序,但是跨文件的数据不再排序。是的,分发密钥应该在逻辑上划分数据。例如,假设你有一所学校的学生分数——如果你按班级划分并对我的分数进行排序,那么你仍然可以使用这些数据。在这里,基于标记的全局排序对您没有帮助。如果可以的话,共享源数据模型,这样可能会有一些建议。通过将记录ID聚集到100个bucket中,将记录1和101放在同一个文件中。记录2和102进入同一个文件。这打破了我正在寻找的排序顺序。您需要创建一个保持顺序的变量,然后在其上划分一个表。