presto + slider 提交计算至yarn

本文介绍Presto SQL引擎的部署步骤,包括配置文件的设置、启动过程及常见问题解决方案,如worker节点不可用和HDFS权限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10.112.28.240 prestocli

10.183.225.158 perstoser

 

hive-site.xml

useUnicode=true&characterEncoding=UTF-8&autoReconnect=true 

 

kinit -k -t /etc/presto/presto.keytab presto

hadoop fs -mkdir -p /user/presto/.slider/package/PRESTO/
hadoop fs -put ./presto-yarn-package-1.3-SNAPSHOT-0.176.zip hdfs://ns/user/presto/.slider/package/PRESTO/

hadoop fs -mkdir -p /etc/presto/
hadoop fs -put /etc/presto/presto.keytab /etc/presto/

  

 

启动协调者:

/usr/bin/nohup /xxx/soft/lesports-presto-server-0.176/bin/launcher run --node-config /etc/presto/01/node.properties --jvm-config /etc/presto/01/jvm.config --config /etc/presto/01/config.properties --log-levels-file /etc/presto/01/log.properties >/xxx/soft/lesports-presto-server-0.176/stdout.log 2>&1 &

  

netstat -nlp | grep 20000

启动slider:
/usr/bin/nohup /letv/soft/xxx-slider-0.80.0-incubating/bin/startPresto.sh cloud_presto01 /etc/presto/01/slider/appConfig.json /etc/presto/01/slider/resources.json > /xxx/soft/lecloud-slider-0.80.0-incubating/stdout.log 2>&1 &

  



container-executor.cfg有min.user.id限制1000,需要修改user id:
usermod -u 1001 presto
cat /etc/passwd


在hdfs上建文件夹:
1. kinit 获取相应票据。
kinit -k -t /var/kerberos/krb5kdc/keytab/hadoop3_root.keytab presto/hadoop3@JENKIN.COM

hdfs dfs -mkdir -p /user/presto/.slider/cluster/

 查看hdfs文件:

[root@hadoop3 ~]# hadoop fs -ls /user/presto/.slider/cluster/
Found 1 items
drwxr-xr-x   - presto supergroup          0 2017-09-15 15:25 /user/presto/.slider/cluster/cloud_presto01

  

presto-cli查询:

1. 下载presto-cli

运行: ./presto-cli --server hadoop1:20000 --catalog hive --schema jenkindb

 

问题解决:

问题:failed: No worker nodes available 

解决:presto coordinate config.properties增加 node-scheduler.include-coordinator=true

问题:org.apache.hadoop.ipc.RemoteException: User: presto@JENKIN.COM is not allowed to impersonate root

解决:hive.properties增加 hive.hdfs.impersonation.enabled=false

 

转载于:https://www.cnblogs.com/kisf/p/7524947.html

<think>我们使用Haversine公式来计算两个经纬度点之间的距离。Haversine公式如下:$$d=2r\arcsin\left(\sqrt{\sin^2\left(\frac{\phi_2 -\phi_1}{2}\right) +\cos(\phi_1) \cos(\phi_2)\sin^2\left(\frac{\lambda_2 -\lambda_1}{2}\right)}\right)$$其中:- $\phi_1,\phi_2$是两个点的纬度(以弧度表示)- $\lambda_1,\lambda_2$是两个点的经度(以弧度表示) -$r$是地球半径(平均半径约为6371千米) 在Presto中,我们可以使用内置的三角函数(如SIN,COS, ASIN,SQRT等)来实现这个公式。假设我们有两个点:-点A:经度`lon1`,纬度`lat1` -点B:经度`lon2`,纬度`lat2`我们需要将经纬度从度数转换为弧度,因为三角函数使用弧度。可以使用`radians`函数或直接乘以$\pi/180$。 在Presto中,我们可以这样写:```sqlSELECT2*6371* ASIN(SQRT(SIN(RADIANS(lat2 -lat1)/2)* SIN(RADIANS(lat2- lat1)/2)+COS(RADIANS(lat1)) *COS(RADIANS(lat2)) *SIN(RADIANS(lon2- lon1)/2)* SIN(RADIANS(lon2- lon1)/2)))AS distance_km``` 但是,请注意,Haversine公式中的平方项可以用`POW`函数,但这里我们直接用乘法。另外,由于Presto有`RADIANS`函数,我们可以使用它来转换度数到弧度。然而,上面的公式中,我们注意到在SIN函数中已经除以2,所以可以直接使用。但是,我们也可以使用以下等价形式(更常见的形式): $$d =2r \arcsin\left(\sqrt{\sin^2\left(\frac{\Delta\phi}{2}\right) +\cos(\phi_1) \cos(\phi_2)\sin^2\left(\frac{\Delta\lambda}{2}\right)}\right)$$其中$\Delta\phi= \phi_2 -\phi_1$,$\Delta\lambda =\lambda_2- \lambda_1$。 在Presto中,我们可以这样写: ```sqlSELECT2*6371* ASIN(SQRT(POW(SIN(RADIANS(lat2- lat1)/2),2) +COS(RADIANS(lat1)) *COS(RADIANS(lat2)) *POW(SIN(RADIANS(lon2 -lon1) /2),2)))AS distance_km```或者,不使用`POW`,直接写成乘法的形式(如第一个示例)也是可以的。 另外,地球半径通常使用6371千米,这样计算出来的距离单位是千米。如果想得到米,可以乘以1000。 因此,在Presto计算两个经纬度点之间距离(单位:千米)的完整SQL表达式如下: ```sqlSELECT2*6371* ASIN(SQRT(SIN(RADIANS(lat2- lat1)/2)* SIN(RADIANS(lat2- lat1)/2)+COS(RADIANS(lat1)) *COS(RADIANS(lat2)) *SIN(RADIANS(lon2- lon1)/2)* SIN(RADIANS(lon2- lon1)/2)))AS distance_km```或者使用`POW`函数:```sqlSELECT2 *6371 *ASIN(SQRT(POW(SIN(RADIANS(lat2 -lat1)/2),2)+COS(RADIANS(lat1)) *COS(RADIANS(lat2)) *POW(SIN(RADIANS(lon2- lon1)/2),2))) ASdistance_km``` 两种写法都是等价的。注意:经纬度参数需要是浮点数类型(如DOUBLE)。另外,如果经纬度是字符串类型,需要先转换为浮点数。例如,假设我们有一个表`locations`,包含字段`lat1`,`lon1`,`lat2`,`lon2`,那么计算两个点之间距离的查询可以这样写: ```sqlSELECTid,2 *6371 *ASIN(SQRT(POW(SIN(RADIANS(lat2 -lat1)/2),2)+COS(RADIANS(lat1)) *COS(RADIANS(lat2)) *POW(SIN(RADIANS(lon2- lon1)/2),2))) ASdistance_kmFROM locations;``` 如果希望结果以米为单位,将6371改为6371000,或者将结果乘以1000。另外,引用[2]和[4]中提供了其他SQL实现(使用不同的公式,但原理类似),我们可以参考。但请注意,在Presto中,我们使用上述Haversine公式的实现是标准且准确的。 引用[2]中使用了如下公式(在MySQL中): ```sqlROUND(6378.137 *2* ASIN(SQRT(POW( SIN((lat1 *PI()/180 -lat2* PI() /180) /2),2)+ COS(lat1* PI() /180) *COS(lat2 *PI()/180)* POW( SIN((lon1 *PI()/180 -lon2* PI() /180) /2),2))),2)*1000AS metre```这个公式与我们的Haversine公式一致,只是地球半径使用了6378.137(赤道半径),单位是千米,然后乘以1000转换为米。在Presto中,我们也可以使用类似的方法,但要注意Presto中函数名的不同(例如,Presto中使用`RADIANS`,而MySQL中使用`PI()/180`进行转换)。总结:在Presto中,使用Haversine公式计算两个经纬度点之间的距离,可以直接使用上述SQL表达式。 §§相关问题§§1.在Presto中如何优化大量经纬度距离计算?2.除了Haversine公式,还有哪些计算地球表面两点距离的方法? 3.如何将Presto中的距离计算结果转换为其他单位(如英里)?</think>### 在 Presto计算经纬度距离 在 Presto 中使用 SQL 计算两个经纬度点之间的距离,推荐采用 **Haversine 公式**,这是地理距离计算的标准方法。公式如下: $$d = 2r \cdot \arcsin\left(\sqrt{\sin^2\left(\frac{\Delta\phi}{2}\right) + \cos(\phi_1) \cos(\phi_2) \sin^2\left(\frac{\Delta\lambda}{2}\right)}\right)$$ 其中: - $r$ 是地球半径(约 6371 公里) - $\phi_1, \phi_2$ 是两点的纬度(弧度) - $\lambda_1, \lambda_2$ 是两点的经度(弧度) - $\Delta\phi = \phi_2 - \phi_1$ - $\Delta\lambda = \lambda_2 - \lambda_1$ #### Presto SQL 实现代码: ```sql SELECT -- 输入参数(示例值): -73.935242 AS lon1, 40.730610 AS lat1, -- 纽约坐标 -118.243683 AS lon2, 34.052235 AS lat2, -- 洛杉矶坐标 -- 计算距离(单位:公里) 6371 * 2 * ASIN( SQRT( POW(SIN(RADIANS(lat2 - lat1) / 2), 2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * POW(SIN(RADIANS(lon2 - lon1) / 2), 2) ) ) AS distance_km ``` #### 关键说明: 1. **函数说明**: - `RADIANS()`:将角度转换为弧度 - `SIN()/COS()/ASIN()`:三角函数计算 - `SQRT()/POW()`:平方根和幂运算 2. **单位转换**: - 结果单位为公里,如需米则乘以 1000: ```sql ... * 1000 AS distance_meters ``` - 转换为英里(1 公里 ≈ 0.621371 英里): ```sql ... * 0.621371 AS distance_miles ``` 3. **精度说明**: - 平均精度误差约 0.3%,适用于大多数场景 - 如需更高精度可用 [Vincenty 公式](https://en.wikipedia.org/wiki/Vincenty%27s_formulae),但计算更复杂 #### 实际应用示例: ```sql -- 计算表中每个地点与目标点的距离 SELECT store_id, store_name, 6371 * 2 * ASIN( SQRT( POW(SIN(RADIANS(store_lat - 34.052235) / 2), 2) + COS(RADIANS(34.052235)) * COS(RADIANS(store_lat)) * POW(SIN(RADIANS(store_lon - (-118.243683)) / 2), 2) ) ) AS distance_km FROM stores WHERE distance_km <= 10 -- 筛选10公里内的地点 ORDER BY distance_km; ``` > **注意**:经纬度需为十进制度数(DD),如 `40.7128°N` 应输入 `40.7128`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值