Golang连接Hadoop递归下载指定目录下的所有文件
package main
import (
"github.com/colinmarc/hdfs"
"log"
"os"
)
func main() {
// 连接Hadoop
client, err := hdfs.New("192.168.1.10:9000")
if err != nil {
log.Println("连接Hadoop失败, error: ", err)
}
// 递归获取hdfs 指定目录下的所有文件
hdfsFiles := []HdfsFile{}
GetHdfsFiles(client, "/data", &hdfsFiles)
if len(hdfsFiles) > 0 {
for _, hdfsFile := range hdfsFiles {
// 在本地磁盘递归创建目录
err := os.MkdirAll("D:\\hdfs-demo"+string(os.PathSeparator)+hdfsFile.FileDir, 0666)
if err != nil {
log.Println("本地路径创建目录:" + hdfsFile.FileDir + "失败, error: " + err.Error())
} else {
// 从hdfs下载文件到本地
err := client.CopyToLocal(hdfsFile.FileDir+"/"+hdfsFile.FileName, "D:\\hdfs-demo"+string(os.PathSeparator)+hdfsFile.FileDir+string(os.PathSeparator)+hdfsFile.FileName)
if err != nil {
log.Println("从hdfs下载:" + hdfsFile.FileDir + "/" + hdfsFile.FileName + "文件失败, error: " + err.Error())
} else {
log.Println("从hdfs下载:" + hdfsFile.FileDir + "/" + hdfsFile.FileName + "文件成功")
}
}
}
} else {
log.Println("在HDFS指定目录没有获取到文件")
}
}
// 递归获取hdfs 指定目录下的所有文件,返回文件路径和文件名
func GetHdfsFiles(client *hdfs.Client, hdfsPath string, hdfsFiles *[]HdfsFile) {
infos, err := client.ReadDir(hdfsPath)
if err != nil {
log.Println("获取Hdfs " + hdfsPath + "目录失败, error: " + err.Error())
}
for _, info := range infos {
path := hdfsPath + "/" + info.Name()
realInfo, err := client.Stat(path)
if err != nil {
log.Println("读取 " + path + " 文件信息失败, error: " + err.Error())
}
// 如果是目录,递归
if realInfo.IsDir() {
GetHdfsFiles(client, path, hdfsFiles)
continue
}
// 不是目录就获取文件路径及文件名
hdfsFile := HdfsFile{}
hdfsFile.FileDir = hdfsPath
hdfsFile.FileName = info.Name()
*hdfsFiles = append(*hdfsFiles, hdfsFile)
}
}
type HdfsFile struct {
FileDir string `json:"fileDir"` // 文件目录
FileName string `json:"fileName"` // 文件名
}