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

该文章详细介绍了如何在Windows操作系统中配置Hadoop环境,包括设置环境变量和hosts文件,然后展示了如何使用Golang的colinmarc/hdfs库连接到HDFS并进行文件操作,如递归获取目录下的所有文件并下载到本地。
摘要由CSDN通过智能技术生成

1. Windows环境配置

  1. 下载winutils工具

  2. 解压winutils,找到对应hadoop的版本,配置环境变量
    新增HADOOP_HOME
    请添加图片描述

    在Path中添加HADOOP_HOME
    请添加图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值