es導出hive遇到的問題匯總

首先直接上干貨:

步驟

  1. 導入elasticsearch-hadoop-hive-5.5.2.jar包
  2. 創(chuàng)建hive外部表逝撬,數(shù)據(jù)源設置為es中,添加相應的配置
  3. 創(chuàng)建內(nèi)部表拉取數(shù)據(jù)
add jar file:///home/hadoop/liubx/elasticsearch-hadoop-hive-5.5.2.jar;
add jar  file:///home/hadoop/hive-1.2.1/lib/es-hadoop.jar;   #代碼見后面

use estest;
drop table if exists ext_es_test;
CREATE EXTERNAL TABLE ext_es_test(
typeid string,
cs_app string,
ipAddress string,
createTime  timestamp
)
row format delimited fields terminated by '\t'  
collection items terminated by ',' 
map keys terminated by ':'
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES(
'es.nodes' = 'master:9200',
'es.index.auto.create' = 'false',
'es.mapping.date.rich' = 'true',
'es.date.format' = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd", 
'es.ser.reader.value.class' = 'fjjf.es.EsValueReader',
'es.resource' = 'buriedpointinfo_bumsg/',
'es.read.metadata' = 'true',
'es.mapping.names' = 'typeid:_metadata._type, cs_app:cs_app,ipAddress:ipAddress,createTime:createTime');

#注釋:
'es.nodes'                  -- es連接node信息
'es.index.auto.create'      -- 是否自動創(chuàng)建索引 
'es.mapping.date.rich'      -- 是否啟用date自動轉換压固,json中沒有時間類型球拦,es封裝了一個Date類型存放特定格式的時間字符串≌饰遥可以通過mapping指定format
'es.date.format'            -- 自定義dateformat
'es.ser.reader.value.class'  -- 自定義reader,由于本地es中存放時間采用了("yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")坎炼,導出時hive只能選擇一種類型存取timestamp或者date
'es.resource'            -- es索引        
'es.read.metadata'       -- 是否讀取es元數(shù)據(jù)字段         
'es.mapping.names'         -- es 和hive  字段映射

#分頁查詢
select * from estest.ext_es_test_bumsg limit 10;

#創(chuàng)建內(nèi)部表分頁查詢
drop table if exists itn_es_test;
create table itn_es_testas 
select * from estest.itn_es_test;

遇到的問題:

  1. es中字段較多,不需要導出所有字段拦键。
    解決: 通過'es.mapping.names' 配置篩選所需要的字段谣光。

  2. 在hadoop-2.8版本下導出的時候經(jīng)常會報Error: java.lang.ClassNotFoundException: org.apache.commons.httpclient.util.xxxx,但是hive/lib目錄下確實有該類芬为。手動添加后還是無法解決
    解決: 將版本切到2.7不會出現(xiàn)該問題萄金,但是根本原因還是沒有找到,待解決媚朦。

20180402更新:
解決方法:


URL:
  http://master:8088/taskdetails.jsp?jobid=job_1517535406767_315524&tipid=task_1517535406767_315524_m_000137
-----
Diagnostic Messages for this Task:
Error: java.lang.ClassNotFoundException: org.apache.commons.httpclient.util.DateParseException
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.newInstance(Class.java:412)
    at org.elasticsearch.hadoop.util.ObjectUtils.instantiate(ObjectUtils.java:41)
    at org.elasticsearch.hadoop.util.ObjectUtils.instantiate(ObjectUtils.java:52)
    at org.elasticsearch.hadoop.util.ObjectUtils.instantiate(ObjectUtils.java:48)

嘗試在hive命令行手動添加jar失效之后氧敢,對比了hadoop2.7和hadoop2.8的jar包內(nèi)容。發(fā)現(xiàn)hadoop-2.8.1/share/hadoop/common/lib目錄下少了commons-httpclient-3.1.jar询张,由于本地hadoop2.8是編譯安裝的,所以懷疑是編譯安裝的時候沒有將該依賴包打進去孙乖,對比官方下載的hadoop2.8二進制包發(fā)現(xiàn)也沒有該jar包。
通過查看hadoop-2.8。0的change-log(https://issues.apache.org/jira/browse/HADOOP-13382

image.png

接下來唯袄,只需將es-hadoop依賴的commons-httpclient jar加入到所有的hadoop節(jié)點即可弯屈。

  • hadoop classpath | tr ':' '\n'
image.png
  1. es中導出的Date類型數(shù)據(jù)既有時間戳也有日期字符串,在存取到hive的時候發(fā)現(xiàn)以下問題恋拷;

1)時間戳無法正常轉換為時間戳
37304150-01-31 14:25:515:51.616
37301390-01-10 14:25:515:51.616
37300635-01-05 14:25:515:51.616
37289863-10-16 14:25:515:51.616
2)時間字符串無法正常轉換為時間戳资厉,會報類轉換異常 TextWritable unable cast to TimestampWritable

解決: 通過指定'es.ser.reader.value.class' ,自定義reader處理該異常蔬顾,將所有時間格式字符串統(tǒng)一格式輸出宴偿。

通過查看elasticsearch-hadoop的源碼,發(fā)現(xiàn)es-hadoop在解析Date類型的時候使用的是DatatypeConverter.parseDateTime(value)诀豁。(無法應對我們自定義的各種時間格式酪我,甚至包括UTC時區(qū)的時間。)

源碼地址:
https://github.com/elastic/elasticsearch-hadoop/blob/master/hive/src/main/java/org/elasticsearch/hadoop/hive/HiveValueReader.java

@Override
    protected Object parseDate(Long value, boolean richDate) {
        return (richDate ? new TimestampWritable(new Timestamp(value)) : processLong(value));
    }

    @Override
    protected Object parseDate(String value, boolean richDate) {
        return (richDate ? new TimestampWritable(new Timestamp(DatatypeConverter.parseDateTime(value).getTimeInMillis())) : parseString(value));
    }

源碼修改(默認情況下richDate為true且叁,如果為false都哭,則時間戳會當作Long處理,時間字符串當作Text處理)

@Override
    protected Object parseDate(String value, boolean richDate) {
        Date d = null;

        if(StringUtil.isNotEmpty(dateFormat)) {
            try {
                if(value.length() == 13){
                    return new TimestampWritable(new Timestamp(Long.valueOf(value)));
                }else{
                    d = DateUtil.parseDate(value, Arrays.asList(dateFormat.split("\\|\\|")));
                }

            } catch (DateParseException e) {
                e.printStackTrace();
                System.out.println("parse failed please check the dateFormat");
            }
        } else {
            d = DdfatatypeConverter.parseDateTime(value).getTime();
        }
        return new TimestampWritable(new Timestamp(d.getTime()));
    }

    protected Object parseDate(long value, boolean richDate) {
        Date d = new Date(value);
        return new TimestampWritable(new Timestamp(d.getTime()));
    }
  1. 最后遇到一個小問題逞带,idea打包jar的時候太大欺矫,上傳服務器速度較慢,將一些依賴去除打包后解決展氓。
    解決: 在pom.xml中指定scope為proviede穆趴,打包的時候忽略。
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-hadoop</artifactId>
    <version>5.5.0</version>
    <scope>provided</scope>
</dependency>

總結:
es國內(nèi)資料比較雜亂遇汞,很多都還是2.x的未妹。
建議研讀官方文檔,es這塊配置項比較多空入,而且很多功能也許在配置項中已經(jīng)可以找到解決方案了络它,缺乏的是仔細去研讀和加深理解。這個我自己也正在學習的路上歪赢,哈哈化戳!
另外,es-hadoop導出性能一般埋凯,20m/s左右点楼,3個節(jié)點。有待提升白对,有時間可以對比下es-spark和java api效果掠廓。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甩恼,隨后出現(xiàn)的幾起案子蟀瞧,更是在濱河造成了極大的恐慌狰域,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黄橘,死亡現(xiàn)場離奇詭異,居然都是意外死亡屈溉,警方通過查閱死者的電腦和手機塞关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來子巾,“玉大人帆赢,你說我怎么就攤上這事∠吖#” “怎么了椰于?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仪搔。 經(jīng)常有香客問我瘾婿,道長,這世上最難降的妖魔是什么烤咧? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任偏陪,我火速辦了婚禮,結果婚禮上煮嫌,老公的妹妹穿的比我還像新娘笛谦。我一直安慰自己,他們只是感情好昌阿,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布饥脑。 她就那樣靜靜地躺著,像睡著了一般懦冰。 火紅的嫁衣襯著肌膚如雪灶轰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天刷钢,我揣著相機與錄音框往,去河邊找鬼。 笑死闯捎,一個胖子當著我的面吹牛椰弊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓤鼻,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼秉版,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茬祷?” 一聲冷哼從身側響起清焕,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秸妥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滚停,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年粥惧,在試婚紗的時候發(fā)現(xiàn)自己被綠了键畴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡突雪,死狀恐怖起惕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咏删,我是刑警寧澤惹想,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布督函,位于F島的核電站嘀粱,受9級特大地震影響,放射性物質發(fā)生泄漏辰狡。R本人自食惡果不足惜草穆,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搓译。 院中可真熱鬧悲柱,春花似錦、人聲如沸些己。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽段标。三九已至涯冠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逼庞,已是汗流浹背蛇更。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工赛糟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留派任,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓璧南,卻偏偏與公主長得像掌逛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子司倚,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361