LoveJW 发表于 2014-11-17 16:38:51

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

之前是用定时器定时从外部取数据然后存到数据库,最后从数据库导入到hdfs,但是现在需求变了,就是希望能在定时器里拿到数据后直接存到hdfs。这怎么java代码实现??
      定时器取到数据-数据库-hdfs
现在 定时器取到数据-hdfs

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

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),必须配置才可以
<property>
      <name>dfs.support.append</name>
      <value>true</value>
</property>



2、API实现

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





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



这有例子,你可以试试
public class PutMerge {


/**
* @param args
*            void
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
   Configuration conf = new Configuration();
      FileSystem hdfs = FileSystem.get(conf);
      FileSystem local = FileSystem.getLocal(conf);
      
      Path inputDir = new Path("/home/du/inout");
      Path hdfsFile = new Path("/myhdfs");
      
      try
      {
            FileStatus[] inputFiles = local.listStatus(inputDir);
            FSDataOutputStream out = hdfs.append(hdfsFile);
            
            for(int i = 0; i < inputFiles.length; i++ )
            {
                System.out.println(inputFiles.getPath().getName());
                FSDataInputStream in = local.open(inputFiles.getPath());
                byte buffer[] = new byte;
                int bytesRead = 0;
                while( (bytesRead = in.read(buffer)) > 0)
                {
                  out.write(buffer, 0, bytesRead);
                }
                in.close();
            }
            out.close();
      }
      catch (IOException e)
      {
            e.printStackTrace();
      }
}


}


LoveJW 发表于 2014-11-25 18:43:33

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

现在可以追加了,但是会报一个创建文件的错。你能看看这个吗?http://www.aboutyun.com/forum.php?mod=viewthread&tid=10195&page=1#pid52769

desehawk 发表于 2014-11-25 18:57:12

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

建议按照我发的那个程序


页: [1] 2
查看完整版本: 关于数据存到hdfs:如何追加内容到hdfs文件