在配置flume的时,使用了hdfs sink,只配置了一下基本配置,其他的都是默认的配置。hive里面建表也并没有指定数据的存储格式,没有指明 store as。两个都是使用默认,由此产生了问题。
下面进行问题的剖析。
flume的版本是1.9.0,这里的hdfs sink的默认文件的存储格式是SequenceFile格式,也就是把flume上传到hdfs的文件保存为sequenceFile文件类型。

也正是fileType是默认的,并且hive里面的创建的表,默认文件是text普通的文本格式的。hive对文件的读取也都是采用默认的TextInputFormat,这是用来处理text普通文本的InputFormat的。

也正是上面两个默认,导致了hive进行数据查询的时候,并没有查询出数据,而是报错。

解决办法
目前解决办法有两个,第一个是操作起来比较简单的,也是比较推荐的
- 创建stored as SequenceFile的表
首先将原表删除,注意删除分区,清空数据之类的。
drop table test;
然后创建新表
create table test(
id string,
name string
)stored as SequenceFile;
2.修改flume的hdfs suink
把之前的hdfs sink里面默认的SequenceFile,修改成为DataStream,DataStream指的是text本文的格式保存,添加一下配置
a1.sinks.sink1.hdfs.fileType=DataStream
以上就是问题的描述和解决。
下面进行一些拓展,hdfs的
hdfs.fileType在fluem的hdfs sink的配置里面有3个值。
SequenceFile:是fileType的默认值,会将fluem传入的数据保存为sequence的文件格式。底层原理是使用client连接hdfs,然后使用SequenceInputFormat写出数据到hdfs。
DataStream:也是是直接输出,也就是不对文本做格式上面的处理,采用textInPut
CompressedStream :这个一般用于指定文件的压缩格式,当然需要hadoop那边支持才可以配置
#这里指定采用lzo的压缩,需要hdfs支持lzo才可以
a1.sinks.k1.hdfs.fileType = CompressedStream
a1.sinks.k1.hdfs.codeC = lzop
网友评论