JDK HTTPS 400/403错误 & 微软数据湖数据写入/读取(DataLake Landing Zone API)避坑指南

文章列举了在使用微软Azure数据湖时遇到的四个主要问题:1)landingzoneAPI不支持TLSv1.1,需使用JDK1.8或以上;2)文件内容可能带BOM,解析时需要注意;3)IP访问有白名单限制;4)写文件需使用非标准的PATCH方法,且无法覆盖已存在的文件内容。解决方案包括调整JDK设置,处理BOM头,以及理解写文件的特殊步骤。
摘要由CSDN通过智能技术生成

  1. 数据湖号称新一代数据仓库产品。
  2. 数据被写进数据湖文件之后会被自动同步到landing zone(依据同步频率的设置,大致上会有1-2个小时的延迟),可以通过landing zone API读取文件内容。

坑1:微软Azure数据湖landing zone API不支持TLSv1.1协议

JDK1.7默认使用TLSv1.1,向数据湖服务端发HTTPS GET请求,服务端会返回400错误。微软Azure数据湖产品仅支持TLSv1.2协议
因此,需要要使用JDK1.8及以上版本。
如果非要用1.7,也可以这样:

System.setProperty("https.protocols", "TLSv1.2");
注意JDK1.8高版本

JDK1.8.0_304及以上版本也有个大坑:jdk1.8.0_xxx/jre/lib/security/java.security文件jdk.tls.disabledAlgorithms配置项中,将TLSv1.1列为了禁用项。
使用该版本的JDK,默认将无法与一些仅支持TLSv1.1的SSL服务端建立通信

可以直接删除其中的TLSv1, TLSv1.1 部分。

坑2:拉取的文件内容开头带BOM

以utf-8编码解析返回的文件内容,发现开头2个字节是0xfeff。使用前需要去除BOM。
推荐使用Scanner(String input)类来解析响应字符串。这样不用手动去除头部的BOM。
在这里插入图片描述

坑3:IP限制

有IP白名单限制,不在白名单的访问会报403。
(这个不算坑)

坑4:写文件

  1. 用到了PATCH方法,不属于标准的7个HTTP方法。导致无法使用HttpURLConnection发起请求。
  2. 写文件的步骤:

PUT方法,URL带参resource=file 创建文件
PATCH方法,URL带参action=append&position=0 往文件中追加数据,注意其实只是写到了缓存,并未写入文件。(读取文件长度还是为0)
PATCH方法,URL带参action=flush&position=%s 将缓存中[0,%s)部分刷写到文件中。之后,就可以从文件中读取到内容。

可以多次append到缓存后,一次性flush。假设每次写入的内容长度为100。

action=append&position=0 //写入100个字节
action=append&position=100 //写入100个字节
action=append&position=200//写入100个字节
action=flush&position=300 //前面300个字节,刷入文件
action=append&position=300 // 继续从300位置开始写入缓存
action=append&position=400 // 继续从400位置开始写入缓存
action=flush&position=500  // 将前面500个字节刷入文件

最终文件长度是500。

如果要往已存在的文件追加内容,需要先读出文件长度。

没办法覆盖文件内容

文件一旦flush生成之后,没办法覆盖已存在的文件内容。

  • 尝试重写覆盖文件,如果新的内容长度跟已存在文件的长度不一致直接报400错误。
  • 尝试重写覆盖文件,如果新的内容长度跟已存在文件的长度一致,会返回200,以为覆盖成功了。其实文件内容保持不变。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值