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 =
// 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”等
set hive.merge.mapfiles =true;
set hive.merge.mapredfiles =true;
set hive.merge.smallfiles.avgsize=1024000000;
您可以同时使用这些选项
谢谢萨姆森的回复。在spark-1.4内部,它使用了Hive-0.13:(HCat流式API是在V13.1中引入的(duh!),但有一些限制。Storm似乎有一个连接器(),但spark还没有()