【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,所有節點都釋放,最後再啓動,成功了!

 

 

時機已到,今日起兵!

 

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