【问题标题】:default storage file format in hadoop/hdfshadoop/hdfs 中的默认存储文件格式
【发布时间】:2015-11-06 11:04:56
【问题描述】:

我正在建立一个新的 hadoop 集群(现阶段是实验性的)。

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

我对此的期望正确吗?可能吗 ?

我认为应该在 hdfs 级别的某个地方有一个配置参数,我可以在其中指定在存储数据时使用哪种格式,但不知何故无法找到。想知道我是否在这里遗漏了什么。

【问题讨论】:

    标签: hadoop compression hdfs


    【解决方案1】:

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

    要将 Sqoop 命令的输出保存到 Parquet:

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

    会将数据写入 Parquet 格式。

    copyFromLocal 无法做到这一点。

    要将已经在 HDFS 上的数据移动到 Parquet 中,请将数据以其原始格式加载到外部 Hive 表中,创建 Parquet 表,然后将数据加载到其中,即

    //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;
    

    【讨论】:

    • 感谢本。我有几千个文件要加载到集群中,并且由于它们可以在外部磁盘上使用,我们目前正在考虑以 copyFromLocal 方式..尽管是并行的..这里有什么技巧吗?我想最终得到 parquet 文件,因为我需要稍后在 spark 中对它们进行操作。
    • 假设外部磁盘是 USB 硬盘,那么主要瓶颈将是不可避免地从该磁盘传输数据到集群边缘节点。除了将不同的文件放在不同的边缘节点上并在每个节点上运行 put 以使其有效地并行运行之外,没有真正的方法可以提高 put 命令的速度。
    • 我意识到我错过了关于将输入数据格式更改为 Parquet 的原始问题的一部分,因此我已将其添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多