elasticsearch 使用Hive/Qubole插入ElasticSearch,elasticsearch,hive,qubole,elasticsearch,Hive,Qubole" /> elasticsearch 使用Hive/Qubole插入ElasticSearch,elasticsearch,hive,qubole,elasticsearch,Hive,Qubole" />

elasticsearch 使用Hive/Qubole插入ElasticSearch

elasticsearch 使用Hive/Qubole插入ElasticSearch,elasticsearch,hive,qubole,elasticsearch,Hive,Qubole,我正在尝试将数据从配置单元表插入弹性搜索 CREATE EXTERNAL TABLE IF NOT EXISTS es_temp_table ( dt STRING, text STRING ) STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' TBLPROPERTIES('es.resource'='aggr_2014-10-01/metric','es.

我正在尝试将数据从配置单元表插入弹性搜索

    CREATE EXTERNAL TABLE IF NOT EXISTS es_temp_table (
        dt    STRING,
        text  STRING
    )
    STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
    TBLPROPERTIES('es.resource'='aggr_2014-10-01/metric','es.index.auto.create'='true')
    ;

    INSERT OVERWRITE TABLE es_temp_table
    SELECT dt, description
    FROM other_table
然而,数据是关闭的。当我在另一张表上计算(*)时,我得到了6000行。当我搜索aggr_2014-10-01索引时,我看到10000条记录!不知何故,记录被复制(行被多次复制)。也许我可以删除弹性搜索中的重复记录?我不知道我会怎么做

我相信这可能是由于Hive/Qubole为每个映射生成了两个任务。如果一个映射器成功,它会试图杀死另一个映射器。然而,另一项任务已经造成了损害(即插入ElasticSearch)。这是我最好的猜测,但我更想知道确切的原因,以及是否有办法解决它

set mapred.map.tasks.speculative.execution=false;
我发现的一件事是将推测执行设置为false,这样每个映射器只生成一个任务(请参见上面的设置)。然而,现在我看到的是计算不足。我相信这可能是由于跳过了记录,但我无法诊断为什么会首先跳过这些记录

在这个版本中,它还意味着即使一个任务/映射器失败,整个作业也会失败,然后我需要删除索引(部分数据已上载)并重新运行整个作业(需要约4小时)

[最新进展]

我试图通过将所有工作放在reducer中来解决这个问题(这是只生成一个任务以确保没有重复的记录插入的唯一方法)

然而,我现在看到一个巨大的低估!现在才有2000张唱片。弹性搜索确实估计了一些事情,但没有达到这个程度。ElasticSearch中的记录非常少。这可能是由于任务失败(不再重试)。它可能是从Qubole/Hive通过格式错误的条目时开始的。但我设定:

set mapreduce.map.skip.maxrecords=1000;
以下是我的查询的一些其他设置:

set es.nodes=node-names
set es.port=9200;
set es.bulk.size.bytes=1000mb;
set es.http.timeout=20m;
set mapred.tasktracker.expiry.interval=3600000;
set mapred.task.timeout=3600000;

我决定了这个问题。正如我所怀疑的,插入跳过了一些被认为是“坏”的记录。我一直无法找到被跳过的确切记录,但我尝试用空格替换所有非字母数字字符。这就解决了问题!不再跳过记录,所有数据都上传到弹性搜索

INSERT OVERWRITE TABLE es_temp_table
SELECT dt, REGEXP_REPLACE(description, '[^0-9a-zA-Z]+', ' ')
FROM other_table
INSERT OVERWRITE TABLE es_temp_table
SELECT dt, REGEXP_REPLACE(description, '[^0-9a-zA-Z]+', ' ')
FROM other_table