如何从HDFS读取数据,然后发送到Elasticsearch并显示在kibana仪表盘上?
我知道ES-Hadoop有一个连接器,可以双向发送数据,但我的问题是在第一阶段从HDFS中拉数据。
最可行的方案是什么?请给我提供几个方案。
有用的信息。我有一个Hadoop的HDFS系统,正在汇总日志... 所以我必须把这些日志放到弹性搜索上,然后显示在Kibana仪表板上。
你当然可以创建一个bash脚本,定期运行并调用
hdfs dfs -copyToLocal <src> <dest>
来复制hdfs中的所有数据。
或者使用Hadoop的FileSystem java api创建一个输入流,从hadoop中流转数据。
public static FileSystem getFS(String hadoopUser) {
UserGroupInformation ugi = UserGroupInformation
.createRemoteUser(hadoopUser);
return ugi.doAs(new PrivilegedAction<FileSystem>() {
@Override
public FileSystem run() {
Configuration conf = new Configuration();
try {
return FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
});
return null;
}
然后...
FileSystem fs = getFS("hdfs");
InputStream in = fs.open(new Path("/path/to/hdfs/file"));
//do stuff with your input stream here...
关于把数据放到elasticsearch上,你可以做一些类似Netflix用inviso做的事情(在github上搜索inviso,看看jesindex_cluster_stats.py就知道了)。基本上,写一个与elasticsearch集成的python脚本,让这个脚本每隔几分钟运行一次,解析你从HDFS中提取的数据,随后将这些数据存储到elasticsearch中。