更新时间:2024-11-29 GMT+08:00

Solr over HDFS

操作场景

Solr支持将HDFS中的数据批量导入Solr中,建立索引。用户可以通过shell命令,启动批量导入任务。

目前支持的数据格式有csv、xml、eml、html、txt、doc、pdf、xls、xlsx、jpg、png、tif等。

前提条件

  • 已成功安装HDFS、Solr、Yarn服务,且Manager页面内Solr服务的服务配置参数“INDEX_STORED_ON_HDFS”“TRUE”“SOLR_INDEX_LOCAL_STORAGE_DIR”参数值为空。
  • Solr over HDFS的源数据需要保存在HDFS中,不支持本地盘中的数据。
  • 若集群是普通模式,请关闭HDFS鉴权,避免权限不足问题。登录Manager。选择“集群 > 待操作集群的名称 > 服务 > HDFS > 配置”。单击“全部配置”。搜索参数“dfs.namenode.acls.enabled”和“dfs.permissions.enabled”。
    • “dfs.namenode.acls.enabled”表示是否启用HDFS ACL,默认为“true”启用ACL,请修改为“false”。
    • “dfs.permissions.enabled”表示是否为HDFS启用权限检查,默认为“true”启用权限检查,请修改为“false”。修改后HDFS中的目录和文件的属主、属组以及权限信息保持不变。

    单击“保存”,单击“确定”。等待界面提示操作完成,关闭HDFS鉴权。

准备工作

  1. 已安装Solr、HDFS、Yarn的客户端,例如安装路径为“/opt/client”。
  2. 拷贝xml配置文件。切换到Yarn客户端安装目录,将“/opt/client/Yarn/config/”目录下core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml文件拷贝到Solr客户端的“/opt/client/Solr/hdfs-indxer/conf”目录下。xml文件是访问HDFS和MapReduce必用的工具配置文件。
  3. 进入客户端安装目录,执行source bigdata_env导入环境变量。
  4. 执行如下命令,验证MapReduceIndexerTool的正确性。

    hdfs-indexer --help

    如下结果表示依赖包配置OK,MapReduceIndexerTool可以开始正常使用。

    FI02XB:/opt/client # hdfs-indexer --config /opt/client/Solr/hdfs-indexer/conf  jar /opt/client/Solr/lib/solr-map-reduce-*.jar -libjars "$SOLR_HADOOP_LIBJAR"  --  help 
     WARNING: Use "yarn jar" to launch YARN applications. 
     SLF4J: Class path contains multiple SLF4J bindings. 
     SLF4J: Found binding in [jar:file:/opt/client/HDFS/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
     SLF4J: Found binding in [jar:file:/opt/client/Solr/hbase-indexer/lib/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]   
     SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 
     SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] 
     usage: hadoop [GenericOptions]... jar solr-map-reduce-*.jar  
            [--help] --output-dir HDFS_URI [--input-list URI] --morphline-file FILE [--morphline-id STRING] 
            [--update-conflict-resolver FQCN] [--mappers INTEGER] [--reducers INTEGER] [--max-segments INTEGER] 
            [--fair-scheduler-pool STRING] [--dry-run] [--log4j FILE] [--verbose] [--show-non-solr-cloud] 
            [--zk-host STRING] [--go-live] [--collection STRING] [--go-live-threads INTEGER] [HDFS_URI [HDFS_URI ...]] 
      
     MapReduce batch job driver that takes a morphline and  creates  a  set  of  Solr index shards from a set of input 
     files and writes the indexes into  HDFS,  in  a  flexible,  scalable  and fault-tolerant manner. It also supports 
     merging the output shards into a set of  live  customer  facing  Solr servers, typically a SolrCloud. The program 
     proceeds in several consecutive MapReduce based phases, as follows:     

操作步骤

根据HDFS存储的数据格式不同,需要配置对应的morphlines配置文件(如下文的“ReadCSVContainer.conf”文件),本章节以csv文件为例进行说明,更多完整和详细的配置文件请参考http://kitesdk.org/docs/1.1.0/morphlines/morphlines-reference-guide.htmlhttps://github.com/kite-sdk/kite/tree/master/kite-morphlines/kite-morphlines-core/src/test/resources

  1. 执行以下命令进入客户端安装目录。

    cd /opt/client

  2. 执行以下命令配置环境变量。

    source bigdata_env

  3. 是否安装了多个Solr服务。

    • 是,使用客户端连接某个具体Solr服务时,请执行命令加载该具体服务的环境变量。例如,执行以下命令加载Solr-1服务变量:source Solr-1/component_env
    • 否,跳过此步骤。

  4. 如果集群为安全模式,执行以下命令进行用户认证。普通模式集群无需执行用户认证。

    kinit solr

  5. 执行命令,下载Solr的默认配置集到本地。

    solrctl confset --get confWithHDFS /opt/client/Solr/hdfs-indexer/config-csv/

  6. 进入下载Solr默认配置集到本地的目录“Solr/hdfs-indexer/config-csv/”,根据实际的数据所需要的字段修改配置文件“managed-schema”,执行vi conf/managed-schema

    例如为filedA~fieldG建立索引,修改“managed-schema”配置文件如下:

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
          <field name="timestamp" type="tlong" indexed="true" stored="true" multiValued="false" docValues="true" /> 
          <field name="fieldA" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
              <field name="fieldB" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
              <field name="fieldC" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
              <field name="fieldD" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
               <field name="fieldE" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
              <field name="fieldF" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
           <field name="fieldG" type="text_ngram" indexed="true" stored="true" multiValued="false" /> 
        <fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100"> 
           <analyzer type="index"> 
             <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> 
           </analyzer> 
           <analyzer type="query"> 
             <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> 
           </analyzer> 
           </fieldType>

    在客户端安装目录的“Solr/hdfs-indexer/m-conf/conf-model-Forcsv”内有managed-schema样例,可以参照进行增改。

  7. 修改完成配置之后,上传配置集到ZooKeeper。

    solrctl confset --create conf_test_100 /opt/client/Solr/hdfs-indexer/config-csv/

  8. 利用上传的配置集创建collection。

    solrctl collection --create collection_hdfs_100 -s 3 -c conf_test_100 -r 1 -m 10 -S true

  9. 将需要建立索引的数据上传HDFS的指定目录之下,具体操作请参考使用HDFS章节,例如:

    hdfs dfs -put /opt/client/Solr/hdfs-indexer/m-conf/conf-model-Forcsv/testfile-csv.txt hdfs://hacluster/user/solr/testfile-csv.txt

    在客户端安装目录的“Solr/hdfs-indexer/m-conf/conf-model-Forcsv”内有csv样例文件。

  10. 修改/opt/client/Solr/hdfs-indexer/m-conf/conf-model-Forcsv/ReadCSVContainer.conf配置文件中的“collection”和“zkHost”为实际的collection名称和zkHost值,文件格式如下:

    SOLR_LOCATOR : { 
        collection : collection_hdfs_100 // 修改为实际的collection名称
        zkHost : "192.168.1.1:2181,192.168.1.2:2181, 192.168.1.3:2181/solr" // 修改为实际集群的zkHost值,可根据Solr Dashboard查看。
        batchSize : 10000 
    }
    
    morphlines : [ 
       { 
         id : pretest 
         importCommands : ["org.kitesdk.**", "org.apache.solr.**"] 
         commands : [ 
           { 
             readCSV { 
               separator : ";" 
               columns : [timestamp,fieldA,fieldB,fieldC,fieldD,fieldE,fieldF,fieldG] 
               quoteChar : "\"" 
               charset : UTF-8 
             } 
           } 
           { 
             generateUUID { 
               field : id 
             } 
           } 
           { 
             sanitizeUnknownSolrFields { 
               solrLocator : ${SOLR_LOCATOR} 
             } 
           } 
           { logDebug { format : "output record: {}", args : ["@{}"] } } 
           { 
             loadSolr {          
               solrLocator : ${SOLR_LOCATOR} 
             } 
           } 
         ] 
       } 
     ]     
    表1 配置文件ReadCSVContainer.conf说明

    参数名

    说明

    SOLR_LOCATOR内

    collection

    Solr中创建好的collection名

    zkHost

    ZooKeeper信息

    batchSize

    单次提交到Solr建立索引的数量

    Morphlines内

    id

    自定义标识

    importCommands

    引用到的类

    separator

    每一列的分隔符

    columns

    每一列对应的collection中的field

    quoteChar

    文档内容的分割符以及文档起始行的标识

    charset

    编码格式

    generateUUID

    对应collection的uniqueKey

    logDebug

    日志输出格式

    CSV文件样例如下:

    1120420594561;SnVIeDqGwtAptrVzmbfQLCmde2BsDFISCG4;PwWbFHlTkeEUduwElwWZap01g;75U7OAQyy2JPMNmXWwe9SpGw;aphcCkOqA3iwRAu0QMrrEf6rLcdMqjL;s9C5R1pmHofdN1XOAr9NJ;oGO3z9A6sNSusRlxXfuaUDCH7P5cptIIo;sKe84RHByT3vYww73tY04szq91DKlh3s1o9
    1107591105847;HPp2JjFCFQ6BRxWFM17Iqye8Hl;xHxV249tLJ5Pl3HCcbYAPxe9RWh;qJb8esxvlAM06TZI5egmxECfMJD;Bp5OBAPT8GZufPOhuHY6LVb;uUKRJG7EGBh8SrvYzmXjjWdf97Thk2CPRAkORd;OVWhxibc47RblUx9vj6VkZAsz18kuBnNYIoPnlN;TjVBIv6FqRVKzeuwYmInxeFiM

    样例包含两条数据,每条数据以分号分隔字段,分别对应上述timestamp、fieldA、fieldB、fieldC、fieldD、fieldE、fieldF、fieldG各字段。

  11. 使用如下命令启动索引任务。

    nohup hdfs-indexer --morphline-file /opt/client/Solr/hdfs-indexer/m-conf/conf-model-Forcsv/ReadCSVContainer.conf --collection collection_hdfs_100 --go-live $HDFS_URI &

    在批量索引执行时,不要重复执行索引任务,这是因为批量索引为了提高效率采用了Merge index文件的方式建立索引,该方式不会逐条解析数据的Unique ID,所以当有重复数据导入时,会导致索引数据的重复,同一条索引在底层会被存储两次甚至多次,此时在Solr端进行查询,可以看有多条索引的数量显示,但是由于每个索引id重复,根据这个id去检索时,Solr找到一个id对应的索引即返回结果。导致查询到的数据又是唯一的,造成数据的紊乱,重复索引冲突相关可以参阅https://wiki.apache.org/solr/MergingSolrIndexes

    建议批量索引时,每次选用一个新的collection,这样,在索引任务执行失败后,可以选择直接删掉collection的方式进行回退清除数据。

    注意:配置文件ReadCSVContainer.conf中,collection和zkHost参数确认和实际环境保持一致;索引命令中HDFS_URI修改为对应HDFS实际目录。该批量索引不支持collection为implicit路由方式。

    表2 Solr over HDFS索引命令参数说明

    参数

    参数说明

    --config

    索引任务使用的配置文件所在目录,默认“${SOLR_HOME}/hdfs-indexer/conf”,用户也可以单独指定。

    jar

    索引任务使用的jar路径,默认“${SOLR_HOME}/lib/solr-map-reduce-${VERSION}.jar”,用户也可以单独指定。

    --libjars

    依赖jar的路径,默认“${SOLR_HADOOP_LIBJAR}”,用户也可以单独指定。

    --morphline-file

    morphline配置文件路径,必须由用户指定。

    --output-dir

    生成的索引输出路径,默认hdfs://hacluster/tmp/solr,用户也可以单独指定。

    --http-socket-timeout

    该参数用于在分片GoLive阶段时设置HTTP Socket Timeout,默认值为120000,单位为ms。在数据量较大时建议调大此参数以避免Socket超时。

    --mappers

    索引任务的mapper个数,默认-1,用户也可以单独指定。

    --reducers

    索引任务的reducer个数,默认-1,用户也可以单独指定。

    --zk-host

    Solr在zookeeper中的路径,默认本集群zk-host,用户也可以单独指定。

    --collection

    Solr的collection名,必须由用户指定。

    --go-live

    表示是否合并索引数据到Solr集群,不指定本参数则无法在Solr中查到建立的索引。

    HDFS_URI

    需要建立索引的原数据文件在HDFS上的路径,例如:hdfs://hacluster/user/solr/testfile-csv.txt,必须由用户指定。

    索引任务进度和日志可以在Yarn服务内进行查询,可参考使用Yarn相关章节。

    以上操作适用于简单测试环境参考,在实际生产环境还需要对相应硬件环境和组件配置进行调优。