Hadoop 分布式文件系统 -- 导入和导出数据

说明:该文章所有内容截选自实验楼教程【Hadoop 分布式文件系统 — 导入和导出数据】~

一、实验介绍

在一个经典的数据架构中,Hadoop 是处理复杂数据流的核心。数据往往是从许多分散的系统中收集而来,并导入 Hadoop 分布式文件系统(HDFS)中,然后通过 MapReduce 或者其他基于 MapReduce 封装的语言(如Hive、Pig 和 Cascading 等)进行处理,最后将这些已经过滤、转换和聚合过的结果导出到一个或多个外部系统中。

举个比较具体的例子,一个大型网站可能会做一些关于网站点击率的基础数据分析。从多个服务器中采集页面访问日志,并将其推送到 HDFS 中。启动一个 MapReduce 作业,并将这些数据作为 MapReduce 的输入,接下来数据将被解析、汇总以及与 IP 地址进行关联计算,最终得出 URL、页面访问量和每个 cookie 的地理位置数据。生成的相关结果可以导入关系型数据库中。即席查询(Ad-hoc query)此时就可以构建在这些数据上了。分析师可以快速地生成各种报表数据,例如,当前的独立用户数、用户访问最多的页面、按地区对用户进行拆分及其他的数据汇总。

本节的重点将关注 HDFS 数据的导入与导出,主要内容包含与本地文件系统、关系数据库、NoSQL 数据库、分布式数据库以及其他 Hadoop 集群之间数据的互相导入和导出。

1.1 实验知识点

  • 使用 Hadoop shell 命令导入和导出数据到 HDFS
  • Pig 脚本来演示下 getmerge 命令的功能
  • 使用 distcp 实现集群间数据复制
  • 使用 Sqoop 从 MySQL 数据库导入数据到 HDFS
  • 使用 Sqoop 从 HDFS 导出数据到 MySQL

1.2 实验环境

  • Hadoop-2.6.1
  • Sqoop-1.4.5
  • mysql
  • Xfce终端

1.3 适合人群

本课程难度为中等,适合具大数据基础的用户,如果对数据存储 模块有了解会更快的上手。

二、实验部分

注意:实验楼环境里已经下载并安装 hadoop,及配置了环境变量,您只需要做以下步骤。

su hadoop
#hadoop 密码是 hadoop
hadoop namenode -format 
#格式化后会最下面出现下面提示才表征格式化成功
#17/05/18 08:47:25 INFO common.Storage: Storage directory #/home/hadoop/tmp/dfs/na
#me has been successfully formatted.....

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

#启动 hadoop,并用 jps 检查是否启动进程
start-all.sh
jps

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

2.1 使用 Hadoop shell 命令导入和导出数据到 HDFS

HDFS 提供了许多 shell 命令来实现访问文件系统的功能,这些命令都是构建在 HDFS FileSystem API 之上的。Hadoop 自带的 shell 脚本是通过命令行来执行所有操作的。这个脚本的名称叫做 hadoop,通常安装在$HADOOP_BIN目录下,其中$HADOOP_BIN是 hadoop/bin 文件完整的安装目录,同时有必要将 $HADOOP_BIN 配置到 $PATH 环境变量中,这样所有的命令都可以通过 hadoop fs -command 这样的形式来执行。

如果需要获取文件系统的所有命令,可以运行 hadoop 命令传递不带参数的选项 fs。

hadoop fs 

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

这些按照功能进行命名的命令的名称与 Unix shell 命令非常相似。使用 help 选项可以获得某个具体命令的详细说明。

hadoop fs –help ls

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

这些 shell 命令和其简要的参数描述可在官方在线文档 http://hadoop.apache.org/docs/r2.6.1/hadoop-project-dist/hadoop-common/FileSystemShell.html 中进行查阅。

在这一节中,我们将使用 Hadoop shell 命令将数据导入HDFS 中,以及将数据从 HDFS 中导出。这些命令更多地用于加载数据,下载处理过的数据,管理文件系统,以及预览相关数据。掌握这些命令是高效使用 HDFS 的前提。

操作步骤:

你需要在实验楼网站上下载数据集 weblog_entries.txt

sudo wget  http://labfile.oss.aliyuncs.com/courses/832/weblog_entries.txt

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

1).在 HDFS 中创建一个新文件夹,用于保存 weblog_entries.txt 文件:

hadoop fs -mkdir  -p /data/weblogs

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

2).将 weblog_entries.txt 文件从本地文件系统复制到 HDFS 刚创建的新文件夹下:

hadoop fs -copyFromLocal weblog_entries.txt /data/weblogs

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

3).列出 HDFS 上 weblog_entries.txt 文件的信息:

hadoop fs -ls /data/weblogs/weblog_entries.txt

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

工作原理:

Hadoop shell 非常轻量地封装在 HDFS FileSystem API 之上。在执行 hadoop 命令时,如果传进去的参数是 fs,实际上执行的是 org.apache.hadoop.fs.FsShell 这个类。在0.20.2版本中FsShell实例化了一个org.apache.hadoop.fs.FileSystem 对象,并且将命令行参数与类方法映射起来。比如,执行hadoop fs –mkdir /data/weblogs 相当于调用FileSystem.mkdirs(new Path("/data/weblogs"))。同样,运行hadoop fs –copyFromLocal weblog_entries.txt /data/weblogs相当于在调用FileSystem.copyFromLocal(newPath("weblog_entries.txt"), new Path("/data/weblogs"))。HDFS数据复制到本地系统的实现方式也是一样,等同于调用 FileSystem.copyToLocal(newPath("/data/weblogs/ weblog_entries.txt"), new Path("./weblog_entries.txt"))

更多关于文件系统的接口信息描述可以见官方文档:官方文档

mkdir 可以通过 hadoop fs -mkdir PATH1 PATH2 的形式来执行。例如,hadoop fs –mkdir /data/weblogs/20160511 /data/weblogs/20160501 将会在 HDFS 系统上分别创建两个文件夹 /data/weblogs/20160511 和 /data/weblogs/20160501。如果文件夹创建成功则返回0,否则返回-1。

hadoop fs -mkdir /data/weblogs/20160511 /data/weblogs/20160501
hadoop fs -ls /data/weblogs

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

copyFromLocal 可以通过 hadoop fs –copyFromLocal LOCALFILEPATH URI 的形式来执行,如果 URI 的地址(指的是HDFS://filesystemName:9000这个串)没有明确给出,则默认会读取core-site.xml 中的 fs.default.name 这个属性。上传成功返回0,否则返回-1。

copyToLocal 命令可以通过 hadoop fs –copyToLocal [-ignorecrc] [-crc] URILOCAL_FILE_PATH的形式来执行。如果 URI 的地址没有明确的给出,则默认会读取 core-site.xml 中的 fs.default.name 这个属性。copyToLocal 会执行CRC(Cyclic Redundancy Check)校验保证已复制的数据的正确性,一个失败的副本复制可以通过 参数 –ignorecrc 来强制执行,还可以通过 -crc 参数在复制文件的同时也复制 crc 校验文件。

上文介绍的getcopyToLocal只能对文件进行复制,无法对整个文件夹进行复制。当然 Hadoop 提供了getmerge 命令,可以将文件系统中的多个文件合并成一个单独的文件下载到本地文件系统。

2.2 Pig 脚本来演示下 getmerge 命令的功能

接下来我们将通过 Pig 脚本来演示下 getmerge 命令的功能。
1.下载 Pig 并解压:

cd /opt
#网络可能慢点,需要耐心等待
sudo wget http://mirrors.aliyun.com/apache/pig/pig-0.15.0/pig-0.15.0.tar.gz 
sudo tar xvf  pig-0.15.0.tar.gz 

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

2.配置 pig 环境变量:

sudo vi ~/.bashrc
#下拉到最底部,添加pig路径,注意您打开的.bashrc里面hadoop变量已经添加,此处只需补充pig环境变量即可
export PIG_HOME=/opt/pig-0.15.0
export PIG_CLASSPATH=/opt/hadoop-2.6.1/conf
export HADOOP_HOME=/opt/hadoop-2.6.1

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/hadoop-2.6.1/bin:/opt/hadoop-2.6.1/sbin:/opt/pig-0.15.0/bin

#输入:wq ,保存退出

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

刷新文件使配置生效。

source  ~/.bashrc

3.Pig 演示 getmerge 命令的功能

reduce 输出的数据存储在 HDFS 中,可以通过文件夹的名称来引用。若文件夹作为一个作业的输入,那么该文件夹下的所有文件都会被处理。上文介绍的 getcopyToLocal 只能对文件进行复制,无法对整个文件夹进行复制。当然 Hadoop 提供了 getmerge 命令,可以将文件系统中的多个文件合并成一个单独的文件下载到本地文件系统。
下面 Pig 脚本来演示下getmerge 命令的功能:

weblogs_md5_group_pig.sh 脚本如下:

weblogs = load '/data/weblogs/weblog_entries.txt' as
                (md5:chararray,
                  url:chararray,
                  date:chararray,
                  time:chararray,
                  ip:chararray);

md5_grp = group weblogs by md5 parallel 4;

store md5_grp into '/data/weblogs/weblogs_md5_groups.bcp';


#新建 weblogs_md5_group_pig.sh 脚本
sudo vi weblogs_md5_group_pig.sh
sudo chmod 777 -R weblogs_md5_group_pig.sh
more weblogs_md5_group_pig.sh

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

Pig 脚本可以通过下面的命令行来执行:

cd /opt/pig-0.15.0/bin
#脚本执行时间可能过长,请耐心等待
./pig -f /home/shiyanlou/weblogs_md5_group_pig.sh

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

您可能会遇到如下错误

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

解决办法:继续等待输出,不用任何操作,下图为部分截图。

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

该脚本逐行读取 HDFS 上的 weblog_entries.txt 文件,并且按照 md5 的值进行分组。parallel 是 Pig 脚本用来设置 reduce 个数的方法。由于启动了4个 reduce 任务,所以会在输出的目录 /data/weblogs/weblogs_md5_groups.bcp 中生成4个文件。

注意,weblogs_md5_groups.bcp 实际上是一个文件夹,显示该文件夹的列表信息可以看到:

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

/data/weblogs/weblogs_md5_groups.bcp 中包含4个文件,即 part-r-00000part-r-00001part-r-00002part-r-00003

getmerge 命令可以用来将4个文件合并成一个文件,并且复制到本地的文件系统中,操作完我们可以看到本地文件列表,具体命令如下:

sudo chmod 777 -R /home/shiyanlou/
hadoop fs -getmerge /data/weblogs/weblogs_md5_groups.bcp weblogs_md5_groups.bcp
ll weblogs_md5_groups.bcp

《Hadoop 分布式文件系统 -- 导入和导出数据》 此处输入图片的描述

该教程接下来还有:

  • 2.3 使用 distcp 实现集群间数据复制
  • 2.4 使用 Sqoop 从 MySQL 数据库导入数据到 HDFS
  • 2.5 使用 Sqoop 从 HDFS 导出数据到 MySQL

由于篇幅有限就不全部放出来了,想要查看完整教程的,点击【Hadoop 分布式文件系统 — 导入和导出数据】即可马上查看了~

三、实验总结

本章主要目的是演示 Hadoop shell 命令导入和导出数据到 HDFS,使用 distcp 实现集群间数据复制,Sqoop 在 MySQL 与 HDFS 之间互相导入数据,以及 Pig 脚本测试 getmerge 功能。

点击【Hadoop 分布式文件系统 — 导入和导出数据】即可马上查看完整教程了~

    原文作者:实验楼
    原文地址: https://www.jianshu.com/p/ab1da1ec99c8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞