更新时间:2023-06-20 GMT+08:00

通过ES-Hadoop实现Hive读写Elasticsearch数据

Elasticsearch-Hadoop (ES-Hadoop) 连接器将 Hadoop 海量的数据存储和深度加工能力与 Elasticsearch 实时搜索和分析功能结合在一起。它能够让您快速深入了解大数据,并让您在 Hadoop 生态系统中更好地开展工作。

本文通过MRS的ES-Hadoop与CSS集群连接作为示例,你可以配置其他任何需要使用ES集群的应用。如有需要,也可以参考本文在其他服务中使用Elasticsearch,前提是要保证客户端与Elasticsearch集群网络连通。

准备工作

  • CSS集群处于可用状态。
  • 确保客户端与CSS集群的网络是互通的。
  • 确保CSS集群和MRS集群在同一个区域、可用区、虚拟私有云和子网。
    图1 CSS集群的区域等信息

操作步骤

  1. 获取集群的内网访问地址。访问集群时,需要输入内网访问地址。
    1. 在云搜索服务管理控制台,单击左侧导航栏的“集群管理”
    2. 在集群管理列表页面,选择需要访问的集群,获取并记录“内网访问地址”,一般是“<host>:<port>”或“<host>:<port>,<host>:<port>”样式。

      如果集群只有一个节点,此处仅显示1个节点的IP地址和端口号,例如“10.62.179.32:9200”;如果集群有多个节点,此处显示所有节点的IP地址和端口号,例如“10.62.179.32:9200,10.62.179.33:9200”

  2. 登录MRS集群节点,操作步骤请参见。
  3. 在MRS集群节点上通过curl命令检查网络连通性,需要确保MRS集群的每个节点都能连通CSS集群。
    • 非安全模式的集群
      curl -X GET http://<host>:<port>
    • 安全模式+HTTP协议的集群
      curl -X GET http://<host>:<port> -u <user>:<password>
    • 安全模式+HTTPS协议的集群
      curl -X GET https://<host>:<port> -u <user>:<password> -ik
    表1 变量说明

    变量名

    说明

    <host>

    集群中各节点的IP地址,当集群包含多个节点时,会存在多个IP地址,可以任选其中一个发送。

    <port>

    集群节点的访问端口号,一般为9200。

    <user>

    访问集群的用户名。

    <password>

    用户名对应的密码。

  4. 下载ES-Hadoop的lib包,并解压zip包获取“elasticsearch-hadoop-x.x.x.jar”文件。版本需要与CSS集群版本一致,例如CSS集群是7.6.2版本,则建议下载elasticsearch-hadoop-7.6.2.zip。
  5. 下载httpclient依赖包commons-httpclient:commons-httpclient-3.1.jar,其中3.1为版本号,建议用户根据实际需要选择。
  6. 安装MRS客户端,如果已经安装可以跳过该步骤,未安装的请参见。
  7. 登录MRS客户端,将下载的ES-Hadoop和httpclient的jar依赖包上传到MRS客户端。
  8. 在MRS客户端创建HDFS目录,将ES-Hadoop lib包和httpclient依赖包上传到该目录下。
    hadoop fs -mkdir /tmp/hadoop-es
    hadoop fs -put elasticsearch-hadoop-x.x.x.jar /tmp/hadoop-es
    hadoop fs -put commons-httpclient-3.1.jar /tmp/hadoop-es
  9. 从MRS客户端登录到Hive客户端,具体操作请参见。
  10. 在Hive客户端,添加ES-Hadoop lib包和httpclient依赖包。该命令只对当前会话有效。

    输入beelinehive进入到执行界面,执行如下命令:

    add jar hdfs:///tmp/hadoop-es/commons-httpclient-3.1.jar;
    add jar hdfs:///tmp/hadoop-es/elasticsearch-hadoop-x.x.x.jar;
  11. 在Hive客户端,创建Hive外表。
    • 非安全模式的集群
      CREATE EXTERNAL table IF NOT EXISTS student( 
         id BIGINT,
         name STRING,
         addr STRING 
      )  
      STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' 
      TBLPROPERTIES(  
          'es.nodes' = 'xxx.xxx.xxx.xxx:9200',
          'es.port' = '9200',
          'es.net.ssl' = 'false', 
          'es.nodes.wan.only' = 'false', 
          'es.nodes.discovery'='false',
          'es.input.use.sliced.partitions'='false',
          'es.resource' = 'student/_doc'
      );
    • 安全模式+HTTP协议的集群
      CREATE EXTERNAL table IF NOT EXISTS student( 
         id BIGINT,
         name STRING,
         addr STRING 
      )  
      STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' 
      TBLPROPERTIES(  
          'es.nodes' = 'xxx.xxx.xxx.xxx:9200',
          'es.port' = '9200',
          'es.net.ssl' = 'false', 
          'es.nodes.wan.only' = 'false', 
          'es.nodes.discovery'='false',
          'es.input.use.sliced.partitions'='false',
          'es.nodes.client.only'='true',
          'es.resource' = 'student/_doc',
          'es.net.http.auth.user' = 'username', 
          'es.net.http.auth.pass' = 'password'
      );
    • 安全模式+HTTPS协议的集群
      1. 获取安全证书“CloudSearchService.cer”
        1. 登录云搜索服务控制台。
        2. 选择“集群管理”进入集群列表。
        3. 单击对应集群的名称,进入集群基本信息页面。
        4. “基本信息”页面,单击“HTTPS访问”后面的“下载证书”
      2. 转换安全证书(CloudSearchService.cer)。将下载的安全证书上传到客户端机器上,使用keytool工具将“.cer”证书转换成Java可以读取的“.jks”证书格式。
        • 在Linux系统中,执行如下命令转换证书。
          keytool -import -alias newname -keystore ./truststore.jks -file ./CloudSearchService.cer 
        • 在Windows系统中,执行如下命令转换证书。
          keytool -import -alias newname -keystore .\truststore.jks -file .\CloudSearchService.cer

        其中,newname是由用户自定义的证书名称。

        该命令执行后,会提示设置证书密码,并确认密码。请保存该密码,后续接入集群会使用。

      3. “.jks”文件分发到MRS集群的每个节点的相同路径,如“/tmp”,可以使用scp命令进行文件传输。同时,要确保omm用户有权限读取该文件,设置权限可以参考如下命令:
        chown -R omm truststore.jks
      4. 创建Hive外表。
        CREATE EXTERNAL table IF NOT EXISTS student( 
           id BIGINT,
           name STRING,
           addr STRING 
        )  
        STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' 
        TBLPROPERTIES(  
            'es.nodes' = 'https://xxx.xxx.xxx.xxx:9200',
            'es.port' = '9200',
            'es.net.ssl' = 'true', 
            'es.net.ssl.truststore.location' = 'cerFilePath',
            'es.net.ssl.truststore.pass' = 'cerPassword',
            'es.nodes.wan.only' = 'false', 
            'es.nodes.discovery'='false',
            'es.nodes.client.only'='true',
            'es.input.use.sliced.partitions'='false',
            'es.resource' = 'student/_doc',
            'es.net.http.auth.user' = 'username', 
            'es.net.http.auth.pass' = 'password'
        );
    表2 ES-Hadoop参数说明

    参数

    默认值

    描述

    es.nodes

    localhost

    CSS集群的访问地址,可以集群列表页面查看“内网访问地址”。

    es.port

    9200

    集群的访问端口号,一般为“9200”

    es.nodes.wan.only

    false

    是否进行节点嗅探。

    es.nodes.discovery

    true

    是否禁用节点发现。

    es.input.use.sliced.partitions

    true

    是否使用slice分区:

    • true:使用。
    • false:不使用。
    说明:

    设置为true,可能会导致索引在预读阶段的时间明显变长,有时会远远超出查询数据所耗费的时间。建议设置为false,以提高查询效率。

    es.resource

    NA

    指定要读写的Index和type。

    es.net.http.auth.user

    NA

    访问集群的用户名,只有启用了安全模式才需要配置此值。

    es.net.http.auth.pass

    NA

    用户名所对应的密码,只有启用了安全模式才需要配置此值。

    es.net.ssl

    false

    是否启用SSL,启用后需要配置安全证书信息。

    es.net.ssl.truststore.location

    NA

    “.jks”证书文件的路径,如“file:///tmp/truststore.jks”

    es.nodes.client.only

    false

    是否配置了独立的Client节点的IP地址给es.nodes(即创建Elasticsearch集群时是否“启用Client节点”)。如果是,则需要将该值改为“true”,否则会报错找不到data节点。

    es.net.ssl.truststore.pass

    NA

    “.jks”证书文件的密码。

    更多ES-Hadoop配置项说明请参见官方配置说明

  12. 在Hive客户端,插入数据。
    INSERT INTO TABLE student VALUES (1, "Lucy", "address1"), (2, "Lily", "address2");
  13. 在Hive客户端,执行查询。
    select * from student;

    查询结果如下:

    +-------------+---------------+---------------+
    | student.id  | student.name  | student.addr  |
    +-------------+---------------+---------------+
    | 1           | Lucy          | address1      |
    | 2           | Lily          | address2      |
    +-------------+---------------+---------------+
    2 rows selected (0.116 seconds)
  14. 登录CSS控制台,在“集群管理”页面,单击集群操作列“Kibana”,登录Kibana界面。
  15. 进入Kibana的“Dev Tools”页面执行查询命令,查看查询结果。
    GET /student/_search
    图2 kibana查询结果