使用JAVA API FileSystem.create 创建文件失败

Joshua_Apodemakeles 2017-09-18 10:12:44
新手,完全按照视频教程来操作, 到了用Java API从我本机连接远程创建文件时候,等待时间很长,失败,感觉像是网络导致的超时错误
以下是问题代码

@Test
public void create() throws Exception {
FSDataOutputStream outputStream = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
outputStream.write("hello hadoop".getBytes());
outputStream.flush();
outputStream.close();
}

异常信息贴在最后
以下是一些线索:
1. hadoop伪分布式集群
2. 同样的配置方式,在我本机VM上可以测试通过, 出问题的是在阿里云上实例
3. 阿里云上出问题的这台使用hadoop shell完全没问题,jps显示都在运行,-put 方法可以成功添加文件,在浏览器可以看到,开了8020,后来乱试把8021也打开了
4. 除了create,还测试mkdirs和open方法,都没问题
我错误信息的这句不太理解:
File /hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
不知道为什么会 1node(s) are excluded,excluded是错误的原因还是结果

17/09/18 09:27:41 INFO hdfs.DFSClient: Exception in createBlockOutputStream
java.net.ConnectException: Connection timed out: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:530)
at org.apache.hadoop.hdfs.DFSOutputStream.createSocketForPipeline(DFSOutputStream.java:1962)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1669)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1622)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:773)
17/09/18 09:27:41 WARN hdfs.DFSClient: Abandoning BP-2124473397-172.17.27.58-1505697429586:blk_1073741827_1003
17/09/18 09:27:41 WARN hdfs.DFSClient: Excluding datanode DatanodeInfoWithStorage[172.17.27.58:50010,DS-1b16be95-7c4d-4b75-a4f5-76526271e147,DISK]
17/09/18 09:27:41 WARN hdfs.DFSClient: DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1716)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3385)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:683)
at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.addBlock(AuthorizationProviderProxyClientProtocol.java:214)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:495)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)

at org.apache.hadoop.ipc.Client.call(Client.java:1502)
at org.apache.hadoop.ipc.Client.call(Client.java:1439)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
at com.sun.proxy.$Proxy15.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:413)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:260)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:104)
at com.sun.proxy.$Proxy16.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1814)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1610)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:773)

org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hdfsapi/test/a.txt could only be replicated to 0 nodes instead of minReplication (=1). There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:1716)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3385)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:683)
at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.addBlock(AuthorizationProviderProxyClientProtocol.java:214)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:495)
at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)


at org.apache.hadoop.ipc.Client.call(Client.java:1502)
at org.apache.hadoop.ipc.Client.call(Client.java:1439)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
at com.sun.proxy.$Proxy15.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.addBlock(ClientNamenodeProtocolTranslatorPB.java:413)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:260)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:104)
at com.sun.proxy.$Proxy16.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:1814)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1610)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:773)
...全文
813 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2017-09-21
  • 打赏
  • 举报
回复
a.显示成绩大于80的情况
data score;
input math@@;
cards;
71 81 91
quit;
run;

%let exa=score;

data score2;
set &exa;
if math > 80;
run;

proc print;
title "display of student &exa";
run;

<==>

data score;
input math@@;
cards;
71 81 91
quit;
run;

data score2;
set score;
if math > 80;
run;

proc print;
title "display of student &exa";
run;

b.几个字符长度函数的差别:
length(string): 返回字符长度,只有尾部空格不计数,空字符串与连续空格视为1
lengthn(string):返回字符长度,只有尾部空格不计数,空字符串与连续空格视为0
lengthc(string):返回字符长度,对字符长前后的空格计数,对连续空格计数,空字符串是为1
lengthm(string):返回存储的字节长度,对字符串前后的空格计数,对连续空格计数,空字符串视为1
碧水幽幽泉 2017-09-21
  • 打赏
  • 举报
回复
a.如何使用proc compare比较两个数据集
data one;
input student $ gr1 gr2;
format gr1 5.2;
datalines;
1000 64 87
1001 65 88
1002 66 89
;
run;

data two;
input student $ gr1 gr2;
format gr1 5.2;
datalines;
1000 64 87
1001 65 88
1002 66 89
;
run;

options nodate pageno=1 linesize=80 pagesize=40;
title 'The SAS System';
proc compare base=one compare=two;
run;

data two;
input student $ gr1 gr2;
format gr1 5.2;
datalines;
1000 64 87
1001 65 96
1002 66 92
;
run;
options nodate pageno=1 linesize=80 pagesize=40;
title 'The SAS System';
proc compare base=one compare=two;
run;

b.如何使用SAS逻辑库

要找到我们保存的数据集之前必须清楚一个概念,那就是“SAS逻辑库”。什么是SAS逻辑库?
通俗地讲,就是储存SAS数据集的仓库,当然,SAS逻辑库的定义远不是这样,但是为了方便理解,我暂且把它理解成这样。
其实SAS逻辑库是一个逻辑标识,指向一个物理的地址,我们在使用SAS逻辑库的时候其实就是在使用这个物理地址,
比如说,一个名为mylib的逻辑库,其指向的物理地址为D:\data,那么我们把一个名为mydata的数据集存储在mylib逻辑库中就是把这个数据集文件存储在路径D:\data下了。
有如下需求:
定义一个名为mylib的逻辑库,其物理地址为D:\data。
使用如下代码完成上面的需求:
libname mylib "D:\data";
按F3,运行代码,查看日志,确认代码运行成功。
代码分析:
libname:关键词,用于定义逻辑库;
mylib:逻辑库的名称;
D:\data:逻辑库的物理地址。
逻辑库的分类:
逻辑库分为两种,一种叫做临时逻辑库,一种叫做永久逻辑库。
什么是临时逻辑库呢?就是临时存储SAS数据集的逻辑库,只要SAS程序关闭,该逻辑库就会消失,我们储存在里面的SAS数据集就会被删除,具有代表性的临时逻辑库就是WORK库。
什么是永久逻辑库呢?就是上面已经说到过的用libname语句声明过的逻辑库,该逻辑库内的文件存储在对应的物理地址上,即使SAS关闭也不会丢失文件。
逻辑库的使用:
改写一下上次的代码,
proc import datafile ="D:\data\mydata.xls" dbms = excel out = work.myfile;
sheet = "sheet1";
getnames = no;
run;
我们将输出的数据集myfile保存在临时逻辑库work下。其实上面的代码和上次的代码是等价的,因为在没有指定SAS数据集属于哪个逻辑库时,默认为work临时逻辑库。
也可以改写成如下代码,
libname mylib "D:\data\lib";
proc import datafile ="D:\data\mydata.xls" dbms = excel out = mylib.myfile;
sheet = "sheet1";
getnames = no;
run;
我们将输出的数据集myfile保存在逻辑库mylib下,对应的物理地址为D:\data\lib。
补充说明:
找到SAS软件的资源管理器或浏览器,打开里面的Libraries,我们自己建立的和系统自带的逻辑库都保存在Libraries下。

c.通过实例理解comma的含义:
例如: input x comma9.2 --放入x的变量值,数据行占到第九列,保留两位有效数字

举例说明:
data a;
input x comma2.2;
datalines;
125 354 215 305
;
proc print;
run;
在log中输出结果为:0.125

data a;
input x comma3.2;
datalines;
125 354 215 305
;
proc print;
run;
在log中输出结果为:1.25

data a;
input x comma4.2;
datalines;
125 354 215 305
;
proc print;
run;
在log中输出结果为:1.25

data a;
input x comma5.2;
datalines;
125 354 215 305
;
proc print;
run;
在log中输出结果为:12.53

data a;
input x comma6.2;
datalines;
125 354 215 305
;
proc print;
run;
在log中输出结果为:125.35

data a;
input x comma7.2;
datalines;
125 354 215 305
;
proc print;
run;
在log中输出结果为:1253.54
碧水幽幽泉 2017-09-21
  • 打赏
  • 举报
回复
a.行保持说明符@和@@用法举例
行保持说明符@和@@:
多个input语句读取同一数据行的数据,使用单尾随符@
一个input语句在一个输入行中读取多个观测,则使用双尾随符@@

例1:
data b;
*input x y @;
input x y @@;
datalines;
3.16 2.9 5.8 3 4.9 4.17
;
proc print;
run;

例2:
data aa;
*input xxx @;
input xxx @@;
cards;
1 2 3
4 5 6
;
run;
proc print;
run;

例3: 经典的例子
data test;
*infile cards;
input x @; /*单个@,能Hold住,有效期到下一个input语句*/
input y; /*没有@,Hold不住,下一个input语句会去读新的一行*/
input z @@; /*两个@,Hold住没问题,保持当前行直到该行结束*/
cards;
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17
;
run;
proc print data=test;
run;

输出结果:
Obs x y z
1 1 2 7
2 8 9 13

解读:
@是保持当前行,直到遇到下一个后面不带有@的input语句或是进入下一个数据步循环,@@是保持当前行直到该行结束(可以跨域数据步循环)。

第一次循环:
input x @; 读入x的值(1),并保持在当前行(第一行)
input y; 读入y的值(2),并把输入指针指向下一行(第二行开头)
input z @@; 读入z的值(7),并保持该行到下一数据步循环

第二次循环
input x @; 读入x的值(8),并保持在当前行(第二行中间)
input y; 读入y的值(9),并把输入指针指向下一行(第三行开头)
input z @@; 读入z的值(13),并保持该行到下一数据步循环

以此类推......

利用put _all_,查看详细执行过程
data test;
put _all_;
input x @;
put _all_;
input y;
put _all_;
input z @@;
put _all_;
cards;
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17
;
run;
proc print data=test;
run;

b.宏语句及其功能含义

可在开放代码中使用的宏语句:
宏语句 功能含义
%*comment 注释语句。
%COPY 拷贝语句,从SAS库中拷贝指定的对象。
%DISPLAY 显示宏语句窗口。
%GLOBAL 创建一个全局宏变量。
%INPUT 在宏执行过程中为宏变量赋值。
%LET 创建一个宏变量,同时对其进行赋值。
%MACRO 标识一个宏定义的开始,指定所定义宏的名称及参数等。
%PUT 将指定的文本或宏变量的值写入log窗口。
%SYMDEL 删除指定的宏变量。
%SYSCALL 调用SAS字程序。
%SYSEXEC 提交操作系统命令。
%SYSLPUT 在远程主机或服务器上定义一个新的宏变量或修改一个已存在宏变量的值。
%SYSRPUT 将远程主机上一个宏变量的值赋给本地主机上的宏变量。
%WINDOW 定制一个用户自定义的窗口。


仅在宏定义中使用的宏语句:
宏语句 功能含义
%ABORT 中止当前宏的运行。
%DO 开始一个%do代码块。
%DO,Iterative 开始一个%do循环语句。
%DO %UNTIL 执行指定的语句直至指定的条
%DO 当指定的条件为真时执行指定
%END 标识一个%do代码块(包括上述
%GOTO 使宏运行进程跳跃到指定的标
%IF-%THEN/%ELSE 条件语句,有条件执行指定的
%label: 在特定的代码位置上给出一个
%LOCAL 创建一个局部宏变量。
%MEND 标识一个宏定义的结束。
%RETURN 引导当前宏的正常终止。

c.批量delete或drop数据集

批量删除数据集
经过一系列的程序,work临时文件夹里有了很多过程数据集比如a1,a2,a3……;感觉看着不爽想删掉,怎么办?
你可以这么做:
proc delete data=a1 a2 a3;run;
如果你想精简程序为:
proc delete data=a1-a3;run;
那么很遗憾,sas出错了,因为proc delete 读不懂a1-a3;
如果临时数据集很多比如有99个,恰好都是a开头,如果1个1个分开写,估计会累死;那么怎么办?
其实,这么有规律的数据集,你就可以用循环语句了,你可以这么来
%macro dd;
%do i=1 %to 99;
proc delete data=a&i;run;
%end;
%mend;
%dd;
这样你就可以搞定了。
这比上面分开写99个数据集好多了。
如果你是程序控,你一定会觉得不爽,还是觉得烦了,那么有无更简便方法,答案是有的。
利用proc datasets 过程;你可以这么写
proc datasets lib=work ;delete a1-a99;run;
于是世界清静了。proc datasets 比 proc delete 聪明,a1-a99,他懂的!
到此为止,一般人不会再研究了,但是“程序控”还是不爽,因为如果临时数据集如果名字没那么规律怎么办?
其实proc datasets 功能很强大,他可以像 keep 和 drop 那样,drop太多了不好写,可以写keep,只是在datasets里面它用的是save 和 delete。
datasets其他用法,程序控们可以参见http://blog.sina.com.cn/s/blog_5d3b177c0100bamo.html

例1: drop表

利用循环依次删除表
Tmp_cwy_zfb_1610
Tmp_cwy_zfb_1611
Tmp_cwy_zfb_1612

%macro dd;
%do i=10 %to 12;
*rsubmit;
proc sql;
drop table rdmtmp.Tmp_cwy_zfb_16&i.;
quit;
*endrsubmit;
%end;
%mend;
%dd;

例2: delete表

删除t1,t2,t3

proc sql;
create table rdmtmp.t1(id varchar(10));
create table rdmtmp.t2(id varchar(10));
create table rdmtmp.t3(id varchar(10));
quit;

proc datasets lib=rdmtmp; delete t1-t3; run;

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧