【presto on yarn】解决方案

一.前言

项目架构升级,从hadoop2.7升到3.X,需要从批处理转变到实时流。大半年一直在做数据导入,没有很好的方案。目前在尝试的使用kafka分发文件,解码程序解码文件,落到flume,flume直接写hdfs。其中每天需要先建立hdfs文件目录,hive外部表挂载hdfs目录。因为patition目录结构有4层,导致小文件很多,写入速度很慢。一小时的数据流入需要四小时才能完全导入。

我一直在做前端查询框架,选择了presto,单机集群都测试过,速度还是很快的,所以选定了。领导希望presto能集成到hadoop里面,用yarn管理,所以查询了presto on  yarn的解决方案,资料虽然非常少,但是发现官方有集成文档,配合找到的一些资料,基本完成了presto on yarn的集成。下面记录下集成过程。

 

二.资料引用

https://blog.csdn.net/panguoyuan/article/details/78105629

https://prestodb.github.io/presto-yarn/index.html (官方)

 

三.集成过程

先查看了官方doc,看到可以自动安装,并集成到ambri,首先选择了这个方案,但是在download silide包的网站发现已经retired,并且没有历史版本下载。所以选择了Manual方案

1.环境

hadoop2.7.1   17nodes

 

2.编译presto-on-yarn包

(1)下载地址:https://github.com/prestodb/presto-yarn/    解压后目录如下

(2)编译,自己设定presto版本:mvn clean package -Dpresto.version=0.220

(3)编译完成在/presto-yarn-package/target目录下找到包presto-yarn-package-1.6-SNAPSHOT-0.220.zip

3.编译slide

(1)下载地址:https://archive.apache.org/dist/incubator/slider/  下载最新版0.92. 目录结构:

(2)修改压缩包里pom.xml的java和hadoop版本,java需要1.8版本而且需要小版本大于151(此问题在后面的安装时我遇到了,后面详述)

(3)注释掉slider-core和slider-funtest中对hadoop-minicluster包依赖

(4)编译:mvn clean package -Dmaven.test.skip=true -DskipTests  编译完成在/slider-assembly/target目录找到slider-0.92.0-incubating-all.tar.gz

 

4.配置slider参数

(1)解压slider-0.92.0-incubating-all.tar.gz,配置其中的slider-env.sh,slider-client.xml

slider-env.sh 在执行机器上配置好java_home和hadoop_conf_dir

export JAVA_HOME=${JAVA_HOME}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR}

ps: 我在生产环境部署好启动presto时,报个错如下,说yarn.resourcemanager.address找不到,我去查看了yarn-site.xml,里面是配置好的,并且是双节点HA的配置,但是这里启动总是报这个错。查资料(https://community.cloudera.com/t5/Support-Questions/slider-HA-error-quot-Invalid-yarn-resourcemanager-address/td-p/120952)可能是HADOOP_CONF_DIR变量没有配置好,我仔细检查了hadoop环境变量的配置,已经OK,但是仍然报错。无奈,我将slider-env.sh里面的java和hadoop配置直接赋值,再启动,成功!

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64
export HADOOP_CONF_DIR=/usr/iop/4.1.0.0/hadoop/etc/hadoop

slider-client.xml 主要添加两项

<property>
	  <name>slider.zookeeper.quorum</name>         
      <value>t001.wux.chin.seagate.com:2181,t002.wux.chin.seagate.com:2181,
            t003.wux.chin.seagate.com:2181</value>
</property>
<property>
	  <name>fs.defaultFS</name>
	  <value>hdfs://t001.wux.chin.seagate.com:8020</value>
</property>

5.配置presto yarn参数

(1)解压presto-yarn-package-1.6-SNAPSHOT-0.220.zip,获取appConfig-default.json,resources-default.json

(2)官方配置https://prestodb.github.io/presto-yarn/installation-yarn-configuration-options.html

(3)appConfig-default.json 配置问题

我的配置文件:

{
  "schema": "http://example.org/specification/v2.0.0",
  "metadata": {
  },
  "global": {
    "site.global.app_user": "hive",
    "site.global.user_group": "hadoop",
    "site.global.data_dir": "/var/lib/presto/data",
    "site.global.config_dir": "/var/lib/presto/etc",
    "site.global.app_name": "presto-server-0.220",
    "site.global.app_pkg_plugin": "${AGENT_WORK_ROOT}/app/definition/package/plugins/",
    "site.global.singlenode": "false",
    "site.global.coordinator_host": "${COORDINATOR_HOST}",
    "site.global.presto_query_max_memory": "20GB",
    "site.global.presto_query_max_memory_per_node": "1024MB",
    "site.global.presto_query_max_total_memory_per_node":  "3072MB",
    "site.global.presto_server_port": "8090",

    "site.global.catalog": "{'hive': ['connector.name=hive-hadoop2','hive.config.resources=/usr/local/share/prestoHiveConf/hive2/core-site.xml,/usr/local/share/prestoHiveConf/hive2/hdfs-site.xml,/usr/local/share/prestoHiveConf/hive2/hive-site.xml', 'hive.metastore.uri=thrift://seadoop106.wux.chin.seagate.com:9083'],'hive2': ['connector.name=hive-hadoop2','hive.config.resources=/usr/local/share/prestoHiveConf/hive1/core-site.xml,/usr/local/share/prestoHiveConf/hive1/hdfs-site.xml,/usr/local/share/prestoHiveConf/hive1/hive-site.xml', 'hive.metastore.uri=thrift://t003.wux.chin.seagate.com:9083'],'tpch': ['connector.name=tpch']}",
    "site.global.jvm_args": "['-server', '-Xmx10240M', '-XX:+UseG1GC', '-XX:G1HeapRegionSize=160M', '-XX:+UseGCOverheadLimit', '-XX:+ExplicitGCInvokesConcurrent', '-XX:+HeapDumpOnOutOfMemoryError', '-XX:OnOutOfMemoryError=kill -9 %p']",
    "site.global.log_properties": "['com.facebook.presto.hive=INFO','com.facebook.presto.server=INFO']",

    "application.def": ".slider/package/PRESTO/presto-yarn-package-1.6-SNAPSHOT-0.220.zip",
    "java_home": "/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64"
  },
  "components": {
    "slider-appmaster": {
      "jvm.heapsize": "128M"
    }
  }
}

site.global.app_user:默认是yarn,该用户是以后执行slider命令的,并且执行完slider会在hdfs上创建presto的数据工作空间。需要在hdfs上首先存在/user/yarn的目录。命令执行完后会创建目录/user/yarn/.slider。且该账户需要有访问创建执行hdfs文件的权限,这里我选择了用hive账户

site.global.user_group:默认hadoop组

site.global.data_dir:很重要的目录配置,默认/var/lib/presto/data。这是presto在每个节点的数据目录,log目录,还有node.propertise,jvm.config,config.properties配置文件的目录。这个目录必须要在每个节点上提前创建好,并且该文件夹的owner权限必须是yarn,否在在启动presto yarn时会报没有权限

site.global.config_dir:默认/var/lib/presto/etc,同site.global.data_dir

site.global.singlenode:默认true,为true时会将coordinator节点也成为worker节点

site.global.presto_query_max_memory:整个集群最大用户查询内存

site.global.presto_query_max_memory_per_node:每个节点最大用户查询内存 推荐jvm*0.1

site.global.presto_query_max_total_memory_per_node:每个节点最大用户查询内存加系统查询内存 推荐jvm*0.3

site.global.presto_server_port:默认8080

site.global.catalog:数据源节点配置,配置指向你集群的配置文件

site.global.jvm_args:jvm内存配置

site.global.log_properties:不需要改

application.def:指向hdfs上的presto-yarn压缩包

site.global.app_name:

java_home:java版本与presto版本有对应关系,presto版本要求java除了大版本1.8之外,还要满足小版本。比如presto0.220要求java版本最低是java-1.8.0.151,如果低于此,在启动presto时会报错

Presto requires Java 8u151+ (found 1.8.0_77)

(4)resources-default.json配置

我的配置

{
  "schema": "http://example.org/specification/v2.0.0",
  "metadata": {
  },
  "global": {
    "yarn.vcores": "1"
  },
  "components": {
    "slider-appmaster": {
    },
    "COORDINATOR": {
      "yarn.role.priority": "1",
      "yarn.component.instances": "1",
      "yarn.component.placement.policy": "1",
      "yarn.memory": "15360",
      "yarn.label.expression": "coordinator"
    },
    "WORKER": {
      "yarn.role.priority": "2",
      "yarn.component.instances": "10",
      "yarn.component.placement.policy": "1",
      "yarn.memory": "15360",
      "yarn.label.expression": "worker"
    }
  }
}

特别指出yarn.label.expression这个参数。这个参数是与你hadoop集群中节点的label相关的,如果hadoop节点中node的label是空,那这里也必须为空,把这行配置删去。如果hadoop节点中node的label有值,此处将其配置成hadoop节点的label值即可。否则两者不匹配就会报权限错误

我在这处理时,就遇到这个问题,hadoop节点的label是没有的,而我在这里配置了这个值,结果就报了上面的错误。

6.启动presto集群

(1)用hive账户进入slider目录

(2)启动presto集群 bin/slider package --install --name PRESTO --package /usr/local/apache-slider-0.92.0-incubating-all/presto-yarn-package-1.6-SNAPSHOT-0.220.zip

bin/slider create presto-query --template appConfig-default.json --resources resources-default.json

(4)启动完成在yarn上查看application(前面失败了很多次,最后是成功的,后来把它kill了)

 

点进去查看

找到presto监控界面,部署成功。

 

 

2020-01-16 10:35补充

在一次集群调整配置重启后,按照之前的启动方法启动presto on yarn总是失败,查看yarn和silder日志,看出可能与/var/lib/presto/etc目录的权限有关,但是将所有node节点的该目录释放为777后还是启动失败,同样报这个权限问题。尝试了更换用户等其他方案,没有效果。理智告诉我问题肯定还是出在这个目录的权限问题,后来干脆把/var/lib/presto也释放777,所有节点都释放,最后再启动,成功了!

 

 

时机已到,今日起兵!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章