项目架构升级,从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 主要添加两项
slider.zookeeper.quorum
t001.wux.chin.seagate.com:2181,t002.wux.chin.seagate.com:2181,
t003.wux.chin.seagate.com:2181
fs.defaultFS
hdfs://t001.wux.chin.seagate.com:8020
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,所有节点都释放,最后再启动,成功了!