2015-11-06 244 views
1

我正在设置一个新的hadoop集群(在此阶段进行实验)。hadoop/hdfs中的默认存储文件格式

我希望对它进行配置,使得无论何时将文件复制到群集上(通过copyFromLocal或使用sqoop等),hadoop/hdfs都应该将数据存储为parquet文件格式。

我对此期待吗?可能吗 ?

我认为应该有一个配置参数在hdfs级别的某处,我可以指定在存储数据时使用哪种格式,但某种程度上无法找到它。想知道如果我在这里错过了什么。

回答

3

不,你是对的 - 没有HDFS级配置。每次操作某些数据时,您都必须设置存储格式。想象一下,如果每个文件都自动转换为Parquet,将会造成的损害。所有由应用程序创建的临时文件,任何Hive/Pig脚本和任何查找文件都将被破坏。

向Sqoop命令的输出保存到镶木:

sqoop import --connect JDBC_URI --table TABLE --as-parquetfile --target-dir /path/to/files 

将写入数据转换成平面格式。

没有办法用copyFromLocal来做到这一点。

要移动上已有的HDFS到木地板的数据,将数据加载到一个外部蜂巢表原始格式,创建一个平面表,然后将数据加载到它,即

//Overlay a table onto the input data on the HDFS 
CREATE EXTERNAL TABLE input (
    id int, 
    str string 
STORED AS <the-input-data-format> 
LOCATION 'hdfs://<wherever-you-put-the-data>'; 

//Create a Parquet-formatted table 
CREATE TABLE parquet (
    id int, 
    str string 
STORED AS PARQUET; 

//Write your input data into the Parquet table - this will format the data into Parquet 
INSERT INTO TABLE parquet 
SELECT * FROM input; 
+0

感谢本。我有几千个文件要加载到集群中,并且由于它们可以在外部磁盘上使用,所以我们现在正在考虑使用copyFromLocal方式......尽管并行......这里的任何技巧?我想最终得到实木复合地板文件,因为我需要稍后在火花上操作它们。 – Gyan

+0

假设外部磁盘是USB硬盘,那么主要瓶颈将是数据从该磁盘到集群边缘节点的不可避免的传输。除了将不同的文件放在不同的边缘节点上并在每个节点上运行'put'以使其有效地并行运行之外,没有办法提高'put'命令的速度。 –

+0

我意识到我错过了将原始问题的一部分改为Parquet输入数据的格式,所以我将其添加到我的答案中。 –