已经实现了以下
虽然到目前为止工作正常。 我面临的问题只有一个,当我的应用程序将数据插入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,演示
你可以看到文件大小不超过200KB,有没有办法将这些文件合并到一个文件中?
答案 0 :(得分:2)
[take 2] 好的,因此无法将数据“正确”“流”到Hive中。但是您可以添加定期的压缩后处理作业...
(role='collectA')
,(role='collectB')
,(role='archive')
(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)
您可以一起使用这些选项。