大数据系列-CDH环境中SOLR入数据
1 创建集合
SSH远程连接到安装了SOLR的CDH节点。
运行solrctl instancedir --generate /solr/test/GX_SH_TL_TGRYXX_2015命令就会生成GX_SH_TL_TGRYXX_2015集合的默认配置。
进入/solr/test/GX_SH_TL_TGRYXX_2015/conf目录,先编辑schema.xml配置字段信息,具体网上一搜一片。
solrconfig.xml文件中在其他<lib/>后面新增<lib dir="/iflytek/solrJar/" regex=".*\.jar"/>,将oracle驱动等依赖jar放在/iflytek/solrJar/目录下,然后远程拷贝/iflytek/solrJar/到其他SOLR节点。
solrconfig.xml文件中在其他< requestHandler />后面新增如下节点。
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
- 在/solr/test/GX_SH_TL_TGRYXX_2015/conf目录下新增文件data-config.xml,主要就是配置数据库信息,和要入的数据的对应的查询语句,其中${}表示参数,每次入数据都需要传入这几个参数,内容示例如下:
<dataConfig>
<dataSource name="jdbc" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@10.154.5.11:1521:test1" user="test" password="test" batchSize="10000"/>
<document name="defualt">
<entity pk="ID" name="GX_SH_TL_TGRYXX_2015" query="select ID,XM,SFZH as ZJHM,XB_MC as XB,MZ,TGKKDM AS KKBH,TGKKMC AS KKMC,TGKKSSD AS KKSZDZ,TGSJ,RKSJ AS RYBSJ,CREATEDATE,ETLDATE from ${dataimporter.request.tableName} t where t.etldate>='${dataimporter.request.dateStart}' and t.etldate < '${dataimporter.request.dateEnd}'" >
</entity>
</document>
</dataConfig>
- 运行命令solrctl instancedir --create GX_SH_TL_TGRYXX_2015 /solr/test /GX_SH_TL_TGRYXX_2015,将配置上传到zookeeper中,以后可用命令solrctl instancedir --update GX_SH_TL_TGRYXX_2015 /solr/test /GX_SH_TL_TGRYXX_2015将修改后的配置更新到zookeeper中。
用命令solrctl collection --create GX_SH_TL_TGRYXX_2015 -s 3创建集合,GX_SH_TL_TGRYXX_2015是集合名称,当集合名称与前面上传的配置名相同时这里不需要指定配置名称,不同时需要用-c参数指定配置名称,-s 3这个参数指定该集合的分片数,我现在的集群中有3个solr节点,这样就会分片到3个节点上,3个节点数据不是重复的,其中一个节点挂掉时可以加上shards.tolerant=true参数进行查询,数据量只有之前的2/3。
2 手动入数据
通过上述步骤就创建好了集合了,以后要创建其他集合时,可以再solr管理界面看到,如下图:
先去掉Clean的复选框,选择dataconfig中创建的实体,Custom Parameters可以让我们传入自定义参数,我前面创建集合时定义了3个参数,表名和一个时间范围,这样就可以在不修改配置的情况下分片入多个表的数据到一个集合中了。
为什么会定义上面3个参数呢?因为一个SOLR中一个集合一般都对应oracle中多张表(数据量大,分年或分月),一张表中数据量达到几亿时,一次性入进去可能会报快照过旧,这样入进入的数据也无法区分,只能全部重新入,所有这里定义了个时间范围以减小每次入库的数据量避免快照过旧的问题,哪次入库报错就重入哪一次的数据。
如果需要分片入的次数不多的话,可以就在该管理界面人工调整参数入。
3 自动入数据
上面的按时间分片若分片过大就用不到索引,分片过小人工调整参数就不现实了。
于是一般的想法可以写java定时任务,定时检测入库状态,一次入库完成就自动调整参数入下一批数据。
我比较熟悉kettle,我这里使用的是kettle来完成这个工作,不熟悉kettle的就使用java定时任务就行了,存量数据入了还需要持续的入增量数据,这个是必须要有定时任务的。
自动入库每次都要记录日志,便于排查哪次数据入库失败,可以人工单独补进去。
Solr的dataimport有增量入库的方法,但没用过,自己写定时任务可以记录日志到数据库便于监控。
附件2是我正在使用的job,有存量入库和增量入库,我将其中的数据库信息删除了,无法直接运行,仅作参考,看不懂就自己写java吧。
如下两张图是job截图,具体还是用kettle打开看。
图- 1存量入库job示例
图- 2增量入库job示例
对应文档和附件:http://pan.baidu.com/s/1kTxptMv
附SOLR小知识
查询时在Raw Query Parameters对应的文本框中填入collection=collection1,collection2自定义参数,就可以查询多个集合。
删除一个查询结果的数据:http://slave3:8983/solr/GX_GA_JJZD_KKXX/update/?stream.body=<delete><query>ETLDATE:[20150106103453 TO 20150116103453]</query></delete>&commit=true
当集合分片中有分片损坏时,直接查询要报错,加上shards.tolerant=true参数可以忽略错误分片,只查询好的分片。
取消document唯一性检查(Disable unique document check):默认情况下,索引的时候Solr会检查主键是否有重复的,以避免不同的document使用相同的主键。如果你确认你的document不会有重复的主键,将参数allowDups=true加到url上可以取消检查,对于scv文档,使用overwrite=false。
- 根据用途设置字段类型,string类型是不会分词的,想实现如关系数据库的效果时最好用string类型,我就是开始没经验使用了text_general类型,讨了不少麻烦。
附Solrctl帮助
[root@slave1 conf]# solrctl --help
usage: /usr/bin/solrctl [options] command [command-arg] [command [command-arg]] ...
Options:
--solr solr_uri
--zk zk_ensemble
--help
--quiet
Commands:
init [--force]
instancedir [--generate path [-schemaless]]
[--create name path]
[--update name path]
[--get name path]
[--delete name]
[--list]
collection [--create name -s <numShards>
[-a Create collection with autoAddReplicas=true]
[-c <collection.configName>]
[-r <replicationFactor>]
[-m <maxShardsPerNode>]
[-n <createNodeSet>]]
[--delete name]
[--reload name]
[--stat name]
[--deletedocs name]
[--list]
core [--create name [-p name=value]...]
[--reload name]
[--unload name]
[--status name]
cluster [--get-solrxml file]
[--put-solrxml file]
大数据系列-CDH环境中SOLR入数据的更多相关文章
- 关于 CDH 环境中部署 Dolphinscheduler 出现 hive-jdbc 包冲突的解决办法
目前社区小伙伴经常反映在 cdh 环境中部署 Dolphinscheduler 出现 hive 包冲突的问题,报错日志信息如下: [WARN] 2020-04-29 09:55:30.815 org. ...
- 分布式环境中,模块数据交互协议分析 (百度brpc)
1. 背景 之前听到同事说,要为自己的模块考虑写个数据协议.今天有空想了一下.写出来,方便后续使用. 开源代码brpc中可以支持多种协议,nshead.redis.mongo等20多种协议. 2. 什 ...
- Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
前几篇文章介绍了Nginx的应用.动态路由.配置.在实际生产环境部署时,我们需要同时考虑Nginx的高可用性和部署架构. Nginx自身不支持集群以保证自身的高可用性,商业版本的Nginx+推荐: T ...
- for循环中进行联网请求数据、for循环中进行异步数据操作,数据排序错乱问题解决;
for循环中进行联网请求数据,由于网络请求是异步的,第一个网络请求还没有回调,第二次第三次以及后续的网络请求又已经发出去了,有可能后续的网络请求会先回调:这时我们接收到的数据的排序就会错乱:怎么才能让 ...
- 如何将阿里云上的RDS 备份的mysql数据还原到windows环境中
一.本地mysql数据库创建与备份库一致的数据库名,如testdb: 二.本地创建与备份库一致的数据库表,记得设置ALTER TABLE tableName1 ROW_FORMAT = compact ...
- 创建触发器在表中播入数据时ID自动增长
),age )) create or replace trigger gger_tt before insert on ttt for each row when (new.id is null) b ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- DTO – 服务实现中的核心数据
在一个Web服务的实现中,我们常常需要访问数据库,并将从数据库中所取得的数据显示在用户页面中.这样做的一个问题是:用于在用户页面上展示的数据和从数据库中取得的数据常常具有较大区别.在这种情况下,我们常 ...
- Oracle rac集群环境中的特殊问题
备注:本文摘抄于张晓明<大话Oracle RAC:集群 高可用性 备份与恢复> 因为集群环境需要多个计算机协同工作,要达到理想状态,必须要考虑在集群环境下面临的新挑战. 1.并发控制 在集 ...
随机推荐
- Chrome 开发工具之Timeline
之前有说到Element,Console,Sources大多运用于debug,Network可用于debug和查看性能,今天的主角Timeline更多的是用在性能优化方面,它的作用就是记录与分析应用程 ...
- BZOJ4698: Sdoi2008 Sandy的卡片
差分,枚举一个串的所有后缀,暴力在所有其他串中kmp,复杂度$O(nm^2)$. #include<cstdio> const int N=1005; const int M=105; i ...
- HTTP 基础知识
HTTP是一种协议.HTTP使用流程,一般情况下, 第一:由HTTP客户端发出请求,创建端口. 第二:HTTP服务器在端口监听客户端的请求. 第三:一旦收到请求,HTTP服务器向客户端返回状态和内容. ...
- RabbitMQ学习系列(一): 介绍
1. 介绍 RabbitMQ是一个由erlang开发的基于AMQP(Advanced Message Queue )协议的开源实现.用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面都非 ...
- Spring Boot整合Dubbo框架demo
Dubbo框架原理见之前的博文:http://www.cnblogs.com/umgsai/p/5836925.html 首先启动zookeeper Server端 Pom配置如下 <?xml ...
- coreseek+sphinx+mysql+thinkphp整合
1.安装coreseek 1.1首先升级或安装系统依赖库 yum install make gcc g++ automake libtool mysql-client libmysqlclient15 ...
- SQL Server 2016正式版安装(超多图)
微软数据库SQL Server 2016正式版在2016年6月就发布,由于近期工作忙,一直拖到现在才有时间把安装过程写到博客上,分享给大家.本人一直习惯使用英文版,所以版本和截图都是英文版的.废话少说 ...
- java时间类型操作
java中Date类型与字符串相互转化 Date date = new Date(); System.out.println(date); //DateFormat类为一个 ...
- c语言经典算法—求0—7 所能组成的奇数个数
题目:求0—7 所能组成的奇数个数. 算法思想:这个问题其实是一个排列组合的问题,设这个数为sun=a1a2a3a4a5a6a7a8,a1-a8表示这个数的某位的数值,当一个数的最后一位为奇数时,那么 ...
- scrapy 学习笔记
1.scrapy 配合 selenium.phantomJS 抓取动态页面, 单纯的selemium 加 Firefox浏览器就可以抓取动态页面了, 但开启窗口太耗资源,而且一般服务器的linux 没 ...