分享

关于数据存到hdfs:如何追加内容到hdfs文件

LoveJW 发表于 2014-11-17 16:38:51 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 10 94122
之前是用定时器定时从外部取数据然后存到数据库,最后从数据库导入到hdfs,但是现在需求变了,就是希望能在定时器里拿到数据后直接存到hdfs。这怎么java代码实现??
        定时器取到数据-数据库-hdfs
现在 定时器取到数据-hdfs

我查了一些,说调用hdfs的java api,但是api里 不还是需要先创建文件,然后把文件上传到hdfs吗?

已有(10)人评论

跳转到指定楼层
pig2 发表于 2014-11-17 16:48:31

从数据库到hdfs,确实多走弯路了,直接用下面两个命令可以实现。当然如果多个文件或则目录,需要自己用shell把下面命令做一些处理

put
使用方法:hadoop fs -put <localsrc> ... <dst>
从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。
  • hadoop fs -put localfile /user/hadoop/hadoopfile
  • hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
  • hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
  • hadoop fs -put - hdfs://host:port/hadoop/hadoopfile
    从标准输入中读取输入。
返回值:
成功返回0,失败返回-1。



copyFromLocal
使用方法:hadoop fs -copyFromLocal <localsrc> URI
除了限定源路径是一个本地文件外,和put命令相似。


来源
Hadoop Shell命令字典(可收藏)
回复

使用道具 举报

LoveJW 发表于 2014-11-17 16:55:01
pig2 发表于 2014-11-17 16:48
从数据库到hdfs,确实多走弯路了,直接用下面两个命令可以实现。当然如果多个文件或则目录,需要自己用she ...

也不是从本地上传,数据也不在本地。而是定时器一直再跑,拿到map格式的数据,不经过本地,就是怎么在定时器拿到数据就放直接到hdfs?
回复

使用道具 举报

pig2 发表于 2014-11-17 17:13:06
LoveJW 发表于 2014-11-17 16:55
也不是从本地上传,数据也不在本地。而是定时器一直再跑,拿到map格式的数据,不经过本地,就是怎么在定 ...
可以描述的在清晰些,既然能拿到数据,不使用shell的方式也可以,通过Java api也可以实现。

参考:
hadoop实战:Java对hdfs的编程
回复

使用道具 举报

pig2 发表于 2014-11-17 17:18:10

下面也可以参考
HDFS的Java访问接口


Java创建hdfs文件实例


回复

使用道具 举报

LoveJW 发表于 2014-11-17 18:01:29
本帖最后由 LoveJW 于 2014-11-17 18:03 编辑
pig2 发表于 2014-11-17 17:18
下面也可以参考
HDFS的Java访问接口

刚才打不开网站了, 就是用java代码 我定时器拿到数据就放到hdfs上。是追加的形式,因为hdfs上已经有表文件存在了 我要往里面追加数据,而且我拿到数据是map格式的 我怎么转换成hdfs上的数据格式 ,比如分隔符用|
回复

使用道具 举报

pig2 发表于 2014-11-17 18:42:25
LoveJW 发表于 2014-11-17 18:01
刚才打不开网站了, 就是用java代码 我定时器拿到数据就放到hdfs上。是追加的形式,因为hdfs上已经有表文 ...
HDFS中文件可以追加写,步骤如下:

1、配置集群(hdfs-site.xml),必须配置才可以
  1.   <property>
  2.         <name>dfs.support.append</name>
  3.         <value>true</value>
  4.   </property>
复制代码




2、API实现

  1. String hdfs_path= "hdfs://ip:xx/file/fileuploadFileName";//文件路径
  2. Configuration conf = new Configuration();
  3. FileSystem fs = FileSystem.get(URI.create(hdfs_path), conf);
  4. InputStream in = new BufferedInputStream(new FileInputStream(file));//要追加的文件流,file为文件
  5. OutputStream out = fs.append(new Path(hdfs_path));
  6. IOUtils.copyBytes(in, out, 4096, true);
复制代码





回复

使用道具 举报

desehawk 发表于 2014-11-25 18:39:30


这有例子,你可以试试
  1. public class PutMerge {
  2. /**
  3. * @param args
  4. *            void
  5. * @throws IOException
  6. */
  7. public static void main(String[] args) throws IOException {
  8. // TODO Auto-generated method stub
  9.    Configuration conf = new Configuration();
  10.         FileSystem hdfs = FileSystem.get(conf);
  11.         FileSystem local = FileSystem.getLocal(conf);
  12.         
  13.         Path inputDir = new Path("/home/du/inout");
  14.         Path hdfsFile = new Path("/myhdfs");
  15.         
  16.         try
  17.         {
  18.             FileStatus[] inputFiles = local.listStatus(inputDir);
  19.             FSDataOutputStream out = hdfs.append(hdfsFile);
  20.             
  21.             for(int i = 0; i < inputFiles.length; i++ )
  22.             {
  23.                 System.out.println(inputFiles[i].getPath().getName());
  24.                 FSDataInputStream in = local.open(inputFiles[i].getPath());
  25.                 byte buffer[] = new byte[1024];
  26.                 int bytesRead = 0;
  27.                 while( (bytesRead = in.read(buffer)) > 0)
  28.                 {
  29.                     out.write(buffer, 0, bytesRead);
  30.                 }
  31.                 in.close();
  32.             }
  33.             out.close();
  34.         }
  35.         catch (IOException e)
  36.         {
  37.             e.printStackTrace();
  38.         }
  39. }
  40. }
复制代码



回复

使用道具 举报

LoveJW 发表于 2014-11-25 18:43:33
desehawk 发表于 2014-11-25 18:39
这有例子,你可以试试

现在可以追加了,但是会报一个创建文件的错。你能看看这个吗?http://www.aboutyun.com/forum.ph ... amp;page=1#pid52769
回复

使用道具 举报

desehawk 发表于 2014-11-25 18:57:12
LoveJW 发表于 2014-11-25 18:43
现在可以追加了,但是会报一个创建文件的错。你能看看这个吗?http://www.aboutyun.com/forum.php?mod=vi ...

建议按照我发的那个程序


回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条