0
点赞
收藏
分享

微信扫一扫

【C语言】经典题目(二)

斗米 2023-05-30 阅读 98

这是一个巨大的坑,网上对这块的完整描述真的很少,新手真的会很迷茫!!!

插件

选择插件

reader插件选择:ftpread

write插件选择:hdfswrite

参数配置

reader参数

"parameter": {
//选择要导入的列所有用*,如果要指定{"index":0,"type":"string"}
"column": [
"*"
],
//编码格式
"encoding": "UTF-8",
//分隔符
"fieldDelimiter": "\t",
//ftp服务器ip
"host": "172.XXX.XXX.XXX",
//ftp连接用户、密码
"username": "ftp"
"password": "***",
//ftp导入文件目录(坑1)
"path": [
"/upload/tmp2.csv"
],
//ftp连接port
"port": 21,
//ftp连接协议
"protocol": "ftp",
//是否跳过首行
"skipHeader": true,

}

write参数

"parameter":{
//导入的列名
"column": [
{
"name": "id",
"type": "STRING"
},
{
"name": "name",
"type": "STRING"
},
{
"name": "address",
"type": "STRING"
}
],
//压缩类型
"compress": "",
//hdfs连接
"defaultFS": "hdfs://172.XXX.XXX.XXX:XXXX",
//分隔符
"fieldDelimiter": "\u0001",
//表名
"fileName": "ftp_test_001",
//数据文件格式
"fileType": "text",
"nullFormat": "\\N",
//数据文件地址
"path": "/user/hive/warehouse/ftp.db/ftp_test_001",
//写入模式
"writeMode": "append"
}

遇到的问题

坑1 不知道ftp的path要填什么

刚搭建完ftp,还不知道怎么用,所以这个地方完全无从下手。

只能通过windows的命令窗连接一下ftp,尝试使用功能增加了解

 

使用ls命令发现下面的目录和linux的”/var/ftp“下的目录是一样的

 

 linux:

 同时根据官网的描述,推测这里的path写的就是从ftp之后开始算起

所以我上面配置的是”/upload/tmp2.csv“(为什么是upload后面再讲)

坑2 执行datax任务,一直报错NullPointerException

 

 这里简直是神坑!完全不知道为什么,只能一点一点展开排查。

首先排查是否有必填字段没写。(这点可以从官网看)我这里是吧必填的都写了。

然后还是找不到原因,只能打开源码,看一下出错的地方。

找到了大致的报错点如图

所以就推测是不是inputStream是null所以报了空指针的异常。 

于是写了一个简单的用Java连接ftp获取文件的demo,发现果然传”/pub/tmp2.csv“会返回null。

于是通过windows的命令窗get 一下这个tmp2.csv,发现报错

基本问题已经锁定了,就是这里获取不到文件。

获取不到文件的原因一般就是两个

1. 路径没配对

2. 权限问题

基于上面的推测1不太可能了,只有可能是权限的问题。

然后网上找了很多关于ftp权限的帖子

1. 

但是试过了不行

2. 

依然不行

3. 最后

看到了这样的一个帖子,他解决的是无法上传,我是无法下载,我觉得问题很像,他的修改内容主要是

ftp:x:107:65534::/var/ftp:/bin/false

ftp目录为/var/ftp

chown root:root /var/ftp

chmod -R 777 /var/ftp

但这样是不能上传文件的。因为这是匿名用户,当前目录所有者是root用户; 真的要上传文件在该目录下建立一个文件夹如名字是upload,

mkdir /var/ftp/upload

chown ftp:root /var/ftp/upload

于是就创建了一个新的upload目录(这就是为什么我得脚本用的是‘/upload/tmp2.csv’),然后修改了这个目录的权限给ftp用户。

然后我在命令窗里执行了一下get命令

 

于是终于不报空指针了,我马上去运行datax脚本,开始报新的错误!

居然连接不上了,我赶紧重新命令框连接,连接失败。

 

  别看他连接失败了,但感觉要好起来了。于是开始解决这个连接不上了的问题。

坑3 ftp 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

这个问题看起来还是权限的问题,根据网上的帖子修改了vsftpd.conf文件

但依然不行。

网上很多是这样说的,这时我注意到了标红的地方

这时候想起了坑2中把/var/ftp的权限改成了777,推测可能是这个原因,于是就改成755

于是再次尝试连接,成功啦!撒花!

 运行一下datax任务,也执行成功啦!

总结

解决这个问题正常的步骤(有些可能是多余配置,成功后我就没仔细的验证每个配置对本次修改的影响范围)

接下来我要研究这两个插件的参数具体可以控制什么细节了,以上只能让任务跑通。

最后附上我得vsftpd.conf以及datax的任务json

vsftpd.conf

anonymous_enable=YES
local_enable=YES
write_enable=YES

allow_writeable_chroot=YES

local_umask=022
anon_umask=022

allow_ftpd_full_access
anon_upload_enable=YES


anon_mkdir_write_enable=YES
anon_other_write_enable=YES

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=NO

listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES

tcp_wrappers=YES

datax.json

{
"job": {
"content": [
{
"reader": {
"name": "ftpreader",
"parameter": {
"host": "172.XXX.XXX.XXX",
"port": 21,
"username": "ftp",
"password": "123",
"protocol": "ftp",
"path": [
"/upload/tmp2.csv"
],
"fieldDelimiter": "\t",
"encoding": "UTF-8",
"column": [
"*"
],
"skipHeader": true
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://172.XXX.XXX.XXX:8020",
"writeMode": "append",
"fieldDelimiter": "\u0001",
"fileType": "text",
"compress": "",
"path": "/user/hive/warehouse/ftp.db/ftp_test_001",
"fileName": "ftp_test_001",
"nullFormat": "\\N",
"column": [
{
"name": "id",
"type": "STRING"
},
{
"name": "name",
"type": "STRING"
},
{
"name": "address",
"type": "STRING"
}
]
}
}
}
],
"setting": {
"speed": {
"channel": 1
}
}
}
}
举报

相关推荐

0 条评论