Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何使用Java代码访问CDH的Solr服务

如何使用Java代码访问CDH的Solr服务

作者头像
Fayson
修改于 2018-04-01 11:47:47
修改于 2018-04-01 11:47:47
3.6K1
举报
文章被收录于专栏:Hadoop实操Hadoop实操

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

1.文档编写目的


CDH集群使用的Solr版本为4.10.3,Java开发中会经常使用到solrj客户端包访问Solr集群。本篇文章主要讲述如何使用Java代码访问Kerberos和非Kerberos环境下的Solr集群。

  • 内容概述

1.环境准备

2.非Kerberos及Kerberos环境连接示例

  • 测试环境

1.Kerberos集群CDH5.11.2,OS为Redhat7.2

2.非Kerberos集群CDH5.13,OS为CentOS6.5

  • 前置条件

1.集群已安装Sorl服务

2.Kerberos和非Kerberos集群Solr服务正常

3.已创建好一个测试用的collection1

2.环境准备


1.Maven依赖

代码语言:txt
AI代码解释
复制
<repositories>
    <repository>
        <id>cloudera</id>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>4.10.3-cdh5.11.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0-cdh5.11.2</version>
    </dependency>
</dependencies>

注意:这里使用的是CDH的依赖库,如果使用开源的4.10.3的依赖库会导致访问Kerberos环境下的Solr认证失败。

2.创建访问Solr集群的Keytab文件(非Kerberos集群可跳过此步)

代码语言:txt
AI代码解释
复制
[ec2-user@ip-172-31-22-86 keytab]$ sudo kadmin.local
Authenticating as principal mapred/admin@CLOUDERA.COM with password.
kadmin.local:  listprincs fayson*
fayson@CLOUDERA.COM
kadmin.local:  xst -norandkey -k fayson.keytab fayson@CLOUDERA.COM
...
kadmin.local:  exit
[ec2-user@ip-172-31-22-86 keytab]$ ll
total 4
-rw------- 1 root root 514 Nov 28 10:54 fayson.keytab
[ec2-user@ip-172-31-22-86 keytab]$ 

3.创建jaas-client.conf文件,内容如下(非Kerberos集群可跳过此步)

代码语言:txt
AI代码解释
复制
Client {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/Volumes/Transcend/keytab/fayson.keytab"
  storeKey=true
  useTicketCache=true
  debug=true
  principal="fayson@CLOUDERA.COM";
};

将标红部分修改为自己的Keytab文件路径及Kerberos账号

3.非Kerberos环境


1.示例代码

代码语言:txt
AI代码解释
复制
package com.cloudera.solr;

import com.cloudera.bean.Message;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;

/**
 * package: com.cloudera.solr
 * describe: 使用Solrj4.10.3-cdh5.11.2版本访问非Kerberos环境下的Solr集群
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2017/11/26
 * creat_time: 上午12:08
 * 公众号:Hadoop实操
 */
public class NoneKBSolrTest {
    static final String zkHost = "13.229.70.204:2181/solr";
    static final String defaultCollection = "collection1";
    static final int socketTimeout = 20000;
    static final int zkConnectTimeout = 1000;

    public static void main(String[] args) {
        CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
        cloudSolrServer.setDefaultCollection(defaultCollection);
        cloudSolrServer.setZkClientTimeout(zkConnectTimeout);
        cloudSolrServer.setZkConnectTimeout(socketTimeout);
        cloudSolrServer.connect();
代码语言:txt
AI代码解释
复制
        search(cloudSolrServer, "id:12345678911");
        addIndex(cloudSolrServer);
        deleteIndex(cloudSolrServer, "12345678955");
    }

    /**
     * 查找
     *
     * @param solrClient
     * @param String
     */
    public static void search(CloudSolrServer solrClient, String String) {
        SolrQuery query = new SolrQuery();
        query.setQuery(String);
        try {
            QueryResponse response = solrClient.query(query);
            SolrDocumentList docs = response.getResults();

            System.out.println("文档个数:" + docs.getNumFound());
            System.out.println("查询时间:" + response.getQTime());

            for (SolrDocument doc : docs) {
                String id = (String) doc.getFieldValue("id");
                String created_at = (String) doc.getFieldValue("created_at");
                String text = (String) doc.getFieldValue("text");
                String text_cn = (String) doc.getFieldValue("text_cn");
                System.out.println("id: " + id);
                System.out.println("created_at: " + created_at);
                System.out.println("text: " + text);
                System.out.println("text_cn: " + text_cn);
                System.out.println();
            }
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!");
            e.printStackTrace();
        }
    }

    /**
     * 添加索引
     *
     * @param solrClient
     */
    public static void addIndex(CloudSolrServer solrClient) {
        try {
            SolrInputDocument solrInputDocument = new SolrInputDocument();
            solrInputDocument.setField("id", "1234567890");
            solrInputDocument.setField("created_at", "2017-11-25 02:35:07");
            solrInputDocument.setField("text", "hello world");
            solrInputDocument.setField("text_cn", "张三是个农民,勤劳致富,奔小康");
            solrClient.add(solrInputDocument);
            solrClient.commit();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!!");
            e.printStackTrace();
        }
    }

    /**
     * 使用JavaBean对象向Solr集群创建索引
     *
     * @param solrServer
     */
    public static void addBean(CloudSolrServer solrServer) {

        Message message = new Message("12345678911", "2017-11-25 02:35:07", "hello world", "张三是个农民,勤劳致富,奔小康");
        try {
            solrServer.addBean(message);
            solrServer.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SolrServerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除指定Collection中的Index
     *
     * @param solrServer
     * @param id
     */
    public static void deleteIndex(CloudSolrServer solrServer, String id) {
        try {
            solrServer.deleteById(id);
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.Kerberos环境


1.示例代码运行

代码语言:txt
AI代码解释
复制
package com.cloudera.solr;

import com.cloudera.bean.Message;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

import java.io.IOException;

/**
 * package: com.cloudera.solr
 * describe: Kerberos环境下的Solr访问
 * creat_user: Fayson
 * email: htechinfo@163.com
 * creat_date: 2017/11/26
 * creat_time: 上午2:10
 * 公众号:Hadoop实操
 */
public class KBSolrTest {

    static final String zkHost = "ip-172-31-22-86.ap-southeast-1.compute.internal:2181/solr";
    static final String defaultCollection = "collection1";
    static final int socketTimeout = 20000;
    static final int zkConnectTimeout = 10000;

    public static void main(String[] args) {
        System.setProperty("java.security.krb5.conf", "/Volumes/Transcend/keytab/krb5.conf");
        System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
        System.setProperty("sun.security.krb5.debug", "true");
        System.setProperty("java.security.auth.login.config", "/Volumes/Transcend/keytab/jaas-client.conf");

        HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer());
        CloudSolrServer cloudSolrServer = new CloudSolrServer(zkHost);
        cloudSolrServer.setDefaultCollection(defaultCollection);
        cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
        cloudSolrServer.setZkClientTimeout(socketTimeout);
        cloudSolrServer.connect();

        addIndex(cloudSolrServer);

        addBeanIndex(cloudSolrServer);

        search(cloudSolrServer, "id:12345678955");
        search(cloudSolrServer, "id:12345678966");

        deleteIndex(cloudSolrServer, "12345678955");
        search(cloudSolrServer, "id:12345678955");

    }

    /**
     * 查找
     *
     * @param solrClient
     * @param String
     */
    public static void search(CloudSolrServer solrClient, String String) {
        SolrQuery query = new SolrQuery();
        query.setQuery(String);
        try {
            QueryResponse response = solrClient.query(query);
            SolrDocumentList docs = response.getResults();

            System.out.println("文档个数:" + docs.getNumFound());
            System.out.println("查询时间:" + response.getQTime());

            for (SolrDocument doc : docs) {
                String id = (String) doc.getFieldValue("id");
                String created_at = (String) doc.getFieldValue("created_at");
                String text = (String) doc.getFieldValue("text");
                String text_cn = (String) doc.getFieldValue("text_cn");
                System.out.println("id: " + id);
                System.out.println("created_at: " + created_at);
                System.out.println("text: " + text);
                System.out.println("text_cn: " + text_cn);
                System.out.println();
            }
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!");
            e.printStackTrace();
        }
    }

    /**
     * 添加索引
     *
     * @param solrClient
     */
    public static void addIndex(CloudSolrServer solrClient) {
        try {
            SolrInputDocument solrInputDocument = new SolrInputDocument();
            solrInputDocument.setField("id", "12345678955");
            solrInputDocument.setField("created_at", "2017-11-25 02:35:07");
            solrInputDocument.setField("text", "hello world");
            solrInputDocument.setField("text_cn", "张三是个农民,勤劳致富,奔小康");
            solrClient.add(solrInputDocument);
            solrClient.commit();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!!");
            e.printStackTrace();
        }
    }

    /**
     * @param solrClient
     */
    public static void addBeanIndex(CloudSolrServer solrClient) {
        try {
            Message message = new Message("12345678966", "2017-11-25 02:35:07", "hello world", "李四也是个农民,勤劳致富,奔小康");
            solrClient.addBean(message);

            solrClient.commit();
        } catch (Exception e) {
            System.out.println("Unknowned Exception!!!!!");
            e.printStackTrace();
        }
    }

    /**
     * 删除索引
     *
     * @param solrClient
     * @param id
     */
    public static void deleteIndex(CloudSolrServer solrClient, String id) {
        try {
            solrClient.deleteById(id);
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.工程打包运行


这里以Kerberos环境的为例,可以将solrdemo工程中的run目录拷贝至服务器做相应修改即可运行,目录结构如下

1.使用maven命令将工程打包,这里的命令打包的是一个不可运行的jar

代码语言:txt
AI代码解释
复制
mvn clean package

将编译好的jar包放置lib目录下。

2.编写run.sh脚本

代码语言:txt
AI代码解释
复制
#!/bin/bash

for file in `ls lib/*jar` 
do
    CLASSPATH=$CLASSPATH:$file
done

export CLASSPATH

for file in `ls /opt/cloudera/parcels/CDH/jars/*.jar`
do
   CLASSPATH=$CLASSPATH:$file
done

export CLASSPATH

/usr/java/jdk1.8.0_131-cloudera/bin/java com.cloudera.solr.KBSolrTest

注意:将上面标红部分修改为自己集群的依赖包目录及需要执行的类。

3.运行run.sh测试

注意:Fayson做测试把jaas-client.conf和krb5.conf配置写死在代码里面,大家可以做相应的调整作为参数传递至代码中。

6.总结


这里Fayson在调试代码时也遇到很多坑,比如CDH集群的Solr版本为4.10.3,但我选择的Solrj版本为7.10.1,在调试是能够正常查询Solr集群的数据,但不能向Solr集群添加Index。后又选择使用Sorl官网提供solrj4.10.3版本,在调试Kerberos环境时,由于无Krb5HttpClientConfigurer类,导致调试Kerberos环境时遇到各种坑,最终选择了solrj4.10.3-cdh5.11.2版本里面含有Krb5HttpClientConfigurer类,最终解决Kerberos环境下的Solr访问。

GitHub源码地址:

https://github.com/javaxsky/cdhproject

为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
我们的solr马上要从5升到7,还要用Kerberos验证,看着cdh-solrj7的API 一脸懵逼....
我们的solr马上要从5升到7,还要用Kerberos验证,看着cdh-solrj7的API 一脸懵逼....
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群
做Hadoop应用开发的过程中,用户会有这样的需求,在同一个Java应用中同时访问安全和非安装的CDH集群。同一个Java应用即同一个进程同一个JVM,由于一些全局的变量可能会导致无法同时访问安全和非安全的集群。本篇文章Fayson介绍下如何使用Java代码同时访问安全和非安全的CDH集群。
Fayson
2019/11/28
1.7K0
使用SolrJ(即java客户端)开发Solr。
1、什么是SolrJ呢?   答:Solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。开始配置schema.xml,/home/hadoop/soft/solr-4.10.3/example/solr/collection1/conf。添加IK中文分析器,然后定义定义自己的业务域。
别先生
2019/09/29
1.4K0
使用SolrJ(即java客户端)开发Solr。
使用SolrJ客户端管理SolrCloud(Solr集群)
注意:集群中使用的配置文件是zookeeper统一管理的配置文件。如果修改了schema.xml配置文件,使用zkCli.sh脚本命令重新上传conf目录即可,将配置文件进行覆盖。
别先生
2019/09/29
1.3K0
使用SolrJ客户端管理SolrCloud(Solr集群)
SolrCloud搭建和使用
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
周杰伦本人
2023/10/12
4580
SolrCloud搭建和使用
04_solr7.3之solrJ7.3的使用
SolrJ is an API that makes it easy for Java applications to talk to Solr. SolrJ hides a lot of the details of connecting to Solr and allows your application to interact with Solr with simple high-level methods.
全栈程序员站长
2022/07/05
5270
04_solr7.3之solrJ7.3的使用
SolrJ的使用
package com.shi.solrj; import java.util.List; import java.util.Map; import org.apache.solr.client.
用户5927264
2019/08/01
4590
SolrJ的使用
day73_淘淘商城项目_06_solr索引库搭建 + solr搜索功能实现 + 图片显示等问题解决_匠心笔记
  solr是java开发的。   solr的安装文件。   推荐在Linux环境下使用Solr,需要安装环境Linux。   需要安装jdk。参考链接:https://www.cnblogs.com/chenmingjun/p/9931593.html   需要安装tomcat。
黑泽君
2018/12/14
1.9K0
day73_淘淘商城项目_06_solr索引库搭建 + solr搜索功能实现 + 图片显示等问题解决_匠心笔记
Solr 8.2 使用指南
Solr是一个基于全文检索的企业级应用服务器。可以输入一段文字,通过分词检索数据。它是单独的服务,部署在 tomcat。
Carlos Ouyang
2019/08/19
3K1
Solr 8.2 使用指南
solrCloud相关的管理命令及solrj使用
solrCloud 如何创建新集群(创建一个索引库) http://替换为IP/地址:8080/solr/admin/collections?action=CREATE&name=collection
待你如初见
2018/09/29
1.3K0
如何使用java代码通过JDBC连接Hive(附github源码)
前面我们讲过《如何使用java代码通过JDBC连接Impala(附Github源码)》,本篇文章主要讲述如何使用Java代码通过JDBC的方式连接Hive。
Fayson
2018/03/29
7.3K0
如何使用java代码通过JDBC连接Hive(附github源码)
Apache solr(一).
概念:Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述。       
JMCui
2018/03/16
1.7K0
Apache solr(一).
Solr_全文检索引擎系统
Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。 Solr的作用: solr是一个现成的全文检索引擎系统, 放入tomcat下可以独立运行, 对外通过http协议提供全文检索服务(就是对索引和文档的增删改查服务), 在代码中可以通过solrJ(solr的客户端的jar包)来调用solr服务。 Lucene和solr的区别: lucene是一个全文检索引擎工具包, 就是
赵小忠
2018/01/24
1.1K0
Solr单机版的安装与使用
1 1、使用Solr实现。 2 基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为Solr提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中常用此方案。 3 4 2、什么是Solr。 5 Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、 6 搜索性能进行了优化。 7 Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档, 8 Solr根据xml文档添加、删除、更新索引 。Solr搜索只需要发送 HTTP GET 请求,然后对 Solr返回Xml、json等格式的查询结果进行解析,组织页面布局。 9 Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。 10 11 3、Solr与Lucene的区别。 12 Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的 13 工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。 14 Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜 15 索功能。
别先生
2019/09/29
1.3K0
Solr单机版的安装与使用
如何使用Oozie API接口向Kerberos环境的CDH集群提交Shell作业
前面Fayson介绍了使用Oozie API向Kerberos和非Kerberos集群提交Spark和Java作业,本篇文章主要介绍如何使用Oozie Client API向Kerberos环境的CDH集群提交Shell Action工作流。
Fayson
2018/03/30
1.7K0
如何使用Java代码访问Kerberos环境下的Kudu
前面Fayson介绍了《如何使用Java API访问CDH的Kudu》,文章是在非安全环境下实现,随着对集群安全要求的提高,在Kerberos环境下的使用API访问Kudu也会有一些变化,本篇文章Fayson主要介绍如何使用Java代码访问Kerberos环境下的Kudu。
Fayson
2018/11/16
3K0
Solr示例
Lucene是apache软件基金会提供的一款开源全文检索引擎。Solr是在lucene基础上封装得更易于使用的全文检索服务器并提供了相关api。
星哥玩云
2022/07/01
9020
solr 一些前缀例如:q、fq、df 的用法
 具体的用法在代码中有注释,这边就不在累述了。 public class SolrjTest {          //添加,修改     @Test     public void test1() throws IOException, SolrServerException {           //和solr服务器创建连接,参数为solr服务器地址         SolrServer solrServer = new HttpSolrServer("http://192.168.25.128:80
凯哥Java
2022/12/16
8090
Solr集成Tomcat
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
全栈程序员站长
2022/06/29
1.2K0
Solr集成Tomcat
如何使用Java连接Kerberos的HBase
出于CDH集群安全考虑,在CDH集群中增加了Kerberos认证机制。因为HBase的存储系统是基于Hadoop的存储,所以通过HBase客户端访问HBase数据库时需要进行身份认证。在Linux下使用HBase客户端访问HBase数据时需要先kinit初始化Kerberos账号,认证完成后我们就可以直接使用HBase shell操作HBase了。通过Linux的Kinit命令可以方便的完成Kerberos的认证,那么在Java开发中如何完成Kerberos的登录认证呢?本篇文章主要讲述如何使用Java连接Kerberos环境的HBase。
Fayson
2018/03/29
5.9K0
如何使用Java连接Kerberos的HBase
solr搭建和搜索功能实现
前言: solr与Lucene的区别 :Lucene是api 需要写代码开发 ,solr是服务器,是一套基于lucence开发的全文检索框架,用就完事了。
周杰伦本人
2023/10/12
3030
solr搭建和搜索功能实现
相关推荐
0553-6.1.0-如何使用Java代码同时访问安全和非安全CDH集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档