一.前言
項目架構升級,從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,所有節點都釋放,最後再啓動,成功了!
時機已到,今日起兵!