专栏首页Hadoop实操如何使用Java代码访问CDH的Solr服务

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

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

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依赖

<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集群可跳过此步)

[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集群可跳过此步)

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.示例代码

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();
        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.示例代码运行

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

mvn clean package

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

2.编写run.sh脚本

#!/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

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

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

本文分享自微信公众号 - Hadoop实操(gh_c4c535955d0f),作者:Fayson

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在CDH中使用Solr对HDFS中的JSON数据建立全文索引

    Fayson
  • CDH集群升级Python3异常问题分析

    在CDH集群中所有节点/opt/cloudera/anaconda3部署了Python3的安装包,如下描述:

    Fayson
  • 0605-5.16.1-CM告警SNMP中DateAndTime类型解析

    Fayson在前面的文章《如何通过Cloudera Manager配置使用SNMP方式转发告警》和《CM告警SNMP对接补充》介绍了使用SNMP的方式对接,对接...

    Fayson
  • prometheus之监控mysql

    mysqld_exporter启动的时候需要读取mysql授权用户的一个配置文件,所以我们要先创建一下这个配置文件。

    行 者
  • 【干货】小白学数据分析—留存率是什么?

    在网站分析、电商分析、网游分析中,对于留存率的关注度极高,这一浪潮随着APP应用、社交游戏的火爆逐渐成为一个很重要的衡量准则,也甚至有了40-20-10准则。对...

    CDA数据分析师
  • rMATS这款差异可变剪切分析软件的使用体验

    rMATS最近刚现在出了rMATS 4.0.1版,相比之间的rMATS 3.2.5版,其用C,Python,Cython重写了该软件,运算速度提升了100倍,并...

    生信技能树
  • 浅谈就业季:程序猿的华丽转身

    莘莘学子刚度过人生“第一道门槛”,而将要毕业的大学生,自己就业问题也是茫然失措。西安作为多朝的帝都,浓厚的文化氛围培育出众多优秀人才,即将踏入社会的学子们对于西...

    用户2988602
  • Java 中的线程池是什么 (面试必背)?

    这个文章不会涉及太深的线程知识(太深我也不懂)。这里只是把线程池的一些概念整理一下,当被问到这个题目的时候,尽可能背给面试官听就行了。

    水货程序员
  • 手机淘宝成为超级App后,会通吃一切吗?

    手机淘宝近日推出内容开放计划,宣称未来要给内容方(CP)提供超过20亿元的佣金分成。与这一计划一起宣布的还有一个数据:手机淘宝DAU(日活跃用户)超过1.1亿。...

    罗超频道
  • maven配置文件不一致导致构建失败

    问题 在使用maven构建项目时出现一个神奇的问题。通过Intellij IDEA的Maven Projects中进行构建,没问题,能够成功打包项目。 可是...

    用户1161110

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动