我希望有效地搜索大量日志(大小约为1 TB,放置在多台计算机上)。
为此,我想构建一个由Flume,Hadoop和Solr组成的基础架构。 Flume将从几台机器上获取日志并将它们放入HDFS。
现在,我希望能够使用map reduce作业索引这些日志,以便能够使用Solr搜索它们。我发现MapReduceIndexerTool为我做了这个,但我发现它需要 morphline 。
我知道,一般来说,一个morphline对它所采用的数据执行一系列操作,但是如果我想使用MapReduceIndexerTool,我应该执行哪种操作?
我找不到适合此地图缩减工作的形态线的任何示例。
谢天谢地。
答案 0 :(得分:1)
Cloudera有guide,其morphline
下的用例几乎相似。
在此图中,Flume Source接收syslog事件并发送它们 到Flume Morphline Sink,它将每个Flume事件转换为记录 并将其管道为readLine命令。 readLine命令提取 日志行并将其管道为grok命令。 grok命令使用 正则表达式模式匹配以提取一些子串 线。它将生成的结构化记录输入loadSolr 命令。最后,loadSolr命令将记录加载到Solr中, 通常是SolrCloud。在这个过程中,原始数据或半结构化 根据应用将数据转换为结构化数据 建模要求。
示例中给出的用例是MapReduceIndexerTool
,Apache Flume Morphline Solr Sink
和Apache Flume MorphlineInterceptor
以及Morphline Lily HBase Indexer等生产工具作为其操作的一部分运行,如下所述图:
答案 1 :(得分:1)
通常,在morplhine中,您只需读取数据,将其转换为solr文档,然后调用loadSolr
创建索引。
例如,这是我与MapReduceIndexerTools一起使用的moprhline文件,用于将Avro数据上传到Solr:
SOLR_LOCATOR : {
collection : collection1
zkHost : "127.0.0.1:2181/solr"
}
morphlines : [
{
id : morphline1
importCommands : ["org.kitesdk.**"]
commands : [
{
readAvroContainer {}
}
{
extractAvroPaths {
flatten : false
paths : {
id : /id
field1_s : /field1
field2_s : /field2
}
}
}
{
sanitizeUnknownSolrFields {
solrLocator : ${SOLR_LOCATOR}
}
}
{
loadSolr {
solrLocator : ${SOLR_LOCATOR}
}
}
]
}
]
运行时,它将读取avro容器,将avro字段映射到solr文档字段,删除所有其他字段,并使用提供的Solr连接详细信息创建索引。它基于this tutorial。
这是我用来索引文件并将它们合并到正在运行的集合中的命令:
sudo -u hdfs hadoop --config /etc/hadoop/conf \
jar /usr/lib/solr/contrib/mr/search-mr-job.jar org.apache.solr.hadoop.MapReduceIndexerTool \
--morphline-file /local/path/morphlines_file \
--output-dir hdfs://localhost/mrit/out \
--zk-host localhost:2181/solr \
--collection collection1 \
--go-live \
hdfs:/mrit/in/my-avro-file.avro
应该将Solr配置为可与HDFS一起使用,并且应该存在集合。
所有这些设置对我来说都适用于CDH 5.7 Hadoop上的Solr 4.10。