Hadoop 配置单元为HDFS中的每个插入创建多个小文件

Hadoop 配置单元为HDFS中的每个插入创建多个小文件,hadoop,hive,hdfs,apache-kafka,spark-streaming,Hadoop,Hive,Hdfs,Apache Kafka,Spark Streaming,已经实现了以下目标: 卡夫卡制作人使用Spark流媒体从twitter获取数据 Kafka消费者将数据摄取到Hive外部表(在HDFS上) 虽然到目前为止效果还不错。 我只面临一个问题,当我的应用程序将数据插入配置单元表时,它创建了一个小文件,每个文件的每一行都有数据 下面是代码 // Define which topics to read from val topic = "topic_twitter" val groupId = "group-1" val consumer =

已经实现了以下目标:

  • 卡夫卡制作人使用Spark流媒体从twitter获取数据
  • Kafka消费者将数据摄取到Hive外部表(在HDFS上)
  • 虽然到目前为止效果还不错。 我只面临一个问题,当我的应用程序将数据插入配置单元表时,它创建了一个小文件,每个文件的每一行都有数据

    下面是代码

    // 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\u twitter”的数据,并填充到配置单元表中

    val hiveSql = "INSERT INTO TABLE twitter_data SELECT STACK( 1," + 
        tweetID        +","  + 
        tweetText      +"," + 
        userName       +"," +
        tweetTimeStamp +","  +
        userLang + ") FROM demo limit 1"
    
    hiveContext.sql(hiveSql)
    
    下面是我的Hadoop环境中的图像twitter\u数据,演示

    在HDFS中创建的最后10个文件


    如您所见,文件大小不超过200KB,有没有办法将这些文件合并到一个文件中?

    Hive是为批量处理而设计的,而不是为事务而设计的。这就是为什么每个LOAD或INSERT-SELECT命令至少有一个数据文件。这也是为什么没有INSERT-VALUES命令的原因,因此文章中显示的lame语法是一种必要的解决方法

    嗯。。。在引入事务支持之前,情况一直如此。简而言之,您需要(a)配置单元V0.14和更高版本(b)ORC表(c)在该表上启用事务支持(即锁、定期后台压缩等)

    关于的wiki可能是一个好的开始。

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

    • 使用3个分区创建表,例如
      (role='collectA')
      (role='collectB')
      (role='archive')
    • 将火花塞指向
      (role='activeA')
    • 在某些时候,切换到
      (role='activeB')
    • 然后转储在“A”分区中收集的所有记录 进入“归档”,希望配置单元默认配置能够很好地限制碎片

      插入表twitter\u数据分区(role='archive')
      选择。。。
      来自twitter_数据,其中role='activeA'
      ;
      截断表twitter\u数据分区(role='activeA')
      ;

    • 在某个时刻,切换回“A”等

    最后一句话:如果Hive在每个压缩作业中仍然创建了太多的文件,那么请在插入之前的会话中尝试

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

    您可以同时使用这些选项

  • 开酸
  • 创建orc表K 具有事务属性
  • 在K中插入多次。 通过流式传输或仅使用插入dml
  • 配置单元将自动创建小增量文件
  • 将发生小的或大的压缩
  • 小文件将合并为大文件

  • 谢谢萨姆森的回复。在spark-1.4内部,它使用了Hive-0.13:(HCat流式API是在V13.1中引入的(duh!),但有一些限制。Storm似乎有一个连接器(),但spark还没有()