CentOS7下hadoop开发 - hdfs文件导入与导出

文件准备

centOS下安装wget命令html

yum -y install wget

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

hdfs和本地文件相互复制(hadoop shell命令)

一、 在 HDFS 中建立一个新文件夹,用于保存 weblog_entries.txt 文件:node

hadoop fs -mkdir -p /data/weblogsmysql

二、 将 weblog_entries.txt 文件从本地文件系统复制到 HDFS 刚建立的新文件夹下:web

hadoop fs -copyFromLocal weblog_entries.txt /data/weblogssql

三、 列出 HDFS 上 weblog_entries.txt 文件的信息:shell

hadoop fs -ls /data/weblogs/weblog_entries.txt数据库

注意: copyFromLocalcopyToLocal只能复制文件到hdfs(hdfs复制到本地),getmerge则能够把hdfs中文件夹下全部文件合并成一个,复制到本地环境apache

使用 distcp 实现集群间数据复制

准备

  1. 保证复制源和复制目的地可以互相访问服务器

  2. 关闭复制源集群 map 任务的推测机制,能够在配置文件 mapred-site.xml 中将 mapred.map.tasks.speculative.execution 的值设置为 false 来实现,这样就能够避免在 map 任务失败的时候产生任何不可知的行为app

  3. 两个集群之间安装的 Hadoop 版本必须一致

集群间复制文件

1.将集群A的 weblogs 文件夹复制到集群B上:

hadoop distcp hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/weblogs

2.将集群A的 weblogs 文件夹复制到集群B并覆盖已存在文件:

hadoop distcp –overwrite hdfs://namenodeA/data/weblogs hdfs://namenodeB/ data/weblogs

3.同步集群A和集群B之间的 weblogs 文件夹:

hadoop distcp –update hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/ weblogs

distcp工做原理

在原集群,文件夹中的内容将被复制为一个临时的大文件。将会启动一个只有map(map-only)的 MapReduce 做业来实现两个集群间的数据复制。默认状况下,每一个 map 就将会分配到一个256 MB 的数据块文件。举个例子,若是 weblogs 文件夹总大小为10 GB,默认将会启动40个 map,每一个 map 会复制大约256 MB的数据。distcp 复制也能够经过参数手动设置启动的 map 数量。

hadoop distcp –m 10 hdfs://namenodeA/data/weblogs hdfs://namenodeB/data/ weblogs 在上面这个例子中,将会启动10个 map 进行数据复制。若是weblogs文件夹的总大小是10 GB,那么每一个 map 会复制大约1 GB的数据。 若是要在运行的 Hadoop 版本不同的两个集群之间进行数据复制,通常建议在复制源集群使用 HftpFileSystem。HftpFileSystem 是一个只读的文件系统。相应的 distcp 命令只能在目标服务器上运行:

hadoop distcp hftp://namenodeA:port/data/weblogs hdfs://namenodeB/data/ weblogs 在上面这条命令中,port的值要与配置文件hdfs-site.xml中dfs.http.address属性的端口值一致。

Sqoop 从 MySQL 数据库导入数据到 HDFS

准备:

安装配置Sqoop 与Mysql 驱动

下载并安装 Sqoop,及配置了环境变量 下载 Mysql 驱动,并 将 MySQL JDBC 驱动包复制到 $SQOOP_HOME/lib 目录下

注意:sqoop版本是后面带Hadoop的,否则运行时 会提示找不到Sqoop主类

列出 MySql 中全部数据库

./sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password 123456

把hive数据库version表数据导入到 HDFS 中

进入SQOOP_HOME目录

./bin/sqoop import --connect jdbc:mysql://localhost:3306/hive --username root -P --table version --target-dir /data/weblogs/import --delete-target-dir --class-name version --bindir ./bin

查看hdfs导入的数据

默认状况下,导入的数据将按主键进行分割。若是导入的表并不包含主键,必须指定 -m或者--split-by参数决定导入的数据如何分割。在前面的例子中,使用了-m参数。-m参数决定了将会启动多少个 mapper 来执行数据导入。由于将-m设置为1,因此就启动了一个 mapper 用于导入数据。每一个 mapper 将产生一个独立的文件。

Sqoop 从 HDFS 导出数据到 MySQL

./bin/sqoop export --connect jdbc:mysql://172.18.0.104:3306/irdms_test  --username irdms --password irdms --table weblogs_from_hdfs --export-dir '/data/weblogs/weblog_entries.txt'  --input-fields-terminated-by  '\t'   --bindir ./bin/  -m 1

参考资料

http://hadoop.apache.org/docs/r2.6.1/hadoop-project-dist/hadoop-common/FileSystemShell.html#copyFromLocal

http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_large_objects

相关文章
相关标签/搜索