Golang连接Hadoop递归下载指定目录下的所有文件

1. Windows环境配置

  1. 下载winutils工具

  2. 解压winutils,找到对应hadoop的版本,配置环境变量
    新增HADOOP_HOME
    Golang连接Hadoop递归下载指定目录下的所有文件_第1张图片

    在Path中添加HADOOP_HOME
    Golang连接Hadoop递归下载指定目录下的所有文件_第2张图片

  3. 配置hosts文件
    在C:\Windows\System32\drivers\etc目录下找到hosts文件,添加 hadoop服务器IP映射关系。

192.168.1.10   hadoop-master

2. golang 导包

go get -u github.com/colinmarc/hdfs  

3. 代码逻辑

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

你可能感兴趣的:(Hadoop,golang,hadoop,golang,hdfs)