如何在Hive中加载分布式数据?

时间:2014-08-14 14:24:27

标签: hadoop hive hdfs

我的目标是使用Hive执行SELECT查询

当我在一台机器(namenode)上有一个小数据时,我开始: 1 - 创建包含此数据的表:create table table1(int col1,string col2) 2 - 从文件路径加载数据:在路径中加载本地数据'路径'进入表table1; 3 - 执行我的SELECT查询:从table1中选择*,其中col1> 0

我拥有1000万行的大量数据,这些数据并不适合单台机器。让我们假设Hadoop将我的数据划分为10个数据节点,每个数据节点包含100万行。

将数据检索到单台计算机是不可能的,因为它的大小很大,或者在可能的情况下需要很多时间。

Hive会在每个datanode上创建一个表并执行SELECT查询 或者Hive会将所有数据移动到一个位置(datanode)并创建一个表吗? (这是低效的)

2 个答案:

答案 0 :(得分:2)

好的,所以我将介绍将数据加载到Hive时会发生什么。

1000万行文件将被削减为64MB / 128MB块。 Hadoop,而不是Hive,会将块分发到群集上的不同从节点。 这些块将被复制多次。默认值为3.

每个从节点将包含组成原始文件的不同块,但没有机器将包含每个块。但是,由于Hadoop复制了块,因此群集上必须至少有足够的空白空间才能容纳3倍的文件大小。

当数据在群集中时,Hive会将表格投影到数据上。该查询将在Hadoop选择处理组成文件的块的机器上运行。

虽然1000万行不是那么大。除非表格有100列,否则在任何情况下都应该没问题。但是,如果要在查询中执行select *,请记住所有数据都需要发送到运行查询的计算机。这可能需要很长时间,具体取决于文件大小。

我希望我能覆盖你的问题。如果没有,请告诉我,我会尽力帮助。

答案 1 :(得分:2)

查询

select * from table1 where col1>0

只是地图方面的工作。因此,数据块在每个节点本地处理。无需集中收集数据。