- 数据湖号称新一代数据仓库产品。
- 数据被写进数据湖文件之后会被自动同步到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:写文件
- 用到了PATCH方法,不属于标准的7个HTTP方法。导致无法使用HttpURLConnection发起请求。
- 写文件的步骤:
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,以为覆盖成功了。其实文件内容保持不变。