【hivebeelinespark】建表多分隔符,报:org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe

【hivebeelinespark】建表多分隔符,报:org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe,第1张

【hive/beeline/spark】建表多分隔符,报:org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe

【hive/beeline/spark】建表多分隔符,报:org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe

前言HIVE SHELL调整

报错解决方案 BEELINE调整

报错解决方案 SPARK调整

解决方案 后记

前言

大数据平台数据入湖逻辑执行方式从Impala改为beeline(连接hive)的方式后,在sql语句层面上做了一些调整(如DDL语句、分区字段等)。而后又发现,切换后hive默认不支持多字符作为行分隔符,设置多个字符==!@!==,但只会识别第一个字符!,后续@会被当做字段值识别,导致数据被污染:

……
ROW FORMAT DELIMITED FIELDS TERMINATED BY '!@!'
……
HIVE SHELL调整

于是调整一下建表语句:

……
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' WITH SERDEPROPERTIES ('field.delim'='!@!')
……
报错

hive shell执行报错:

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.hadoop.hive.ql.plan.TableDesc.getDeserializerClass(TableDesc.java:72)
    ... 32 more
解决方案

找到CDH hive的依赖包路径,找到contrib目录:

[root@bigd-dev014-10 hive]# pwd
/app/dolphinscheduler/CDH/lib/hive
[root@bigd-dev014-10 hive]# ll
total 108
drwxr-xr-x 2 root root  4096 Jan 18 18:35 auxlib
drwxr-xr-x 3 root root  4096 Dec  7  2018 bin
drwxr-xr-x 2 root root  4096 Dec  7  2018 cloudera
lrwxrwxrwx 1 root root    14 Dec  7  2018 conf -> /etc/hive/conf
drwxr-xr-x 2 root root  4096 Dec  7  2018 contrib
drwxr-xr-x 3 root root  4096 Dec  7  2018 data
drwxr-xr-x 6 root root  4096 Dec  7  2018 docs
drwxr-xr-x 2 root root  4096 Dec  7  2018 jdbc
drwxr-xr-x 4 root root 16384 Dec  7  2018 lib
-rw-r--r-- 1 root root 29003 Dec  7  2018 LICENSE
-rw-r--r-- 1 root root   578 Dec  7  2018 NOTICE
-rw-r--r-- 1 root root 18501 Dec  7  2018 RELEASE_NOTES.txt
drwxr-xr-x 4 root root  4096 Dec  7  2018 scripts
drwxr-xr-x 3 root root  4096 Dec  7  2018 sentry

将contrib目录下的hive-contrib-2.1.1-cdh6.1.0.jar包拷贝至auxlib目录下:

cp contrib/hive-contrib-2.1.1-cdh6.1.0.jar auxlib/

重启hive shell执行ddl语句,问题解决。

BEELINE调整

使用beeline执行刚刚的DDL语句:

beeline --verbose=true -u "jdbc:hive2://XXX.XXX.XXX.XXX:XXXX/" -n hive -d org.apache.hive.jdbc.HiveDriver -e "XXXXXXXXXXX"
报错

仍旧报错:

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.hadoop.hive.ql.plan.TableDesc.getDeserializerClass(TableDesc.java:72)
    ... 32 more
解决方案

去CDH上找到hive server角色所在的主机IP,登录上去,然后依旧是找到contrib目录下的hive-contrib-2.1.1-cdh6.1.0.jar包拷贝至auxlib目录下,问题再度解决。

SPARK调整

在spark-shell内执行spark sql依旧报错:

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.hadoop.hive.ql.plan.TableDesc.getDeserializerClass(TableDesc.java:72)
    ... 32 more
解决方案

去所有spark节点上,找到spark依赖路径:

root@bdtest06 spark]# pwd
/opt/cloudera/parcels/CDH-6.1.0-1.cdh6.1.0.p0.770702/lib/spark
[root@bdtest06 spark]# ll
total 160
drwxr-xr-x 2 root root  4096 Dec  7  2018 bin
drwxr-xr-x 2 root root  4096 Dec  7  2018 cloudera
lrwxrwxrwx 1 root root    15 Dec  7  2018 conf -> /etc/spark/conf
drwxr-xr-x 3 root root  4096 Dec  7  2018 examples
drwxr-xr-x 2 root root  4096 Dec  7  2018 hive
drwxr-xr-x 2 root root 12288 Jan 18 21:19 jars
-rw-r--r-- 1 root root 21357 Dec  7  2018 LICENSE
-rw-r--r-- 1 root root 42919 Dec  7  2018 NOTICE
drwxr-xr-x 7 root root  4096 Dec  7  2018 python
-rw-r--r-- 1 root root 49364 Dec  7  2018 python.tar.gz
-rw-r--r-- 1 root root   376 Dec  7  2018 RELEASE
drwxr-xr-x 2 root root  4096 Dec  7  2018 sbin
lrwxrwxrwx 1 root root    19 Dec  7  2018 work -> /var/run/spark/work

将hive-contrib-2.1.1-cdh6.1.0.jar包拷贝至jars目录下的依赖包路径:

cp ../hive/contrib/hive-contrib-2.1.1-cdh6.1.0.jar  jars/

注意,这里是每个spark节点都要进行该拷贝 *** 作,之后问题解决。

后记

基本上均是因为运行环境中的hive-contrib-2.1.1-cdh6.1.0.jar缺失引起的,有另一种方式是修改hive-site.xml中的hive.aux.jars.pat配置值来指定hive-contrib-2.1.1-cdh6.1.0.jar的位置,因为我的节点hive-contrib-2.1.1-cdh6.1.0.jar包位置并不统一,且节点数比较少,就手动cp解决了该问题。
采用哪种方案可视自己的集群情况而定,如遇问题下方留言交流。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5711294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存