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"` // 文件名 }