solr和hbase结合进行索引搜索

秋招突击——笔试整理——8/25——拼多多笔试整理 继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的! 阅读详情
  1. solrcloud集群情况
    solrcloud集群已经安装完成。
    solr版本:5.5.0,zookeeper版本:3.4.6
    solr的操作用户、密码: solr/solr123
    solr使用的zookeeper安装位置:/opt/zookeeper-3.4.6
    solr安装位置:/opt/solr-5.5.0
    solr端口:8983
    zookeeper端口:9983
    5台机器,每台机器上安装的都有solr和zookeeper

    zookeeper启动:/opt/zookeeper-3.4.6/bin/zkServer.sh start
    zookeeper停止:/opt/zookeeper-3.4.6/bin/zkServer.sh stop
    zookeeper状态:/opt/zookeeper-3.4.6/bin/zkServer.sh status
    
    solr启动:/opt/solr-5.5.0/bin/solr start
    solr停止:/opt/solr-5.5.0/bin/solr stop
    solr状态:/opt/solr-5.5.0/bin/solr status
    
    solr访问:http://10.1.202.67:8983/solr/ 
                    http://10.1.202.68:8983/solr/ 
                    http://10.1.202.69:8983/solr/ 
                    http://10.1.202.70:8983/solr/ 
                    http://10.1.202.71:8983/solr/ 
    
  2. 复制IK分词到solr中
    注意:IK分词不要用之前IKAnalyzer2012FF_u1.jar的版本,以前版本不支持solr5.0以上,需要用IKAnalyzer2012FF_u2.jar,或者在github上下载源码,然后自己编译,github连接如下:
    https://github.com/EugenePig/ik-analyzer-solr5/blob/master/README.md
    本人用的是自己编译的ik分词包Ik-analyzer-solr5-5.x.jar
    scp ./Ik-analyzer-solr5-5.x.jar solr@10.1.202.67:/opt/solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib
    scp ./Ik-analyzer-solr5-5.x.jar solr@10.1.202.68:/opt/solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib
    scp ./Ik-analyzer-solr5-5.x.jar solr@10.1.202.69:/opt/solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib
    scp ./Ik-analyzer-solr5-5.x.jar solr@10.1.202.70:/opt/solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib
    scp ./Ik-analyzer-solr5-5.x.jar solr@10.1.202.71:/opt/solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib

    3.managed-schema修改
    solr5.5.0版本已经没有schema.xml的文件,替代用的是managed-schema,在solr-5.5.0/server/solr/configsets/目录下,在此目录下复制sample_techproducts_configs文件夹,命令如下:
    cp sample_techproducts_configs poc_configs
    编辑poc_configs/conf/managed-schema 增加ik分词字段类型和ik分词字段
    vim managed-schema

<fields>
        <field name="title_ik" type="text_general" indexed="true" stored="true"/>
        <field name="content_ik" type="text_ik" indexed="true" stored="false"/>
        <field name="content_outline" type="text_general" indexed="false" stored="true"/>
    </fields>
    <fieldType name="text_ik" class="solr.TextField">
        <analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        <analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

注:content_ik字段太长,不能够存储文件,只能生产索引,也没有必要存储原文,导致数据量加大,搜索可能会受影响,内容的前50个字段截取出来存储到content_outline,方便查看内容的大致内容

重启solr服务器
./solr_stop_all.sh

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin


slaves="dn-1 dn-2 dn-3 dn-4 dn-5"
cmd="/opt/solr-5.5.0/bin/solr stop"
for slave in $slaves
do
    echo $slave
    ssh $slave $cmd
done

./solr_start_all.sh

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin


slaves="dn-1 dn-2 dn-3 dn-4 dn-5"
cmd="/opt/solr-5.5.0/bin/solr start"
for slave in $slaves
do
    echo $slave
    ssh $slave $cmd
done

分词测试
使用text_ik分词:
这里写图片描述

  1. 创建collection
    编辑完成后可以创建collection,命令如下:
    /opt/solr-5.5.0/bin/solr create -c collection1 -d /opt/solr-5.5.0/server/solr/configsets/poc_configs/conf -shards 5 -replicationFactor 2
    创建完成后在访问页面出现一下内容:
    这里写图片描述

配置文件并不会生成到solr目录下,而是增加到zookeeper上
连接zookeeper
/opt/zookeeper-3.4.6/bin/zkCli.sh -server 10.1.202.67:9983
这里写图片描述

  1. 当创建失败collection时,可以通过命令删除,命令如下:
    /opt/solr-5.5.0/bin/solr delete -c collection1 -deleteConfig true
    注:-deleteConfig true是删除zookeeper上的配置文件,防止下次创建时直接用此配置项或者报错
    如果还是不行,那说明zookeeper上的配置文件没有删除,直接登录zookeeper,通过rmr /configs/collection1命令删除配置项。

  2. 编写solrCloud通过mapreduce读取hbase的字段生成索引
    主方法:

public class SolrHBaseMoreIndexer {

    public static  Logger logger = LoggerFactory.getLogger(SolrHBaseMoreIndexer.class);


    private static void hadoopRun(String[] args){

        String tbName = ConfigProperties.getHBASE_TABLE_NAME();
        try {
            Job job = new Job(ConfigProperties.getConf(), "SolrHBaseMoreIndexer");
            job.setJarByClass(SolrHBaseMoreIndexer.class);

            Scan scan = new Scan();
            //开始和结束并不是ID,而是hbase的rowkey,rowkey是通过数字排序,而是通过字符串进行排序,所以109在1000的后面,即1 。。。1000 。。。109
            scan.setStartRow(Bytes.toBytes("1"));
            scan.setStopRow(Bytes.toBytes("109"));
            for(String tbFamily:ConfigProperties.getHBASE_TABLE_FAMILY().split(",")){
                 scan.addFamily(Bytes.toBytes(tbFamily));
                 logger.info("tbName:"+tbName+",tbFamily:"+tbFamily);
            }

            scan.setCaching(500); // 设置缓存数据量来提高效率
            scan.setCacheBlocks(false);
            // 创建Map任务
            TableMapReduceUtil.initTableMapperJob(tbName, scan,
                    SolrHBaseMoreIndexerMapper.class, null, null, job);
             // 不需要输出
            job.setOutputFormatClass(NullOutputFormat.class);
            // job.setNumReduceTasks(0);

            System.exit(job.waitForCompletion(true) ? 0 : 1);
        } catch (Exception e) {
            logger.error("hadoopRun异常", e);
        } 


    }


    public static void main(String[] args) throws IOException,
            InterruptedException, ClassNotFoundException, URISyntaxException {

        SolrHBaseMoreIndexer.hadoopRun(args);
    }
}

mapper方法:

public class SolrHBaseMoreIndexerMapper extends TableMapper<Text, Text> {
     CloudSolrClient cloudSolrServer;
     @Override
     protected void setup(Context context)
             throws IOException, InterruptedException {
         cloudSolrServer=SolrServerFactory.getCloudSolrClient();
     }
     @Override
     protected void cleanup(Context context
             ) throws IOException, InterruptedException {
         try {
            cloudSolrServer.commit(true, true, true);
            cloudSolrServer.close();
        } catch (SolrServerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

     }
    public static  Logger logger = LoggerFactory.getLogger(SolrHBaseMoreIndexerMapper.class);
    public void map(ImmutableBytesWritable key, Result hbaseResult,
            Context context) throws InterruptedException, IOException {
        SolrInputDocument solrDoc = new SolrInputDocument();
        try {
            solrDoc.addField("id", new String(hbaseResult.getRow()));
            logger.info("id:"+new String(hbaseResult.getRow()));
            for (KeyValue rowQualifierAndValue : hbaseResult.list()) {
                String fieldName = new String(rowQualifierAndValue.getQualifier());
                String family = new String(rowQualifierAndValue.getFamily());
                String fieldValue = new String(rowQualifierAndValue.getValue());
                if(family.equals("content")){
                    solrDoc.addField("content_outline",fieldValue.length()>50?fieldValue.substring(0, 50)+"...":fieldValue);
                }
                for(String tbFamily:ConfigProperties.getHBASE_TABLE_FAMILY().split(",")){
                    if(family.equals(tbFamily))solrDoc.addField(tbFamily+"_ik", fieldValue);
                }
            }
            //1分钟提交一次,防止每次提交影响效率
            cloudSolrServer.add(null,solrDoc,60000);
        } catch (SolrServerException e) {
            logger.error("更新Solr索引异常:" + new String(hbaseResult.getRow()),e);
        }
    }
}

配置文件读取类:

public class ConfigProperties {
    public static  Logger logger = LoggerFactory.getLogger(ConfigProperties.class);
    private static Properties props;
    private static String HBASE_ZOOKEEPER_QUORUM;
    private static String HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT;
    private static String HBASE_MASTER;
    private static String HBASE_ROOTDIR;
    private static String DFS_NAME_DIR;
    private static String DFS_DATA_DIR;
    private static String FS_DEFAULT_NAME;
    private static String HBASE_TABLE_NAME; // 需要建立Solr索引的HBase表名称
    private static String HBASE_TABLE_FAMILY; // HBase表的列族
    private static String QUERY_FIELD;
    private static String SOLR_ZOOKEEPER;
    private static String SOLRCLOUD_SERVER1;
    private static String SOLRCLOUD_SERVER2;
    private static String SOLRCLOUD_SERVER3;
    private static String SOLRCLOUD_SERVER4;
    private static String SOLRCLOUD_SERVER5;
    private static String wordsFilePath;
    private static String querySeparator;
    private static String COLLECTION;
    private static boolean isQueryContent;
    private static Configuration conf;

    /**
     * 从配置文件读取并设置HBase配置信息
     * 
     * @param propsLocation
     * @return
     */
    static {
        props = new Properties();
        try {
            InputStream in = ConfigProperties.class.getClassLoader().getResourceAsStream("config.properties");  
            props.load(new InputStreamReader(in,"UTF-8"));

            HBASE_ZOOKEEPER_QUORUM = props.getProperty("HBASE_ZOOKEEPER_QUORUM");
            HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT = props.getProperty("HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT");
            HBASE_MASTER = props.getProperty("HBASE_MASTER");
            HBASE_ROOTDIR = props.getProperty("HBASE_ROOTDIR");
            DFS_NAME_DIR = props.getProperty("DFS_NAME_DIR");
            DFS_DATA_DIR = props.getProperty("DFS_DATA_DIR");
            FS_DEFAULT_NAME = props.getProperty("FS_DEFAULT_NAME");
            HBASE_TABLE_NAME = props.getProperty("HBASE_TABLE_NAME");
            HBASE_TABLE_FAMILY = props.getProperty("HBASE_TABLE_FAMILY");
            QUERY_FIELD = props.getProperty("QUERY_FIELD");
            SOLR_ZOOKEEPER = props.getProperty("SOLR_ZOOKEEPER");
            SOLRCLOUD_SERVER1= props.getProperty("SOLRCLOUD_SERVER1");
            SOLRCLOUD_SERVER2= props.getProperty("SOLRCLOUD_SERVER2");
            SOLRCLOUD_SERVER3= props.getProperty("SOLRCLOUD_SERVER3");
            SOLRCLOUD_SERVER4= props.getProperty("SOLRCLOUD_SERVER4");
            SOLRCLOUD_SERVER5= props.getProperty("SOLRCLOUD_SERVER5");
            wordsFilePath= props.getProperty("wordsFilePath");
            querySeparator= props.getProperty("querySeparator");
            isQueryContent=Boolean.parseBoolean(props.getProperty("isQueryContent","false"));

            COLLECTION= props.getProperty("COLLECTION");
            conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", HBASE_ZOOKEEPER_QUORUM);
            conf.set("hbase.zookeeper.property.clientPort",HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT);
            conf.set("hbase.master", HBASE_MASTER);
            conf.set("hbase.rootdir", HBASE_ROOTDIR);
            conf.set("mapreduce.job.user.classpath.first","true");
            conf.set("mapreduce.task.classpath.user.precedence","true");


        } catch (IOException e) {
            logger.error("加载配置文件出错",e);
        } catch (NullPointerException e) {
            logger.error("加载文件出错",e);
        }catch (Exception e) {
            logger.error("加载配置文件出现位置异常",e);
        }
    }

    public static Logger getLogger() {
        return logger;
    }

    public static Properties getProps() {
        return props;
    }

    public static String getHBASE_ZOOKEEPER_QUORUM() {
        return HBASE_ZOOKEEPER_QUORUM;
    }

    public static String getHBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT() {
        return HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT;
    }

    public static String getHBASE_MASTER() {
        return HBASE_MASTER;
    }

    public static String getHBASE_ROOTDIR() {
        return HBASE_ROOTDIR;
    }

    public static String getDFS_NAME_DIR() {
        return DFS_NAME_DIR;
    }

    public static String getDFS_DATA_DIR() {
        return DFS_DATA_DIR;
    }

    public static String getFS_DEFAULT_NAME() {
        return FS_DEFAULT_NAME;
    }
    public static String getHBASE_TABLE_NAME() {
        return HBASE_TABLE_NAME;
    }

    public static String getHBASE_TABLE_FAMILY() {
        return HBASE_TABLE_FAMILY;
    }

    public static String getQUERY_FIELD() {
        return QUERY_FIELD;
    }

    public static String getSOLR_ZOOKEEPER() {
        return SOLR_ZOOKEEPER;
    }

    public static Configuration getConf() {
        return conf;
    }

    public static String getSOLRCLOUD_SERVER1() {
        return SOLRCLOUD_SERVER1;
    }

    public static void setSOLRCLOUD_SERVER1(String sOLRCLOUD_SERVER1) {
        SOLRCLOUD_SERVER1 = sOLRCLOUD_SERVER1;
    }

    public static String getSOLRCLOUD_SERVER2() {
        return SOLRCLOUD_SERVER2;
    }

    public static void setSOLRCLOUD_SERVER2(String sOLRCLOUD_SERVER2) {
        SOLRCLOUD_SERVER2 = sOLRCLOUD_SERVER2;
    }

    public static String getSOLRCLOUD_SERVER3() {
        return SOLRCLOUD_SERVER3;
    }

    public static void setSOLRCLOUD_SERVER3(String sOLRCLOUD_SERVER3) {
        SOLRCLOUD_SERVER3 = sOLRCLOUD_SERVER3;
    }

    public static String getSOLRCLOUD_SERVER4() {
        return SOLRCLOUD_SERVER4;
    }

    public static void setSOLRCLOUD_SERVER4(String sOLRCLOUD_SERVER4) {
        SOLRCLOUD_SERVER4 = sOLRCLOUD_SERVER4;
    }

    public static String getSOLRCLOUD_SERVER5() {
        return SOLRCLOUD_SERVER5;
    }

    public static void setSOLRCLOUD_SERVER5(String sOLRCLOUD_SERVER5) {
        SOLRCLOUD_SERVER5 = sOLRCLOUD_SERVER5;
    }

    public static String getCOLLECTION() {
        return COLLECTION;
    }

    public static void setCOLLECTION(String cOLLECTION) {
        COLLECTION = cOLLECTION;
    }

    public static String getWordsFilePath() {
        return wordsFilePath;
    }

    public static String getQuerySeparator() {
        return querySeparator;
    }

    public static void setQuerySeparator(String querySeparator) {
        ConfigProperties.querySeparator = querySeparator;
    }

    public static boolean getIsQueryContent() {
        return isQueryContent;
    }


}

config.properties配置文件:

HBASE_ZOOKEEPER_QUORUM=10.1.202.67,10.1.202.68,10.1.202.69
HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT=2181
HBASE_MASTER=10.1.202.67:16000,10.1.202.68:16000
HBASE_ROOTDIR=hdfs://ocdpCluster/apps/hbase/data
DFS_NAME_DIR=/hadoop/hdfs/namenode
DFS_DATA_DIR=/data1/hadoop/hdfs/data,/data2/hadoop/hdfs/data,/data3/hadoop/hdfs/data,/data4/hadoop/hdfs/data,/data5/hadoop/hdfs/data,/data6/hadoop/hdfs/data,/data7/hadoop/hdfs/data
FS_DEFAULT_NAME=hdfs://ocdpCluster
HBASE_TABLE_NAME=td_poc_dynamic_info
HBASE_TABLE_FAMILY=title,content
QUERY_FIELD=content_ik:公司
SOLR_ZOOKEEPER=10.1.202.67:9983,10.1.202.68:9983,10.1.202.69:9983,10.1.202.70:9983,10.1.202.71:9983
SOLRCLOUD_SERVER1=http://10.1.202.67:8983/solr/
SOLRCLOUD_SERVER2=http://10.1.202.68:8983/solr/
SOLRCLOUD_SERVER3=http://10.1.202.69:8983/solr/
SOLRCLOUD_SERVER4=http://10.1.202.70:8983/solr/
SOLRCLOUD_SERVER5=http://10.1.202.71:8983/solr/
COLLECTION=collection1

wordsFilePath=/usr/local/pocProject/queryProject2/querywords.txt

pom依赖包

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.1.2</version>
    </dependency>
    <dependency>
        <version>1.6.6</version>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>5.1.0</version>
    </dependency> 
    <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server -->
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>1.1.2</version>
    </dependency>


  </dependencies>

创建solrcloud连接:

public class SolrServerFactory {
    public static  Logger logger = LoggerFactory.getLogger(SolrServerFactory.class);
    private static CloudSolrClient cloudSolrServer;
    public static synchronized CloudSolrClient getCloudSolrClient(){
        if(cloudSolrServer==null){
            logger.info("cloudSolrServer怎么还是空");
            createCloudSolrClient();
        }
        return cloudSolrServer;
    }
    private static void createCloudSolrClient(){
        ModifiableSolrParams params = new ModifiableSolrParams();
        params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 100);//10
        params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 20);//5
        HttpClient httpClient = HttpClientUtil.createClient(params);
        LBHttpSolrClient lbHttpSolrClient = new LBHttpSolrClient(httpClient, ConfigProperties.getSOLRCLOUD_SERVER1(),
                ConfigProperties.getSOLRCLOUD_SERVER2(),ConfigProperties.getSOLRCLOUD_SERVER3(),
                ConfigProperties.getSOLRCLOUD_SERVER4(),ConfigProperties.getSOLRCLOUD_SERVER5());
        cloudSolrServer = new CloudSolrClient(ConfigProperties.getSOLR_ZOOKEEPER(),lbHttpSolrClient);
        cloudSolrServer.setDefaultCollection(ConfigProperties.getCOLLECTION());
//      cloudSolrServer.setZkClientTimeout(SearchConfig.getZookeeperClientTimeout());
//      cloudSolrServer.setZkConnectTimeout(SearchConfig.getZookeeperConnectTimeout());
    }
}

hbase连接

public class HbaseConnectionFactory {
    private static Connection connection = null; 
    public static synchronized Connection getHTable(){
        if(connection ==null){
            try {
                connection = ConnectionFactory.createConnection(ConfigProperties.getConf());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }
    public static Connection getConnection() {
        return connection;
    }

}
查询代码如下:

public class QueryData {
public static Logger logger = LoggerFactory.getLogger(ConfigProperties.class);
/**
* @param args
* @throws SolrServerException
* @throws IOException
*/
public static void main(String[] args) throws SolrServerException, IOException {

    CloudSolrClient cloudSolrServer=SolrServerFactory.getCloudSolrClient();
    SolrQuery query = new SolrQuery(new String(ConfigProperties.getQUERY_FIELD()));
    query.setStart(0); //数据起始行,分页用
    query.setRows(10); //返回记录数,分页用
    QueryResponse response = cloudSolrServer.query(query);
    SolrDocumentList docs = response.getResults();
    System.out.println("文档个数:" + docs.getNumFound()); //数据总条数也可轻易获取
    System.out.println("查询时间:" + response.getQTime());
    cloudSolrServer.close();

    HTable table = new HTable(ConfigProperties.getConf(), ConfigProperties.getHBASE_TABLE_NAME());
    Get get = null;
    List<Get> list = new ArrayList<Get>();
    for (SolrDocument doc : docs) {
        logger.info("查询出ID为:"+(String) doc.getFieldValue("id"));
        get = new Get(Bytes.toBytes((String) doc.getFieldValue("id")));
        list.add(get);
    }
    Result[] res = table.get(list);
    logger.info("查询出数据个数:"+res.length);
    byte[] titleBt = null;
    byte[] contentBt = null;
    String title = null;
    String content = null;
    for (Result rs : res) {
        if(rs.getRow()==null){
            return;
        }
        titleBt = rs.getValue("title".getBytes(), "".getBytes());
        contentBt = rs.getValue("create_date".getBytes(), "".getBytes());
        if (titleBt != null && titleBt.length>0) {title = new String(titleBt);} else {title = "无数据";} //对空值进行new String的话会抛出异常
        if (contentBt != null && contentBt.length>0) {content = new String(contentBt);} else {content = "无数据";}
        logger.info("id:"+new String(rs.getRow()));
        logger.info("title"+title + "|");
        logger.info("content"+content + "|");
    }
    table.close();
}

}


最好在运行时把hdfs-site.xml和hbase-site.xml放入配置文件中
这里写图片描述

YOLO项目部署:从Python脚本到Docker容器的企业级交付全流程 YOLO模型企业级Docker部署方案 核心挑战 环境一致性:解决"本地能跑,服务器崩掉"问题 可扩展性:支持单实例到多实例扩展 稳定性:确保99.9%可用性 部署流程 项目改造:模块化代码,分离配置 Docker镜像:支持CPU/GPU环境 API服务:封装推理逻辑 监控告警:实现自动化运维 技术方案 需求 解决方案 环境一致性 Docker镜像+依赖冻结 可扩展性 K8s+负载均衡 稳定性 健康检查+自动重启 项目结构 模块化代码组织 外部化配置管理 精确依赖版本控制 摘要重点:通过 阅读详情

相关推荐

solr+hbase

solr+hbase

自学大数据:基于Solr实现HBase的文本索引

使用目的: HBase目前只支持对rowkey的一级索引,对于二级索引还不支持,当然可以把所有要索引的字段都拼接到rowkey中,根据hbase的filter功能进行查询,但是这样操作数据会涉及到全表扫描,效率很低,速度慢,不利于后期扩展。并且,通过HBase自己的索引实现数据量统计,分页,中文索引几乎不可能。所以,基于solrHBase创建索引,就显得更有价值。

3828

Hbase同步数据到Solr的方案

hbase indexer是负责将hbase的数据自动同步到solr中建立索引,不需要写代码将hbase的数据同步到solr中创建索引。尽少开发工作,减少在在并发环境下手工创建索引可能带来性能问题。

(一) hbase+solr概念环境搭建

(一) hbase+solr概念环境搭建 概念: Hadoop实现了一个分布式文件系统(HadoopDistributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽

沉底的石头 1万+

hbase基于solr配置二级索引

一.概述 Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页、查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase Secondary Indexing),供复杂查询使用。 Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配

zhenzhendeblog的博客 8766

利用Solr建立HBase的二级索引

利用Solr建立HBase的二级索引: 1、编写的协处理器代码为 package com; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.hadoop.conf.Configuration; im

fengshi_fengshi的专栏 1330

HBase协处理器同步二级索引Solr

一、 背景二、 什么是HBase的协处理器三、 HBase协处理器同步数据到Solr四、 添加协处理器五、 测试六、 协处理器动态加载 一、 背景 在实际生产中,HBase往往不能满足多维度分析,我们能想到的办法就是通过创建HBase数据的二级索引来快速获取rowkey,从而得到想要的数据。目前比较流行的二级索引解决方案有Lily HBase Indexer,Phoenix自带...

weixin_33994444的博客 237

Hbase构建二级索引的一些解决方案

hbase构建二级索引1 为什么需要二级索引HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索。假设我们相对Hbase里面列族的列列进行一些组合查询,就只能全表扫描了...

大数据技术派 3596

hbase组合rowkey_大数据培训_基于solrHbase秒级查询方案

简单介绍  简单的说,以下是课堂小结  Hbase提供大数据的存储  Solr 提供全文搜索功能,提高高效的索引查询  Hbase+solr(提供高效的全文搜索的大数据存储解决方案)项目背景  某移动项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力。针对HBase的多条件查询也...

weixin_29306571的博客 186

搜索引擎项目文档-----环境搭建

环境:Ubuntu12.04+Nutch1.7+Solr4.7+Tomcat6.0+Hbase(版本暂定)

aixiaoxue520的专栏 729

使用solr构建hbase二级索引

使用solr构建hbase二级索引@(HBASE)[hbase, solr]使用solr构建hbase二级索引 一概述 一业务场景描述 二技术方案 1技术方案一 2技术方案二 3关于索引的建议 二使用hbase-indexer构建hbase二级索引 一 安装环境准备 二 配置solr 三 配置hbase-solr 四测试 1hbase中创建测试表 2添加配置文件用于将solr中的field映射为hb

jediael_lu的专栏 7905

hbase基于solr的实时索引

实时查询方案 Hbase  ----->  Key Value Store  ---> Solr ------->Web前端实时查询展示 1.Hbase 提供海量数据存储 2.Solr提供索引构建与查询 3. Key Value Store 提供自动化索引构建(从HbaseSolr) 使用流程 前提: CDH5.3.2Solr集群搭建好,CDH5.3.2 Key-Value St

花羽的博客 2420

Hadoop+Hbase+Solr(集成中文分词)分布式部署流程

由于早期项目的客户服务器重新规划,原来部署应用的员工已离职且部署文档不完整,所以用三个虚机节点搭了简单的Hadoop+Hbase+Solr的环境并形成部署步骤文档给运维人员参考,有兴趣的可以下载一下,以上。

Solr-Hbase 二级索引实现

为什么HBase要建立二级索引HBase中检索数据通常有以下三种方式: 通过get, 指定RowKey获取唯一一条记录 通过scan, 设置startstop进行范围匹配 全表扫描 所以我们发现, 想要精确且快速的定位在HBase表中某一条记录, 唯一的办法也就是通过RowKey进行查询。 然而在多数情况, 需要从多个条件查询数据, 再依靠单一的Rowkey查询已经不满足需求。 方案 Hbase —–> Key Value Store —> Solr ——-> Web前端实时查询

JordanZ的博客 1677

Solr+hbase方案

一、Solr+hbase方案 Solr是一个独立的企业级搜索应用server,它对并提供相似干Web-service的API接口。用户能够通过http请求,向搜索引擎server提交一定格式的XML文件,生成索引。也能够通过Http Get操作提出查找请求,并得到XML格式的返回结果。 Solr是一个高性能。采用Java5开发。基干Lucene的全文搜索server。同一时候对其进行了扩展。提...

. 3383

HBase二级索引方案

01 HBase简介 HBase是一个构建在HDFS之上,用于海量数据存储分布式列存储系统。 参见下图,由于在HBase中: 表的每行都是按照RowKey的字典序排序存储表的数据是按照RowKey区间进行分割存储成多个region 所以HBase主要适用下面这两种常见场景: 适用于基于rowkey的单行数据快速随机读写适合基于rowkey前缀的范围扫描 02 为什么需要HB...

沧海一粟的博客 1万+

基于solr实现hbase的二级索引

原文地址如下:点击打开链接

zpc15200790194的专栏 838

solrcloud 高可用集群搭建加solr整合hbase以及向ganglia报告度量

一、环境准备     CentOS-6.4-x86_64-minimal.iso     jdk-6u45-linux-i586-rpm.bin     zookeeper-3.4.5.tar     solr-4.6.0.zip     服务器6台: 192.168.56.11- SolrCloud.Shard1.Leader              192.168.56.12-S...

qq_36864672的博客 1091

HBase + Solr Cloud实现HBase二级索引

1. 执行流程   2. Solr Cloud实现 http://blog.csdn.net/u011462328/article/details/53008344 3. HBase实现 1) 自定义Observer ① 代码 [java] view plain copy   package cn.b

longxiweiyi的博客 659

CDH使用Solr实现HBase二级索引

一、为什么要使用Solr做二级索引二、实时查询方案三、部署流程3.1 安装HBaseSolr3.2 增加HBase复制功能3.3创建相应的 SolrCloud 集合3.4 创建 Lily HBase Indexer 配置3.5创建 Morphline 配置文件3.6 注册 Lily HBase Indexer Configuration Lily HBase Indexer Servi...

weixin_34380296的博客 237

高考英语3500词汇(绝对有用)MP3文件+WORD文档资料.zip

高考英语3500词汇(绝对有用)MP3文件+WORD文档资料高考英语词汇解析A1.●abandon v. 放弃,遗弃,抛弃 abandon the baby/ child/ friendabandon the plan/ idea/ effort/ hope abandon oneself to 陷入,沉湎于 He abandoned himself to despair. 2. ◎ability n. 能力; 才能 the ability to walk 行走的能力to the best of one’s ability 竭尽全力 He completed the job to the best of his ability.3.●abnormal adj.不正常的,畸形的,反常的 They thought his behavior was abnormal.反义词:normal4. ◎aboard prep. adv.在船(飞机,火车)上,上船(飞机,轮船)all the people aboard 机上的人5. about prep关于,ad 大约,到处a) be about to do sth…(when) I was about to go out when it began to rain.b) look about/around/round c) How/What about…询问情况或建议6 . above prep 在…上面 above all 首先;尤其7. abroad ad.到(在)国外 a) go /study /live abroad b) at home and abroad在国内外8. ●absence n. 不在,缺席absence from work/ school The decision was made in my absence.in the absence of 在缺少…条件下 The case was dismissed in the absence of proof.9. ◎absent adj. 缺席的,不在的 be absent from absent-minded adj. 心不在焉的10. ◎absorb vt. 1) 吸收,吸进(液体,气体等) 2) 理解,掌握absorb ink/ water/ neat/ light/ oxygen/ sound/ energyabsorb information/ knowledge be absorbed in 专注于,聚精会神于…11.●abuse v / n. 滥用,谩骂 abuse alcohol/ drugs 酗酒 /嗜毒 abuse power/ position/ privilege 滥用权力/职权/特权12. accept vt.accept the gift /invitation /plan accept sb/sth as… 13.●access n.方法,通路,机会The only access to the farm was a narrow bridge.Only high officials have access to the emperor.We students have access to the school library.accessible adj. 可进入的,可接近的,可使用的Such information is not easily accessible to the public.14. accident n.事故,意外的事by accident/chance 偶然,无意中;不小心15. ●accompany v. 陪伴,伴随,伴奏 accompany sb. to the school/ supermarket accompany the singer on / at the piano Lightening usually accompanies thunder.16. ●accomplish v. 完成,到达,实现 accomplishment n. 成就,成绩accomplish the task/ purpose/ goal17. according to 根据 According to the law, he should b

上一篇: maven常用命令集
shoubuliaolebu
博客等级 码龄19年 4粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值