上传--下载HDFS文件并指定文件物理块的大小
使用hdfs的api接口分别实现从本地上传文件到集群和从集群下载文件到本地。
1)上传文件主要是使用FileSystem类的copyFromLocalFile()方法来实现,另外我们上传文件时可以指定以多大的物理块来存储此文件,使用conf.set("dfs.block.size","8388608")设置物理块大小是8M,此方法第二个参数的单位是字节。另外编译此代码除了需要使用hadoop-core-1.2.1.jar,还需要使用
commons-configuration-1.6.jar包。完整代码如下:
/** * Created with IntelliJ IDEA. * User: hadoop * Date: 16-3-13 * Time: 下午6:31 * To change this template use File | Settings | File Templates. */ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.io.IOException; public class uploadFile { public static void main(String[] args) throws IOException { Configuration conf=new Configuration();//只读取了core.xml文件 //conf.addResource("hdfs-default.xml"); //Long x=conf.get("dfs.block.size") ; conf.set("dfs.block.size", args[0]);//第二个参数的单位是字节,并且是字符串形式 FileSystem fs=FileSystem.get(conf); Path src=new Path(args[1]);//参数是本地文件的绝对路径的字符串形式 Path dst=new Path(args[2]); fs.copyFromLocalFile(src,dst); System.out.println("upload to:"+conf.get("fs.default.name")); } }
例如将本地test目录下的F1k1k文件上传到集群,所使用的命令就是:
hadoop jar uploadFile.jar uploadFile 8388608 /home/hadoop/test/F1k1k /data0313
2)从集群下载文件类似,只需要将copyFromLocalFile()方法改为copyToLocalFile(),只不过代码中src变成了集群路径,dst是本地路径
如下所示:
1 /** 2 * Created with IntelliJ IDEA. 3 * User: hadoop 4 * Date: 16-3-13 5 * Time: 下午6:31 6 * To change this template use File | Settings | File Templates. 7 */ 8 9 import org.apache.hadoop.conf.Configuration; 10 import org.apache.hadoop.fs.FileSystem; 11 import org.apache.hadoop.fs.Path; 12 13 import java.io.IOException; 14 15 public class uploadFile { 16 17 public static void main(String[] args) throws IOException { 18 Configuration conf=new Configuration(); 19 //conf.addResource("hdfs-default.xml"); 20 //Long x=conf.get("dfs.block.size") ; 21 conf.set("dfs.block.size", args[0]); 22 FileSystem fs=FileSystem.get(conf); 23 Path src=new Path(args[1]);//src是集群路径 24 Path dst=new Path(args[2]);//dst是本地路径 25 fs.copyToLocalFile(src,dst); 26 System.out.println("upload to:"+conf.get("fs.default.name")); 27 } 28 }