Hive为HDFS中的每个插入创建多个小文件

时间:2015-08-19 13:04:41

标签: hadoop hive hdfs apache-kafka spark-streaming

已经实现了以下

  1. Kafka Producer使用Spark Streaming从twitter中提取数据。
  2. Kafka Consumer将数据提取到Hive外部表(在HDFS上)。
  3. 虽然到目前为止工作正常。 我面临的问题只有一个,当我的应用程序将数据插入Hive表时,它创建了一个包含每个文件的每行数据的小文件。

    下面是代码

    // Define which topics to read from
      val topic = "topic_twitter"
      val groupId = "group-1"
      val consumer = KafkaConsumer(topic, groupId, "localhost:2181")
    
    //Create SparkContext
      val sparkContext = new SparkContext("local[2]", "KafkaConsumer")
    
    //Create HiveContext  
      val hiveContext = new org.apache.spark.sql.hive.HiveContext(sparkContext)
    
      hiveContext.sql("CREATE EXTERNAL TABLE IF NOT EXISTS twitter_data (tweetId BIGINT, tweetText STRING, userName STRING, tweetTimeStamp STRING,   userLang STRING)")
      hiveContext.sql("CREATE EXTERNAL TABLE IF NOT EXISTS demo (foo STRING)")
    
    已经填充了一条记录的

    Hive 演示表。 Kafka 消费者循环遍历每一行的topic =“topic_twitter”数据并填充在Hive表中

    val hiveSql = "INSERT INTO TABLE twitter_data SELECT STACK( 1," + 
        tweetID        +","  + 
        tweetText      +"," + 
        userName       +"," +
        tweetTimeStamp +","  +
        userLang + ") FROM demo limit 1"
    
    hiveContext.sql(hiveSql)
    

    下面是我的Hadoop环境中的图像。 twitter_data,演示 Hie Tables in HDFS

    在HDFS中创建的最后10个文件 enter image description here

    你可以看到文件大小不超过200KB,有没有办法将这些文件合并到一个文件中?

3 个答案:

答案 0 :(得分:2)

[take 2] 好的,因此无法将数据“正确”“流”到Hive中。但是您可以添加定期的压缩后处理作业...

  • 使用3个分区创建表格,例如(role='collectA')(role='collectB')(role='archive')
  • 将您的Spark插入(role='activeA')
  • 在某些时候,切换到(role='activeB')
  • 然后转储您在“A”分区中收集的每条记录 进入“存档”,希望Hive默认配置能很好地限制碎片

    INSERT INTO TABLE twitter_data PARTITION (role='archive') SELECT ... FROM twitter_data WHERE role='activeA' ; TRUNCATE TABLE twitter_data PARTITION (role='activeA') ;

  • 在某些时候,切换回“A”等

最后一句话:如果Hive仍然在每个压缩作业上创建了太多文件,那么请在会话中尝试tweaking some parameters,就在INSERT之前,例如

set hive.merge.mapfiles =true;
set hive.merge.mapredfiles =true;
set hive.merge.smallfiles.avgsize=1024000000;

答案 1 :(得分:0)

Hive专为大规模批处理而设计,而不是用于交易。这就是为什么每个LOAD或INSERT-SELECT命令都有至少一个数据文件的原因。这就是为什么你没有INSERT-VALUES命令,因此你的帖子中显示的蹩脚语法是必要的解决方法。

嗯......在引入交易支持之前,这是真的。简而言之,您需要(a) Hive V0.14及更高版本(b)在该表上启用ORC表(c)事务支持(即锁定,周期性背景压缩等)

关于Streaming data ingest in Hive的维基可能是一个好的开始。

答案 2 :(得分:0)

您可以一起使用这些选项。

  1. 开启酸
  2. 创建orc表K. 与交易财产。
  3. 多次插入K. 通过流式传输或只使用insert dml。
  4. hive会自动创建小型delta文件
  5. 轻微的主要压力将会发生
  6. 小文件将合并为大文件。