场景描述:前段时间,将实时数据通过kafka+flume+morphline的方式接入到solr中。新进来的数据已经可以在solr中看到了,但是以前的历史数据还没有导入solr。

CDH提供利用MapReduceIndexerTool来将HDFS的数据导入到solr。

历史数据格式类似如下按年/月/日保存在HDFS上每天一个文件:

-/user/data/2016

-11

-1

-data.txt

-2

-data.txt

-12

-1

-data.txt

-2

-data.txt

文件的格式为一行一行的json。

思路:

先对2016目录下的所有子目录遍历文件,

再对文件进行批量的索引操作。

使用命令:(jar包在/opt/cloudera/parcels/CDH/jars下)

hadoop jar search-mr-1.0.-cdh5.8.0-job.jar org.apache.solr.hadoop.HdfsFindTool  -find hdfs://cdh-master/user/kafkadata/eventCount/2016/11  -type f | sudo -u xuyali hadoop --config /etc/hadoop/conf.solrindexer/  jar search-mr-1.0.0-cdh5.8.0-job.jar  org.apache.solr.hadoop.MapReduceIndexerTool --log4j log4j.properties  --morphline-file morphline.conf --zk-host cdh-master:2181/solr --collection event_count_records  --output-dir hdfs://cdh-master/user/hdfs/test/ --verbose --go-live  --input-list -

参考:cdh官方文档——batch indexing solr

*注意:官方文档中用的配置是mapreduce1,可以用yarn的客户端配置来代替该配置。

morphline.conf

SOLR_LOCATOR : {
# Name of solr collection
collection : event_count_records # ZooKeeper ensemble
#CDH的专有写法,开源版本不支持。
zkHost : "$ZK_HOST"
} morphlines : [
{
id : morphline1
importCommands : ["org.kitesdk.**", "org.apache.solr.**"] commands : [
{
readLine {
charset : UTF-8
}
}
{setValues:{_attachment_body : "@{message}"}} {java:{
imports:"import java.io.*;import org.kitesdk.morphline.base.Fields;"
code:"""
String message=(String)record.getFirstValue(Fields.ATTACHMENT_BODY);
if(message.contains("'"))
{
return true;
}
InputStream inputStream = new ByteArrayInputStream(message.getBytes());
record.removeAll(Fields.ATTACHMENT_BODY);
record.put(Fields.ATTACHMENT_BODY, inputStream);
return child.process(record);
"""
}} {
#Flume传过来的kafka的json数据是用二进制流的形式,需要先读取json
readJson{}
} {
#读出来的json字段必须转换成filed才能被solr索引到
extractJsonPaths {
flatten:true
paths:{
account:/account
accountName:/accountName
subaccount:/subaccount
subaccountName:/subaccountName
eventTime:/timestamp
eventType:/eventType
eventTags:"/eventTags[]/name"
#按UTC时间存timestamp
eventTimeInMinuteUTC_tdt:/timestamp
#按China时间存timestamp
eventTimeInMinuteChina_tdt:/timestamp
#按UTC时间存timestamp
eventTimeInHourUTC_tdt:/timestamp
#_tdt后缀会被动态识别为日期类型的索引字段
#按不同时间间隔存索引以增加查询性能
} }
} #转换long型时间为Date格式
{convertTimestamp {
field : eventTimeInMinuteChina_tdt
inputFormats : ["unixTimeInMillis"]
inputTimezone : UTC
outputFormat : "yyyy-MM-dd'T'HH:mm:ss.SSS'Z/MINUTE'"
outputTimezone : Asia/Shanghai
}} {convertTimestamp {
field : eventTimeInMinuteUTC_tdt
inputFormats : ["unixTimeInMillis"]
inputTimezone : UTC
outputFormat : "yyyy-MM-dd'T'HH:mm:ss.SSS'Z/MINUTE'"
outputTimezone : UTC
}} {convertTimestamp {
field : eventTimeInHourUTC_tdt
inputFormats : ["unixTimeInMillis"]
inputTimezone : UTC
outputFormat : "yyyy-MM-dd'T'HH:mm:ss.SSS'Z/HOUR'"
outputTimezone : UTC
}} #kafka中的json数据传到flume中时会被放入_attachment_body字段,readJson后会变成JsonNode对象,需要toString之后才能保存
{toString { field : _attachment_body }} #为每一条记录生成一个UUID
{generateUUID {
field : id
}} sanitizeUnknownSolrFields {
solrLocator : ${SOLR_LOCATOR}
} #对未定义的Solr字段加tws前缀,根据schema.xml中定义的tws_*为text_ws类型,会动态未未定义的字段建索引。 #将数据导入到solr中
{loadSolr {solrLocator : ${SOLR_LOCATOR}}}
]
}
]

log4j.properties:

log4j.rootLogger=WARN, A1

log4j.logger.org.apache.flume.sink=INFO
#log4j.logger.org.apache.flume.sink.solr=DEBUG
log4j.logger.org.apache.solr=INFO
#log4j.logger.org.apache.solr.hadoop=DEBUG
log4j.logger.org.kitesdk.morphline=TRACE
#log4j.logger.org.apache.solr.morphline=DEBUG
log4j.logger.org.apache.solr.update.processor.LogUpdateProcessor=WARN
log4j.logger.org.apache.solr.core.SolrCore=WARN
log4j.logger.org.apache.solr.search.SolrIndexSearcher=ERROR # A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

map数等于要被批量索引的文件数。

yarn的客户端配置可以作下修改,设置reduce的个数,每个map占用的内存cpu等(map数不能修改)。

任务完成提示:

*批量索引的效率并不一定总是比实时索引高,但优点是不吃solr服务性能——没有调用solr接口,而是直接生成索引文件后移至solr collection目录下。

*调试morphline.conf bug时先用小点的单个文件,如果morphline写的有错,一个文件的任务失败会导致整个任务失败。

CDH离线数据导入solr:利用MapReduceIndexerTool将json文件批量导入到solr的更多相关文章

  1. csv文件批量导入数据到sqlite。

    csv文件批量导入数据到sqlite. 代码: f = web.input(bs_switch = {})  # bs_switch 为from表单file字段的namedata =[i.split( ...

  2. Weka里如何将arff文件或csv文件批量导入MySQL数据库(六)

    这里不多说,直接上干货! 前提博客是 Weka中数据挖掘与机器学习系列之数据格式ARFF和CSV文件格式之间的转换(四) 1.将arff文件批量导入MySQL数据库 我在这里,arff文件以Weka安 ...

  3. C#中实现excel文件批量导入access数据表中

    一 .界面简单设计如下: 二 .代码如下: using System; using System.Collections.Generic; using System.ComponentModel; u ...

  4. Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra

    欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假 ...

  5. java实现文件批量导入导出实例(兼容xls,xlsx)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

  6. Logstash:解析 JSON 文件并导入到 Elasticsearch 中

    转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...

  7. Oracle:从SQL文件批量导入数据

    进入DOS界面. 进入SQL文件目录. 在命令提示下运行SqlPlus,c:\sql>sqlplus user_name/password@net_service_name 指定SQL执行日志文 ...

  8. 通过 txt 文件批量导入需要批量处理的数据的标识字段

    前言 在一些工作中,可能需要对数据库中的一些数据(批量)进行处理(修改或者查询),而数据的来源是你的同事,换句话说就是这批数据不可能通过某些查询条件查出来, 而这批数据又比较多,比如几百.几千甚至几万 ...

  9. sql文件批量导入mysql数据库

    有一百多个sql文件肿么破?一行一行地导入数据库肯定是极其愚蠢的做法,但是我差点就这么做了... 网上首先找到的方法是:写一个xxx.sql文件,里边每一行都是source *.sql ...,之后再 ...

随机推荐

  1. DotNet指定文件显示的尺寸

    在项目中开发中,有时候需要将文件的尺寸进行控制,例如需要将文件的尺寸指定为字节,TB等.现在提供一个方法,实现将指定文件的尺寸, 提供:"字节", "KB", ...

  2. 【原创】SQL审核系统

    前言 应公司dba的需求,做了一个sql审核并可以执行.记录的系统,整个系统有三种角色: DBA(需要管理员手动登记) 运维人员(需要管理员手动登记) 开发人员(默认注册后用户) 权限分配如下: 一些 ...

  3. vue-resource请求超时timeout设置

    请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ...

  4. ASP.NET开源CMS

    CMS这里指 内容管理系统.是Content Management System的缩写. 产生 随着网络应用的丰富和发展,很多网站往往不能迅速跟进大量信息衍生及业务模式变革的脚步,常常需要花费许多时间 ...

  5. SqlServer切换MySql总结

    最近项目任务不多就琢磨着把SqlServer换成MySql(数据访问使用的ado.net),初步想了下方案有2种: 方案一:继续使用ado.net,重写所有的sql语句 优势:数据访问效率高,改写Sq ...

  6. C#写爬虫,版本V2.1

    这次是对2.0的小修补,2.0交互几乎没有,这次添加了进度条,和文本框,同时由于取得的链接主要会出现错误是:webResponse错误. 针对这种情况,设置了 try { webResponse = ...

  7. Bootstrap之表单控件状态

    Bootstrap中的表单控件状态主要有三种:焦点状态,禁用状态,验证状态.   一.焦点状态:该状态告诉用户可输入或选择东西 焦点状态通过伪类“:focus”以实现. bootstrap.css相应 ...

  8. 在Intellij IDEA 下通过Maven新建项目的一些体会

    因为习惯的原因,一直在用jetbrain的IDE,最近的在开发javaEE项目,并尝试用maven来管理依赖,那这中间又出了什么让我不得不写下来的呢 一.先来看看在IDEA下怎么用maven建项目 1 ...

  9. Visual Studio for Mac 简介

    2016-12-13 Hutchinson 微软中国MSDN 在 11 月举行的 Connect(); 上,Microsoft 将推出 Visual Studio for Mac 预览版.这是一个激动 ...

  10. codis集群安装

    在网上找了很多codis的集群安装方法,看起来都是大同小异,本人结合了大多种方法完成了一套自己使用的codis的集群安装,可以供大家学习使用,如果有什么问题或者不懂的地方欢迎指正 1.集群规划: 三台 ...