文件准备
centOS下安装wget命令
yum -y install wget
wget http://labfile.oss.aliyuncs.com/courses/832/weblog_entries.txt
hdfs和本地文件相互复制(hadoop shell命令)
1、 在 HDFS 中创建一个新文件夹,用于保存 weblog_entries.txt 文件:
hadoop fs -mkdir -p /data/weblogs
2、 将 weblog_entries.txt 文件从本地文件系统复制到 HDFS 刚创建的新文件夹下:
hadoop fs -copyFromLocal weblog_entries.txt /data/weblogs
3、 列出 HDFS 上 weblog_entries.txt 文件的信息:
hadoop fs -ls /data/weblogs/weblog_entries.txt
注意: copyFromLocal和copyToLocal只能复制文件到hdfs(hdfs复制到本地),getmerge则可以把hdfs中文件夹下所有文件合并成一个,复制到本地环境
使用 distcp 实现集群间数据复制
准备
- 保证复制源和复制目的地能够互相访问
- 关闭复制源集群 map 任务的推测机制,可以在配置文件 mapred-site.xml 中将 mapred.map.tasks.speculative.execution 的值设置为 false 来实现,这样就可以避免在 map 任务失败的时候产生任何不可知的行为
- 两个集群之间安装的 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://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_large_objects