从 ElasticSearch 加载数据

在检查特定语法之前,让我们看一下如何设置环境以加载所需的插件。

建立

要直接从 ElasticSearch 加载数据,你需要下载 elasticsearch-hadoop 插件。你可以通过不同的方式使其正常工作,对于快速设置,你可以执行以下操作。

为了使其工作,你需要将 jar 文件 elasticsearch-hadoop-<version>.jar 放在安装了 pig 服务器的节点的文件夹中。在我的情况下 - 相当常见的谷歌搜索 - 我还需要在该文件夹中添加 commons-httpclient-<version>.jar

然后你可以在 shell 模式下运行 pig(称为 grunt),只需在控制台上键入 pig 即可。然后你必须以下列方式加载这两个罐子:

REGISTER /path/to/jars/commons-httpclient-<version>.jar;
REGISTER /path/to/jars/elasticsearch-hadoop-<version>.jar;

现在你已准备好编写一些代码。

让我们检查语法以从复杂的案例中加载数据。

DATA = LOAD 'my_index/log' USING org.elasticsearch.hadoop.pig.EsStorage(
'es.nodes=https://server1:port1,https://server2:port2,https://server3:port3',
'es.query=?q=*',
'es.net.ssl=true',
'es.net.http.auth.user=user',
'es.net.http.auth.pass=pass',
'es.net.ssl.keystore.type=JKS',
'es.net.ssl.truststore.location=file:///path/to/truststore.jks',
'es.net.ssl.truststore.pass=pass');

这是完整的例子,现在让我们一步一步地分析它。

  • es.nodes 包含 ElasticSearch 集群的节点列表。你必须将节点指定为逗号分隔列表,并使用关联的端口。
  • es.query 保存将提交给 ElasticSearch 以获取数据的查询。你也可以使用 DSL 格式进行查询,但请注意,只会考虑查询的匹配部分! 如果你尝试通过查询 DSL 限制字段数量,它将无法工作:为了实现这一点,你需要使用 es.read.source.filter 参数。查询 DSL 的示例:'es.query = { "query":{ "match_all":{} } }'
  • es.net.ssl=true 是自解释的,你还需要使用 es.net.http.auth.useres.net.http.auth.pass 为 ElasticSearch 提供登录凭据。
  • es.net.ssl.keystore.type 如果你需要一个信任库,你可以在这里选择类型。在 es.net.ssl.truststore.location 参数中设置文件的位置,注意添加 file://前缀,在 es.net.ssl.truststore.pass 参数中设置信任库文件的密码。

一些有用的设置

  • es.read.source.filter=field1,field2,field3 允许你仅从 ElasticSearch 中获取指定的字段(在此示例中为三个)。
  • es.output.json=true 允许你以键值格式(JSON)获取数据。设置为 false 将以 CSV 格式返回数据(默认)。