Linux上开发常见问题整理
1.java工程在linux上运行测试
①首先要有一个main方法作为主类,程序的入口,右键-->Run As-->javaapplication生成配置文件入口
②右键该工程-->Export-->Runnable JAR file-->选择上一步生成的配置文件作为该jar运行入口,确定即可
③运行java -jar jar名+后缀(ps –ef|grep job)
总结:Linux后台运行Jar方法
· 在linux服务器上运行Jar文件时通常的方法是:
$ java -jar test.jar
· 这种方式特点是ssh窗口关闭时,程序中止运行.或者是运行时没法切出去执行其他任务,有没有办法让Jar在后台运行呢:
· 方法一:
$ nohup java -jar test.jar &
//nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行
//当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中
//除非另外指定了输出文件。
· 方法二:
$ nohup java -jar test.jar >temp.txt &
//这种方法会把日志文件输入到你指定的文件中,没有则会自动创建
· jobs命令和 fg命令:
$ jobs
//那么就会列出所有后台执行的作业,并且每个作业前面都有个编号。
//如果想将某个作业调回前台控制,只需要 fg + 编号即可。
$ fg 2
· 查看某端口占用的线程的pid
netstat -nlp |grep :8080
2.linux命令
①实时查看日志:tail –f 日志文件名称+后缀 (如:tail –f cat.out)
②查看某程序运行状况:ps –ef|grep 程序名 (如: ps –ef|grep redis)
3. linux虚拟机下安装jdk失败显示如下
./jdk-6u13-linux-i586.bin:./install.sfx.1956: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory Failed to extract the files.Please refer to the Troubleshooting section of the Installation Instructions onthe download p…
解答:Linux操作系统是64位的。软件包jdk-6u13-linux-i586.bin的名字中包含了i586,表示,他是32位的软件。将jdk改成64位的重新安装,错误解决。
4.日历类calendar
// 为calendar实例设置小时为当前小时减一
calendar.set(Calendar.HOUR_OF_DAY,calendar.get(Calendar.HOUR_OF_DAY) - 1);
5. HBase正则匹配
// HBase正则匹配
RegexStringComparatorcomp = newRegexStringComparator("20171116\\d|$");
filters.addFilter(newSingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("time"), CompareOp.EQUAL, comp ));
6.map排序
①单个值的map排序
把每一个map放到list中,比较map的key或value,冒泡时整体移动
// 以时间冒泡排序
for (inti = 0; i < mapList.size() - 1; i++) {
for (int j = 0; j < mapList.size() - i - 1; j++) {
int a = Integer.valueOf(mapList.get(j).get("time").toString());
int b = Integer.valueOf(mapList.get(j+1).get("time").toString());
if(a > b){
Map<String,String> temp = mapList.get(j+1);
mapList.set((j + 1),mapList.get(j));
mapList.set(j, temp);
}
}
}
②多个值的map按value大小排序
publicclass MapSortUtil {
/**
* 按map值大小降序排列(float类型)
* @param oriMap
* @return
*/
publicstatic Map<String,Float> sortMapByValue(Map<String, Float> oriMap) {
if (oriMap == null || oriMap.isEmpty()) {
returnnull;
}
Map<String, Float> sortedMap = newLinkedHashMap<String, Float>();
List<Map.Entry<String, Float>>entryList = newArrayList<Map.Entry<String, Float>>(
oriMap.entrySet());
Collections.sort(entryList, new MapValueComparator());
Iterator<Map.Entry<String,Float>> iter = entryList.iterator();
Map.Entry<String, Float> tmpEntry = null;
while (iter.hasNext()) {
tmpEntry = iter.next();
sortedMap.put(tmpEntry.getKey(),tmpEntry.getValue());
}
return sortedMap;
}
}
publicclassMapValueComparator implements Comparator<Map.Entry<String, Float>> {
@Override
publicintcompare(java.util.Map.Entry<String, Float> o1,java.util.Map.Entry<String, Float> o2) {
returno2.getValue().compareTo(o1.getValue()); //降序
}
}
7.SVN更新/提交报错,信息显示xx文件被锁定
解决方案:找到被锁定的文件/文件夹 右键-->term--> Refresh/Cleanup清除锁即可更新/提交
8.float类型计算结果保留两位小数
①方法一:(float) Math.round(a*100)/100 //a是float类型
②方法二:
BigDecimal bg = new BigDecimal(f);
double f1 = bg.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
③方法三:
float num= (float)2/3;
DecimalFormat df = new DecimalFormat("0.00");//格式化小数
String s = df.format(num);//返回的是String类型
9.kafka客户端服务消费数据刷入流程
①进入kafka
cd kafka_2.10-0.10.0.0 (/home/hxxtsx/kafka_2.10-0.10.0.0)
②启动客户端
bin/kafka-console-producer.sh
③创建kafka消息和主题
--broker-listNM-304-SA5212M4-BIGDATA-659:9091 --topic systemlog --producer.configconfig/producer.properties
具体操作:
bin/kafka-console-producer.sh --broker-listNM-304-SA5212M4-BIGDATA-659:9091 --topic systemlog --producer.configconfig/producer.properties
④设置json格式消息
{"system":"scheduler","module":"listener","host":"192.168.1.1","comm":"hello! this isalert!","logTime":"20171123102333","logType":"system","flag":"Exception"}
10.Hbase shell命令,根据某个字段值查询
语法:scan '表名',{FILTER => “ColumnPrefixFilter('列名') AND ValueFilter( = , 'substring:列的值')”}
示例:scan 'log:analysis_notice_state',{FILTER =>"ColumnPrefixFilter('workerID') AND ValueFilter ( = , 'substring:W111')"}
11.HBase java API过滤器问题,根据某个字段过滤时,出现多个为空的情况(有些记录没有这个列值默认不会过滤)
SingleColumnValueFilter:用一列的值决定这一行的数据是否被过滤。在它的具体对象上,可以调用setFilterIfMissing(true)或者setFilterIfMissing(false),默认的值是false,其作用是,对于咱们要使用作为条件的列,如果这一列本身就不存在,那么如果为true,这样的行将会被过滤掉,如果为false,这样的行会包含在结果集中。
1. SingleColumnValueFilter scvf = new SingleColumnValueFilter(
2. Bytes.toBytes("colfam1"),
3. Bytes.toBytes("qual2"),
4. CompareFilter.CompareOp.NOT_EQUAL,
5. new SubstringComparator("BOGUS"));
6. scvf.setFilterIfMissing(false);
7. scvf.setLatestVersionOnly(true); // OK
12. 导入的包报错:The import java.util cannot be resolved
解决方案:右键项目----àbuildpath----à最下面那个configuration的选择libraries找到JRE(这个时候你会发现这个jre前面有!或者是红X)选中remove掉重新为该项目选择一个JRE选中项目,project----clean,也可能未添加JRE。
13.eclipse/myeclipse解决editor does not contain a main type的方法
检查发现原来的包全部变成文件夹格式,我是右击src--àbuildpath--àuseas source folder就行了,就变回包格式的了,记得运行之后重启
14. java中Double类型的运算精度丢失的问题
在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。
15.kafka客户端服务消费数据刷入流程
①进入kafka
cd kafka_2.10-0.10.0.0 (/home/hxxtsx/kafka_2.10-0.10.0.0)
②具体操作
bin/kafka-console-producer.sh --broker-listNM-304-SA5212M4-BIGDATA-659:9091 --topic systemlog --producer.configconfig/producer.properties
注:
bin/kafka-console-producer.sh (启动客户端)
--broker-listNM-304-SA5212M4-BIGDATA-659:9091 --topic systemlog --producer.configconfig/producer.properties (创建kafka消息和主题)
③设置json格式消息
{"system":"scheduler","module":"listener","host":"192.168.1.1","comm":"hello! this isalert!","logTime":"20171123102333","logType":"system","flag":"Exception"}
16.java Timer定时每个整点触发
1. public class OneHour {