Presto on yarn搭建及其问题解决方案全面总结

Presto on yarn搭建及其问题解决方案全面总结,第1张

Presto on yarn搭建及其问题解决方案全面总结 Presto搭建整合流程总结 一、环境准备

本次搭建内容是: presto on yarn + kerberos 整合

本次presto集群搭建过程基于一下环境:

  • hadoop版本: hadoop-2.7.3
  • presto版本:0.223
  • slider版本: slider-0.91.0-incubating
  • jdk版本: jdk1.8.0_181

注意,jdk版本要求在jdk1.8_151以上,否则可能会出现bug:

Java HotSpot™ 64-Bit Server VM warning: CMSFullGCsBeforeCompaction is deprecated and will likely be removed in a future release.
Presto requires Java 8u151+ (found 1.8.0_144)

搭建前期说明

  • hadoop集群jdk版本低的问题,可以尝试将高版本jdk打包到prestoServer中去(后面说),这是prestoServer启动的时候用自带的jdk而不是系统本地的;

  • 配置文件也可以和prestoServer一起打包,不使用appConfig.conf这种方式配置

  • presto on yarn这种方式,我们只部署worker节点;coordinator单独找一台物理机部署

    原因:coordinator on yarn的方式会出现coordinator不知道会被yarn启动到哪台机器,导致dicovery.uri指向的host不确定出现worker连接不上coordinator的情况。为处理这种情况,采用此策略。后续会补充其余两种策略也可以处理这种情况。

二、开始搭建 2.1、presto-yarn的配置

step1: 我们要下载presto-yarn的安装包:

git clone https://github.com/prestodb/presto-yarn.git

这里我挑选了测试环境hadoop集群的test-32-201.bd.com进行部署安装,路径:/opt/presto/presto-yarn

[root@test-32-201 presto-yarn]# ll
total 32
-rw-r--r-- 1 root root 7346 Sep 17 10:03 mvnw
-rw-r--r-- 1 root root 6747 Sep 17 10:07 pom.xml
drwxr-xr-x 4 root root 4096 Sep 17 10:14 presto-yarn-docs
drwxr-xr-x 4 root root 4096 Sep 27 17:38 presto-yarn-package
drwxr-xr-x 6 root root 4096 Sep 17 10:11 presto-yarn-test
-rw-r--r-- 1 root root 2520 Sep 17 10:03 README.md

step2: 修改上面的pom.xml文件 ,改下presto版本和slider版本

0.223
0.91.0-incubating

step3: 退出pom.xml编辑,进入下面的目录

cd  /opt/presto/presto-yarn/presto-yarn-package/src/main/slider/package/scripts

将configure.py文件内容改成下面:

#!/usr/bin/env python

from resource_management import *
import ast, os, shutil

def set_configuration(component=None):

    import params

    if (os.path.exists(format("{data_dir}"))):
        shutil.rmtree(format("{data_dir}"))

    if (os.path.lexists(format("{conf_dir}"))):
        os.remove(format("{conf_dir}"))

    _directory(params.pid_dir, params)
    _directory(params.log_dir, params)
 

    if params.addon_plugins:
        plugins_dict = ast.literal_eval(params.addon_plugins)
        for key, value in plugins_dict.iteritems():
            plugin_dir = os.path.join(params.presto_plugin_dir, key)
            if not os.path.exists(plugin_dir):
                os.makedirs(plugin_dir)
            for jar in value:
                shutil.copy2(os.path.join(params.source_plugin_dir, jar), plugin_dir)
            
def _directory(path, params):
    Directory(path,
              owner=params.presto_user,
              group=params.user_group,
              recursive=True
              )

这个文件在presto运行的时候,会被用到,具体调用地方在presto_server.py,做一些jar包等的配置

然后修改presto_server.py,将整个文件修改为下面的内容:

#!/usr/bin/env python

from resource_management import *
from configure import set_configuration
import os

class PrestoServer(script):
    def __init__(self, component):
        self.component = component

    def install(self, env):
        self.install_packages(env)
        pass

    def configure(self):
        set_configuration(self.component)

    def start(self, env):
        import params

        env.set_params(params)

        self.configure()
        #修改此处
        # os.symlink(format('{conf_dir}'), os.path.join(format('{presto_root}'), 'etc'))
        os.symlink(os.path.join(format('{presto_root}'), 'etc'),format('{conf_dir}'))
        process_cmd = format("PATH={presto_root}/jdk1.8.0_181/bin:$PATH {presto_root}/bin/launcher run --node-config {conf_dir}/node.properties --jvm-config {conf_dir}/jvm.config --config {conf_dir}/config.properties >> {log_file} 2>&1")

        Execute(process_cmd,
                logoutput=True,
                wait_for_finish=False,
                pid_file=params.pid_file,
                poll_after=3
                )

    def stop(self, env):
        pass

    def status(self, env):
        import params

        env.set_params(params)
        check_process_status(params.pid_file)


if __name__ == "__main__":
    self.fail_with_error('Component name missing')

这个文件是worker和coordinator启动的时候的脚本。其中我把上面的jdk调整为我们自己丢到prestoServer目录下的jdk。除此之外,使用的jvm.config、node.properties、config.properties都是和presto配置相关的文件(和普通部署presto,不走on yarn模式的配置文件基本一样)

step4:打包编译

上面的准备工作做好后,就可以打包了

mvn clean package -DskipTests

编译完后的包在presto-yarn-package/target目录下

/opt/presto/presto-yarn/presto-yarn-package/target/presto-yarn-package-1.6-SNAPSHOT-0.223.zip

step5: prestoServer配置

我们用unzip命令解压上面的zip包,可以看到有下面的文件:

appConfig-default.json  
metainfo.xml  
package  
resources-default.json

继续,进入到package/files目录下,可以看找到文件presto-server-0.223.tar.gz

这个文件就是prestoServer,后续presto实际运行就是通过这个文件下的launcher.py启动的。对presto-server-0.223.tar.gz文件解压,进入到解压后的目录中,发现缺少了etc目录

之所以没有etc目录,是因为官方配置的时候是使用

appConfig-default.json 指定参数来配置的,但我们这里不采用这种方式,按照prestoServer正常的方式部署。

注意,虽然不试用appConfig-default.json来配置prestoServer,但是slider启动的时候需要从它获取相关的jvm参数等信息,所以还是有用的,后面会给出说明。

创建etc目录,并且把你上面在presto_server.py中配置的jdk1.8.0_181放入到当前目录中,最后的目录构造如下:

[root@test-32-201 presto-server-0.223]# ll
total 220
drwxr-xr-x  3 root  root    4096 Oct 12 15:45 bin
drwxr-xr-x  3 root  root    4096 Oct 12 14:38 etc
drwxr-xr-x  8 10143 10143   4096 Jun  9 21:58 jdk1.8.0_301
drwxr-xr-x  2 root  root   12288 Oct  8 18:08 lib
-rw-r--r--  1 root  root  191539 Jul 26  2019 NOTICE
drwxr-xr-x 30 root  root    4096 Sep 17 14:42 plugin
-rw-r--r--  1 root  root     126 Jul 26  2019 README.txt

进入etc目录,创建如下文件

jvm.config
log.properties
node.properties
config.properties

其中文件具体内容:

  • jvm.config定义prestoServer启动jvm相关参数

    -server
    -Xmx800M
    -XX:+UseConcMarkSweepGC
    -XX:+ExplicitGCInvokesConcurrent
    -XX:+CMSClassUnloadingEnabled
    -XX:+AggressiveOpts
    -XX:+HeapDumponOutOfMemoryError
    -XX:onOutOfMemoryError=kill -9 %p
    -XX:ReservedCodeCacheSize=150M
    -Dsun.security.krb5.debug=true
    -Dlog.enable-console=true
    -Djava.security.krb5.conf=/etc/krb5.conf
    -Dsun.security.krb5.debug=true
    
    

    -Dsun.security.krb5.debug=true
    -Djava.security.krb5.conf=/etc/krb5.conf
    -Dsun.security.krb5.debug=true
    这几项和安全认证相关,因为我们要整合kerberos+presto

  • node.properties

node.environment=production
#node.id=presto-server
node.data-dir=/data/presto/data

这个文件定义了presto启动时数据存放路径、nodeid等信息。发现我其实注释掉了node Id, 这个node Id实际上是要全局唯一的,如果写死的话,会出现重复,导致prestoServer启动失败。故把它注释掉,让它自动分配。

另一种思路,可以在prestoSever的bin目录下的launcher.py中动态指定node.properties文件,可以临时生成一个node.properties文件,填写其中的内容,并指向它(未经测试,后续可以验证)。

  • log.properties
com.facebook.presto=INFO

支持DEBUG、INFO日志级别,输出prestoServer的日志,其中这个日志存放的位置,就是在node.properties指定的node.data-dir 下面:

[root@test-32-201 etc]# ll /data/presto/data/var/log/
http-request.log  launcher.log      server.log  
  • config.properties
coordinator=false
http-server.http.port=8666
query.max-memory=200MB
query.max-memory-per-node=400MB
query.max-total-memory-per-node=450MB
query.max-total-memory=600MB
discovery.uri=http://test-32-201.bd.com:8999

这个配置文件配置当前节点的角色、节点查询使用的内存限制、服务发现节点地址

其中:

  1. coordinator=false:是否为coordinator,false表示是worker。
  2. http-server.http.port: prestoServer启动的端口
  3. discovery.uri : 服务发现地址,这里一般都是指向coordinator,discovery服务发现也是在coordinator中启动的。后面,我们也会在test-32-201.bd.com这台机器上,单独启动coordinator。

前面说了,这里presto on yarn仅部署worker,暂时不考虑coordinator先。上面的config.properties是针对worker角色来配置的。

  • 在etc目录下创建catalog目录

prestoServer需要和hive、mysql等进行交互,需要指定hive、mysql等配置的地址。

  1. 创建hive.properties文件,键入:

    connector.name=hive-hadoop2
    hive.metastore.uri=thrift://test-32-202.bd.com:9083
    hive.config.resources=/opt/hadoop-2.7.3/etc/hadoop/core-site.xml,/opt/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
    
    
    ##下面几项是访问hive时kerberos认证相关的配置
    hive.metastore.authentication.type=KERBEROS
    hive.metastore.service.principal=hive/[email protected]
    hive.metastore.client.principal=hive/[email protected]
    hive.metastore.client.keytab=/etc/security/keytabs/hive.service.keytab
    
    hive.hdfs.authentication.type=KERBEROS
    hive.hdfs.impersonation.enabled=true
    hive.hdfs.presto.principal=hive/[email protected]
    hive.hdfs.presto.keytab=/etc/security/keytabs/hive.service.keytab
    

    上面,由于我们的hive集成了kerberos,所以要引入kerberos相关的认证配置。简单说下这几个项的含义:

  • connector.name: Connector的类型,其值参考如下:

由于这里是hadoop2.x版本,故使用hive-hadoop2。

  • hive.metastore.uri : hivemetastore服务地址,获取hive元数据信息。
  • hive.config.resources : 指向hadoop的配置文件

​ 后面相关的kerberos认证配置,需要注意的是,principal指定的用户需要可以访问hive,对应的keytab文件,需要在每个机器上都存在,并且路径得和上面指定的一样。

请注意:上面的hive.config.resource指定的所有配置文件,必须要存在于所有presto的worker节点上!如果不存在,会出现各种奇怪的问题!(官方原话)

具体情况参考:https://github.com/prestodb/presto/blob/master/presto-docs/src/main/sphinx/connector/hive.rst

  1. 创建mysql.properties 文件,键入:

    connector.name=mysql
    connection-url=jdbc:mysql://10.131.0.251:3306
    connection-user=root
    connection-password=bd.com
    

    这里配置不做过多展开说明,就是普通的链接数据库配置。

通过上面的配置,我们就可以通过prestoServer访问hive和mysql了。

至此,整个prestoServer就改造完成了,打包即可:

tar -cvf presto-server-0.223.tar.gz  presto-server-0.223/ 

随后我们进入到slider的配置。

2.2、slider的配置

地址https://archive.apache.org/dist/incubator/slider/,这里我们下载的版本是0.91.0-incubating,一定要选择和自己hadoop版本一致的版本

wget https://archive.apache.org/dist/incubator/slider/0.91.0-incubating/apache-slider-0.91.0-incubating-source-release.zip  

我将它部署在/opt/slider 目录下,解压后对应目录结构:

[root@test-32-201 apache-slider-0.91.0-incubating]# ll
total 144
drwxr-xr-x 15 root root  4096 Oct 12 17:33 app-packages
drwxr-xr-x  2 root root  4096 Oct 12 17:33 bin
-rw-r--r--  1 root root 13436 Jun 23  2016 DEPENDENCIES
-rw-r--r--  1 root root   532 Jun 19  2016 DISCLAIMER
-rw-r--r--  1 root root 21915 Jun 19  2016 LICENSE
-rw-r--r--  1 root root   167 Jun 19  2016 NOTICE
-rw-r--r--  1 root root 59913 Jun 23  2016 pom.xml
-rw-r--r--  1 root root  5598 Jun 19  2016 README.md
drwxr-xr-x  4 root root  4096 Oct 12 17:33 slider-agent
drwxr-xr-x  3 root root  4096 Oct 12 17:33 slider-assembly
drwxr-xr-x  3 root root  4096 Oct 12 17:33 slider-core
drwxr-xr-x  3 root root  4096 Oct 12 17:33 slider-funtest
drwxr-xr-x  4 root root  4096 Jun 19  2016 src

随后,修改pom.xml, 改下hadoop版本为你当前hadoop的版本

2.7.1

编译:

mvn clean package -Dmaven.test.skip=true -DskipTests 

编译完成在/slider-assembly/target目录找到slider-0.91.0-incubating-all.tar.gz

配置slider

step1: 解压slider-0.91.0-incubating-all.tar.gz,进入slider-0.91.0-incubating/conf

配置其中的slider-env.sh,slider-client.xml

  • 修改slider-env.sh
vim slider-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_301/
export HADOOP_CONF_DIR=/opt/hadoop-2.7.3/etc/hadoop
  • 修改slider-client.xml

    
      slider.client.resource.origin
      conf/slider-client.xml
      This is just for diagnostics
    

    
      slider.security.protocol.acl
      *
      When security is enabled, set appropriate acl. Default value means allow everyone.
    

    
      slider.yarn.queue.priority
      1
      the priority of the application.
    

    
      slider.am.login.keytab.required
      false
      Declare that a keytab must be provided.
    
    
    
      yarn.log-aggregation-enable
      true
    

    
      yarn.application.classpath
    $HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common
    public static void connectHive() throws ClassNotFoundException, SQLException {
        // URL parameters
        String url = "jdbc:presto://test-32-201.bd.com:18088/hive/default";
        Properties properties = new Properties();
        properties.setProperty("user", "presto");
        properties.setProperty("password", "bd.com");
        properties.setProperty("SSL", "true");
        properties.setProperty("SSLKeyStorePath", "E:\prestokeystore.jks");
        properties.setProperty("SSLKeyStorePassword","bd.com");
        properties.setProperty("KerberosRemoteServiceName","presto");
        properties.setProperty("KerberosPrincipal","presto");
        properties.setProperty("KerberosKeytabPath","E:\presto.keytab");
        properties.setProperty("KerberosConfigPath","E:\krb5.conf");
        Connection connection = DriverManager.getConnection(url, properties);
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("show tables");
        while (resultSet.next()){
            //todo 做后续的业务处理
        }
    }

对于上面的keytab等配置文件,需要和测试环境上面配置的一样。

更多的细节请参考官方文档:

https://prestodb.io/docs/current/installation/jdbc.html

6.2、Python连接presto集群

参考文章:https://zhuanlan.zhihu.com/p/145864930

  1. 准备好cacert.pem文件

首先找到你访问presto的jks文件,然后通过jks导出对应的pem文件。键入命令:

keytool -export -rfc -alias  -file  -keystore  -storepass 

alias是定义在keystore里面的entry,可以使用如下命令,查看当前包含哪几个entry:

keytool --list -keystore  -storepass 

例如:

[root@test-32-201 presto]# keytool --list -keystore prestokeystore.jks   -storepass bd.com

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 1 entry

presto, Oct 12, 2021, PrivateKeyEntry, 
Certificate fingerprint (SHA1): C8:BE:91:96:5E:F4:BA:ED:E4:26:F9:68:5F:36:F1:B7:75:03:C8:D

这个JKS包含1个entry,这样在提取证书的时候可以知道alias值为presto

然后键入:

keytool -export -rfc -alias presto -file cacert.pem -keystore  prestokeystore.jks  -storepass bd.com
七、常见问题总结 7.1、连接时常见的问题
  1. javax.net.ssl.SSLPeerUnverifiedException

presto> show catalogs;
Error running command: javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.1.116 not verified:
certificate: sha256/i+KNkzrrH/NHzUruc9R+f0a/P8Ql/OhOKh9n3JtL1qg=
DN: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
subjectAltNames: []

这种问题由keystore生成的时候host指定错误造成的

您的名字与姓氏是什么?[Unknown]: hostname

hostname即是你的主机名。

  1. Authentication failed for token

情况一:

com.facebook.presto.server.security.SpnegoFilter  Authentication failed for token
  Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled)

解决办法如下,下载JCE
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
解压后替换$JAVA_HOME/jre/lib/security目录下的local_policy.jar,US_export_policy.jar

情况二:

问题异常:

2021-11-03T14:37:13.995+0800    INFO    http-worker-140 stdout  Looking for keys for: presto/[email protected]
2021-11-03T14:37:13.996+0800    INFO    http-worker-140 stdout  Looking for keys for: presto/[email protected]
2021-11-03T14:37:13.997+0800    DEBUG   http-worker-140 com.facebook.presto.server.security.KerberosAuthenticator       Authentication failed for token YIICdwYGKwYBBQUCoIICazCCAmegDTALBgkqhkiG9xIBAgKhBAMCAXaiggJOBIICSmCCAkYGCSqGSIb3EgECAgEAboICNTCCAjGgAwIBBaEDAgEOogcDBQAgAAAAo4IBSmGCAUYwggFCoAMCAQWhCxsJTUVJWlUuQ09Noi4wLKADAgEAoSUwIxsGcHJlc3RvGxl5amQtcHJlc3RvLTAtMTUwLm1laXp1Lm16o4H9MIH6oAMCARKhAwIBAaKB7QSB6pQuSlEDzzjpzCBizRKSM5214UxKF82cc1iAZzfREFfX+E7wjxI8ly4wwQlVHlb1xGfe0daT1VQqcN6dmgJbIMliocmSH1V+w2GZSMRWF0Je0di7wk8qYHZvcyfZqQeVRkm1ler8kQxGkfNWyjQ9GKIfeUGuViinkfZ+kTFkAX8i8qMgn0k/yhbPcoAN1qoKVUD+slmoZqOvgQdcs3x9okx2d+i6V7S2KrJDToMrOt7/wgAoAKhMmFI5yFUiMQLi7eIFeVYhPVmSucFSeLkVsqOkheKNaqAV5X5yH0Zb9aY6dn5eXjxBCuUMDaSBzTCByqADAgESooHCBIG/ig8Apm4UKfoAT+rv7EjmcMCFlzOTOYlK4lcmHu8KsbUe1wd8+LcS/6YbWyDMf2JWdI1Aacag1MSc+XxY0lL/g/cACsMcoB9ZQXwq/ANPNp2i47wlDXCiedxcd2YTqx8OwOSMHBhuITv0qPEYjD+d17fx9AZrqAgnVBOWMQEoGuQvr5BKiuKeQtUvknDjOpwzyo05l4jN6WOyZ2onGqq9v6sUTDSGJmfb486XwNFMq4S0PIKIBhbVafdP2HF8vnM=
GSSException: Failure unspecified at GSS-API level (Mechanism level: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - AES256 CTS mode with HMAC SHA1-96)
        at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:858)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)

这种情况首先看一下你生成的keytab文件的内容,通过命令klist -ke xxx.keytab

发现只有[email protected]的加密信息,没有发现presto/[email protected] 的凭证信息,而异常中提示需要用到presto/[email protected]的凭证信息,这个时候就需要将presto/yjd-presto-0-150的凭证信息加入到presto.keytab中

kadmin -p root/admin -q "addprinc -randkey [email protected]"
kadmin -p root/admin -q "addprinc -randkey presto/[email protected]"
kadmin -p root/admin -q "ktadd -k /home/presto/presto.keytab [email protected]"
kadmin -p root/admin -q "ktadd -k /home/presto/presto.keytab presto/[email protected]"

此处就将[email protected]和presto/[email protected]的keytab信息存为一份keytab文件,你在用klist -ke查看生成的keytab文件结构,确认presto/[email protected]的凭证也在里面就可以了

  1. PKIX path building failed

具体异常

presto:default> show tbales;
Error running command: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

请检查你在连接的时候指定的--krb5-principal 、--krb5-keytab-path等是否正确,文件是否存在。 如果都正常,可能考虑是缺少安全证书相关的内容:可以参考博客https://blog.csdn.net/qq_34778576/article/details/108489662 解决。

  1. presto-cli 查询hive数据报错:Catalog ‘hive‘ does not exist

原因,在prestoServer/etc目录下,没有把hive.properties放入到catalog目录下。

7.2 presto集群搭建常见问题

集群搭建常见的问题,无非出现在slider提交presto任务到yarn过程、yarn调度起SliderAppMaster启动presto过程、presto服务实际运行过程。下面我逐一说下我在搭建过程遇到的问题和解决方案。

7.2.1、slider提交任务过程的问题

这里出现的问题比较少,无非是配置文件参数读取问题,比如yarn的地址不正确导致连不上,提交失败。

这里出现异常,可以直接定位到error log。 除此之外,由于slider也是java写的,我们可以通过debug方式去追溯问题的来源:

进入到slider安装目录的bin目录下面,找到slider.py, 修改:

DEFAULT_JVM_OPTS = "-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Xmx256m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"

这里相当于开启了8000端口,当你进行slider提交的时候,就可以debug了。

7.2.2、yarn调起sliderAppMaster启动presto集群过程

这个阶段先看sliderAppMaster可能出现的问题:

  1. JAAS文件找不到

Exception: Entry “Client” not found; JAAS config = ; java.security.auth.login.config=(undefined)

对于这个异常,在hadoop-env.sh有这个配置

export HADOOP_ZKFC_OPTS="-Dzookeeper.sasl.client=true -Dzookeeper.sasl.client.username=zookeeper -Djava.security.auth.login.config=/etc/hadoop/secure/hdfs_jaas.conf -Dzookeeper.sasl.clientconfig=Client $HADOOP_ZKFC_OPTS"

其中有引用到hdfs_jaas.conf。slider会去校验当前的模式,如果hadoop集群开启了kerberos认证,则会去找这个jaas.conf文件,如果找不到,就会报上面的错误。

这里的解决方案是,修改slider安装目录下的conf目录的appConfig-default.json。

"components":{
        "slider-appmaster":{
            "jvm.heapsize":"256M",
            "jvm.opts":"-Djava.security.auth.login.config=/etc/hadoop/secure/hdfs_jaas.conf -Djava.awt.headless=true -Xmx256m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8001 -DHADOOP_USER_NAME=hive"
        }
    }

主要加入jvm.opts并制定jaas文件的位置, slider在提交任务的时候会加载这个appConfig-default.json文件的所有配置项,通过这里告知slider具体的hdfs_jaas.conf的位置 。

  1. 在为presto往zk注册节点的时候出现ZKPath已存在的异常

这个异常通常是当某个节点出问题了,slider会重试,导致出现多次创建的情况,这个异常实际上可以忽略,因为不会影响程序后续运行。实际上更好的做法是判断是否存在这个path,而slider源码中并没有调用zk的exist方法判断路径,直接创建了一个持久节点(非临时)。这些zk的持久节点会在集群关闭的时候自动的删除。

  1. yarn集群连接不上的问题

这种情况先去检查下yarn集群的master节点是否存在,如果正常工作,可能考虑是不是yarn集群之前做了主备切换。slider实际上去链接yarn集群是通过slider-client.xml的下面两项配置信息获取机器地址的:

    
      yarn.resourcemanager.address
      test-32-36.bd.com:8050
    

    
      yarn.resourcemanager.scheduler.address
      test-32-36.bd.com:8030
    

可以先尝试用wget看看上面的ip端口是否ok,如果不ok,而yarn集群又正常,则说明有做过主备切换。对于这种情况,实际会继续重试连接下一个之前备份的节点。

7.2.3、presto启动运行时出现问题
  1. Caused by: java.lang.IllegalArgumentException: keytab does not exist: /etc/security/keytabs/hive.service.keytab

异常很明显,我们必须要保证本地机器都有这个keytab,这个文件当时是在上面我们定义hive.prorperties中指定的。

  1. Service announcement failed after 95.99us

2021-10-08T15:14:08.666+0800 ERROR Announcer-2 io.airlift.discovery.client.Announcer Service announcement failed after 95.99us. Next request will happen within 1000.00ms

presto每隔1s会去检查和coordinator的连接,上面出现的异常,表示找不到服务发现服务。请检查你配置的discovery.uri是否和coordinator暴露出去的一致。需要注意的是,discovery.uri用的是http而不是https,因为worker和coordinator通信还是走http方式的。所以dicovery.uri指定的端口是http的端口。

另外,也有可能是coordinator挂了,去看下进程是否还在。也有可能因为网络不通,检查下防火墙等。

  1. Invalid memory configuration 内存设置

Error injecting constructor, java.lang.IllegalArgumentException: Invalid memory configuration. The sum of max total query memory per node (1048576000) and heap headroom (311387750) cannot be larger than the available heap memory (10
37959168)

这个报错就是内存设置的过大了,超出jvm可以使用的内存大小(xmx参数)。去jvm.config和config.properties中调整相应的内存参数设置。

具体内存相关配置,参考:http://armsword.com/2019/11/13/the-configuration-settings-of-presto-memory-management/#more

7.3 其余常见问题
  1. 我遇到的几个常见问题都在下面博客有记录,都是和连接数据源相关的问题:

https://blog.csdn.net/silentwolfyh/article/details/108600511

  1. coordinator和worker都正常启动,但是访问hive报Empty Mount table in config for viewfs://xxx/
Query 20211109_062401_00047_a62mq failed: Error opening Hive split viewfs://xxx/hive/warehouse/uxip.db/hive_table_test/pkg_name=com.alibaba/000001_0 (offset=0, length=33554432): ViewFs: Cannot initialize: Empty Mount table in config for viewfs://xxx/

这是你使用了viewfs治理hadoop集群搞的,而你的hive的catalog配置,缺少了viewfs对应的mountable相关的配置内容。 所以它找不到挂载表。报此问题。

解决办法就是,将hive的core-site.xml的配置路径,添加到presto的catalog的hive.properties中:

#加入这行
hive.config.resources=/opt/presto/hadoop/core-site.xml,/opt/presto/hadoop/hdfs-site.xml,/opt/presto/hive/core-site.xml

这个hive的core-site.xml有如下配置:

    
    
    

看到这里,它引入了一个mountTable.xml,viewFs就是要根据这个挂载表找到对应的namenode来处理请求,如果这表都没有,当然会报上面的错误。而这里的mountTable.xml确保要和core-site.xml处于同一级目录。当然,如果你的mountTable.xml在其他位置,可以修改href指向绝对路径就行。

presto在启动时,新建hiveConnector的时候,会去读取hive.config.resources并加载他所需要的配置。

如果你是presto on yarn的模式,你必须要保证hive.config.resources对应的这些xml必须得在最终woker运行的那些节点机器上存在!且配置应该要相同!

  1. 访问hive的时候报Failed to list directory

具体报错:

com.facebook.presto.spi.PrestoException: Failed to list directory: hdfs://hzcluster/user/hive/warehouse/t2

我们在presto控制台点击刚刚查询的记录


进入之后,会有详细的log

com.facebook.presto.spi.PrestoException: Failed to list directory: hdfs://hdfscluster/user/hive/warehouse/t2

Caused by: org.apache.hadoop.ipc.RemoteException: Unauthorized connection for super-user: hive/[email protected] from IP 10.111.3.22
	at org.apache.hadoop.ipc.Client.call(Client.java:1476)
	at org.apache.hadoop.ipc.Client.call(Client.java:1413)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
	at com.sun.proxy.$Proxy199.getListing(Unknown Source)

看样子是没有权限访问hive,请检查当前机器的kerberos principal是否可以通过beeline的方式访问hive

八、补充-Presto服务发现部署方案

这里的方案主要解决一个问题,当presto on yarn这种模式运行worker和coordinator的时候,由于你不知道coordinator究竟会运行到哪一台机器上,导致worker无法找到coordinator(更确切将,是无法找到presto服务发现注册中心对应的机器ip) ,因为presto的服务发现功能默认是集成于coordinator中的。 下面给出三个解决方案,处理这个问题。

方案一: coordinator不走on yarn ,单独部署

这种方案就是我上面部署流程采用的。这里不多讲

方案二:设置yarn label

这种方式下,worker和coordinator 还是on yarn的方式,通过yarn进行调起。通过给yarn集群打上label,前提是yarn集群启动label功能,这里可以找网上相关资料。然后,进入到slider安装目录下,找到resources-default.json ,在coordinator选项下面,设置:

"yarn.label.expression": "yarn的label"

这样,coordinator启动时,就会被yarn丢到对应label的机器上。

不过这种方式不推荐,主要是因为label会导致不设置这个标签值的机器调用不了,任务跑不到这台设置label的机器上。

方式三:将presto的服务发现框架抽离,单独部署

presto的服务发现采用的是Airlift Discovery ,我们可以将coordinator和worker的discovery.uri指向单独部署的Airlift所属的机器。

具体的搭建步骤请参考:

https://blog.csdn.net/anghiking20140716/article/details/101312055

九、参考资料
  1. presto on yarn搭建:https://blog.csdn.net/woloqun/article/details/98751544

  2. presto on yarn搭建:https://blog.csdn.net/w8998036/article/details/101522048

  3. 官方文档:https://prestodb.io/docs/current/installation/jdbc.html

  4. presto整合kerberos:https://blog.csdn.net/woloqun/article/details/76560087

  5. presto在车好多项目的实战:https://blog.csdn.net/wypblog/article/details/111399181

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存