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

来源:互联网 发布:大阪 香港知乎 编辑:程序博客网 时间:2024/05/16 14:54

    一、使用hadoop shell命令导入和导出数据到HDFS
        →1、创建新目录:hadoop fs -mkdir /data/logs/
        →2、从本地复制到HDFS的新目录:hadoop fs -copyFromLocal entries.log /data/logs
        →3、列出HDFS上entries.log文件信息:hadoop fs -ls /data/logs/entries.log
        →4、将HDFS上的entries.log复制到本地当前目录下:hadoop fs -copyToLocal /data/logs/entries.log ./entries.log
        →5、copyFromLocal与put命令类似,put更通用;copyToLocal与get命令的实现完全一样。
        →6、MapReduce的输出结果可能是一个或者多个,最终输出结果的文件个数是由mapred.reduce.tasks的值决定的。可以通过Jobconf类中的setNumReduceTasks()方法来设置。该参数是客户端参数,非集群参数,默认值为1。官方推荐的设置公式为:0.95 * NUMBER_OF_NODES * mapred.tasktracker.reduce.maximum,或者是1.75 * NUMBER_OF_NODES * mapred.tasktracker.reduce.tasks.maximum。0.95可以保证在map结束后可以立即望去所有的reduce;1.75使得运行比较快的reducer能够再执行第二波reduce,保证两波reduce就能完成作业,使作业整体的负载均衡保持得比较好。
        →原理简析: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/logs/相当于调用了FileSystem.mkdirs(new Path(“/data/logs/”))。

    二、使用distcp实现集群间数据复制
        distcp是通过启动MapReduce实现数据复制的。使用MapReduce的好处包含可并行性、高容错性、作业恢复、日志记录、进度汇报。
        操作前,最好关闭复制源集群map任务的推测机制,可以在配置文件mapred-site.xml中将mapred.map.tasks.speculative.execution的值设置为false来实现。同时,要保证两个集群之间的hadoop版本完全一致,即保证RPC协议必须一致。
        →1、将集群A的logs文件夹复制到集群B上:hadoop distcp hdfs://namenodeA/data/logs hdfs://namenodeB/data/logs
        →2、将集群A的logs文件夹得到集群B上,并覆盖已存在的文件:hadoop distcp -overwrite hdfs://namenodeA/data/logs hdfs://namenodeB/logs
        →3、同步集群A和集群B之间的logs文件夹:hadoop distcp -update hdfs://namenodeA/data/logs hdfs://namenodeB/data/logs
        →注意,如果要在运行的hadoop版本不一的两个集群之间进行数据复制,一般在复制源集群使用HftpFileSystem。HftpFileSystem是一个只读的文件系统。相应的distcp命令只能在目标服务器上运行:hadoop distcp hftp://namenodeA:port/data/logs hdfs://namenodeB/data/logs。小心,这条命令中的port值要与配置文件hdfs-site.xml中的dfs.http.address属性的端口值一致。
        →原理简析:在源集群,文件夹中的内容将被复制为一个临时的大文件。将会启动一个只有map(map-only)的MapReduce作业来实现两个集群间的数据复制。默认情况下,每个map将会分配到一个256MB的数据块文件。distcp复制可通过设置参数手动启动map的数量,如hadoop distcp -m 10 hdfs://a/ hdfs://b/

    三、使用Sqoop从MySQL数据库导入数据到HDFS
        Sqoop是Apache基金下的一个项目,是庞大hadoop生态圈中的一部分。与distcp类似,都是建立在MapReduce之上的,利用了MapReduce的并行性和容错性。与集群间的数据复制不同,Sqoop设计通过JDBC驱动连接实现hadoop集群与关系数据库之间的数据复制。
        →1、将MySQL JDBC驱动包复制到$SQOOP_HOME/libs目录下。
        →2、在MySQL实例中创建一个新数据库:create database logs。
        →3、创建并载入表web_logs:
          use logs;
          create table web_logs (md5 varchar(32), url varchar(64), request_date date, request_time time, ip varchar(15));
          load data infile ‘/path/entries.log’ into table web_logs fields terminated by ‘\t’ lines terminated by ‘\r\n’。
        →4、查询web_logs表的行数:mysql > select count(*) from web_logs
        →5、将MySQL数据导出到HDFS:sqoop import -m 1 –connect jdbc:mysql://:/logs –username hdp_usr –password 123456 –table web_logs –target-dir /data/logs/import
        →工作原理:默认情况下,导入的数据将按主键进行分割。如果导入的表并不包含主键,必须指定-m或者–split-by参数决定导入的数据如何分割。Sqoop利用数据库中存储的元数据生成每一列的DBWritable类,这些类使用了DBInputFormat。DBInputFormat是Hadoop用来格式化读取数据库任意查询的结果。

    四、使用Sqoop从HDFS导出数据到MySQL
        →1、在MySQL实例中创建一个新数据库:create database logs;
        →2、创建表web_logs_from_hdfs:
          use logs;
          create table web_logs_from_hdfs (md5 varchar(32), url varchar(64), request_date date, request_time time, ip varchar(15));
        →3、从HDFS导出entries.log文件到MySQL:sqoop export -m 1 –connect jdbc:mysql://:/logs –username hdp_usr –password 123456 –table web_logs_from_hdfs –export-dir /data/logs/ –input-fields-terminated-by ‘\t’ –mysql-delmiters
        →Sqoop export默认情况下是创建新增语句。如果–update-key参数被设置,则将是创建更新语句。如果–update-key设置的值并没找到,可以设置–update-mode为allowinsert允许新增这行数据。-m参数决定将配置几个mapper来读取HDFS上文件块。设置参数–staging-table,会促使任务将数据插入一个临时表,等待一个事务完成再将数据从临时表复制到–table参数配置的表中。临时表必须是一个空表,否则需要配置参数–clear-staging-table。

    五、从HDFS导出数据到MongoDB
        先从github上克隆Mongo-Hadoop工程,并且将该工程编译到一个特定的Hadoop版本,编译完的JAR文件需要复制到Hadoop集群每个节点的HADOOPHOME/libMongoJavaHadoopHADOOP_HOME/lib。
        →1、通过下面的命令实现克隆mongo-hadoop工程:git clone https://github.com/mongodb/mongo-hadoop.git
        →2、切换到稳定发布的1.0分支版本:git checkout release-1.0
        →3、必须保持mongo-hadoop与Hadoop版本一致。将mongo-hadoop目录下的build.sbt文件中hadoopRelease in ThisBuild := “default”,修改为hadoopRelease in ThisBuild := “cdh3”
        →4、编译mongo-hadoop:./sbt package。会生一个Jar
        →5、从https://github.com/mongodb/mongo-java-driver/downloads下载MongoDB的Java驱动包
        →6、复制mongo-hadoop和MongoDB Java驱动包到Hadoop集群每个节点的HADOOPHOME/lib:cp1.jar2.jarHADOOP_HOME/lib
        →7、编写MapReduce读取HDFS上entires.log文件并通过MongoOutputFormat类将数据写入MongoDB中。
        →8、将第7步所写的java程序导出为一个可运行的jar文件,并运行该作业:hadoop jar xxxx.jar
        →9、在Mongo shell上验证weblogs已经导入MongoDB:db.weblogs.find()

    六、从MongoDB导入数据到HDFS
        前六步与8、9两步,与第五的一致。
        →7、编写MapReduce读取MongoDB数据库中的数据并写入HDFS中。

    七、使用Pig从HDFS导出数据到MongoDB
        →前五步,与第五个一致。
        →6、复制mongo-hadoop-core、mongo-hadoop-pig和MongoDB Java驱动包到Hadoop集群每个节点的$HADOOP_HOME/lib目录下。
        →7、创建一个Pig脚本读取HDFS上的weblogs数据,并将其存储到MongoDB数据库:

register /path/to/mongo-hadoop/mongo-2.8.0.jarregister /path/to/mongo-hadoop/core/target/mongo-hadoop-core-1.0.0.jarregister /path/to/mongo-hadoop/pig/target/mongo-hadoop-pig-1.0.0.jardefine MongoStorage com.mongodb.hadoop.pig.MongoStorage()weblogs = load '/data/logs/entires.log' as (md5:chararray, url:chararray, date:chararray, time:chararray, ip:chararray)store web_logs into 'mongodb://<HOST>:<PORT>/test.weblogs_from_pig' using MongoStorage()

    八、利用Flume加载数据到HDFS中
        →1、使用dump命令测试Flume是否配置正确:flume dump ‘text(“/path/to/entries.log”)’
        →2、通过flume shell执行一个配置:flume shell -c: -e ‘exec config text(“/path/to/entries.log”) | collectorSink(“hdfs://:/data/logs/flume”)’
        →原理简析:Flume包含Sources和Sinks两个抽象概念,并通过管状的数据流将它们合并在一起。

0 0
原创粉丝点击