关于数据存到hdfs:如何追加内容到hdfs文件
之前是用定时器定时从外部取数据然后存到数据库,最后从数据库导入到hdfs,但是现在需求变了,就是希望能在定时器里拿到数据后直接存到hdfs。这怎么java代码实现??定时器取到数据-数据库-hdfs
现在 定时器取到数据-hdfs
我查了一些,说调用hdfs的java api,但是api里 不还是需要先创建文件,然后把文件上传到hdfs吗?
从数据库到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命令字典(可收藏)
pig2 发表于 2014-11-17 16:48
从数据库到hdfs,确实多走弯路了,直接用下面两个命令可以实现。当然如果多个文件或则目录,需要自己用she ...
也不是从本地上传,数据也不在本地。而是定时器一直再跑,拿到map格式的数据,不经过本地,就是怎么在定时器拿到数据就放直接到hdfs?
LoveJW 发表于 2014-11-17 16:55
也不是从本地上传,数据也不在本地。而是定时器一直再跑,拿到map格式的数据,不经过本地,就是怎么在定 ...
可以描述的在清晰些,既然能拿到数据,不使用shell的方式也可以,通过Java api也可以实现。
参考:
hadoop实战:Java对hdfs的编程
下面也可以参考
HDFS的Java访问接口
Java创建hdfs文件实例
本帖最后由 LoveJW 于 2014-11-17 18:03 编辑
pig2 发表于 2014-11-17 17:18
下面也可以参考
HDFS的Java访问接口
刚才打不开网站了, 就是用java代码 我定时器拿到数据就放到hdfs上。是追加的形式,因为hdfs上已经有表文件存在了 我要往里面追加数据,而且我拿到数据是map格式的 我怎么转换成hdfs上的数据格式 ,比如分隔符用|
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);
这有例子,你可以试试
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();
}
}
}
desehawk 发表于 2014-11-25 18:39
这有例子,你可以试试
现在可以追加了,但是会报一个创建文件的错。你能看看这个吗?http://www.aboutyun.com/forum.php?mod=viewthread&tid=10195&page=1#pid52769
LoveJW 发表于 2014-11-25 18:43
现在可以追加了,但是会报一个创建文件的错。你能看看这个吗?http://www.aboutyun.com/forum.php?mod=vi ...
建议按照我发的那个程序
页:
[1]
2