-
#化鲲为鹏,我有话说# > 题外话:很高兴能够申请成功鲲鹏的公测,收到消息,第一时间申请了鲲鹏服务器,打算好好利用这段时间对鲲鹏服务器在企业应用可用性上进行测试,毕竟ARM和X86还是有很大差别的,很多企业级应用能否在鲲鹏上稳定运行,是否能够保证性能,是否可以适应技术架构及其中间件环境,是选择鲲鹏的一个重要的考量。本次我就先对java及其相关环境进行测试。这是我的第一帖,后续我还会持续对鲲鹏的测试反馈发帖交流。 首先,对于鲲鹏[官网介绍](https://www.huaweicloud.com/kunpeng/software/openjdk.html)其是支持OpenJDK环境的,但是在企业中,很少直接使用OpenJDK,而是使用oracle官方版本更多一些。那我就先在鲲鹏服务中先搭建jdk环境,本次测试使用的jdk8,分别安装OpenJDK和Oracle官方jdk环境。 ## 0. 试验环境 服务器规格: 鲲鹏通用计算增强型 | kc1.15xlarge.2 操作系统 : Ubuntu 18.04 64bit with ARM ## 1.OpenJDK 服务器初始系统中已经安装了OpenJDK,安装版本如下: ```bash openjdk version "1.8.0_212" OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03) OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode) ``` 如果你使用其他系统,可以参考[鲲鹏官方的安装说明](https://www.huaweicloud.com/kunpeng/software/openjdk.html) ## 2. Oracle官方版本 - 首先需要卸载鲲鹏上自带的openjdk ```bash apt-get autoremove openjdk-8-jdk ``` - 然后下载oracle官方jdk,这里时[下载地址](https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8u211-later-5573849.html),这里需要注意,一定要下载RAM版本的jdk,否则无法运行。 - 加压并安装jdk ```bash tar -vzxf jdk-8u212-linux-arm64-vfp-hflt.tar.gz mv jdk1.8.0_212/ jdk vi /etc/profile # 在文件最后加上下面内容 export JAVA_HOME=/opt/jdk export PATH=$PATH:$JAVA_HOME/bin ``` - 验证是否安装成功 ```bash java -version # 看到以下内容说明已经安装完成 java version "1.8.0_212" Java(TM) SE Runtime Environment (build 1.8.0_212-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode) ``` ## 3.总结 可以看到,基于鲲鹏的JAVA环境安装过程和基于X86的安装过程并没有什么区别,而且无论从开源社区还是oracke官方都是支持ARM框架的JAVA环境。而JAVA是基于跨平台的,只要能够正常运行JAVA环境,那么基于JAVA的企业级应用,都可以很容易的迁移到麒麟服务器上。
-
使用maven工程构建java 的hadoop客户端项目说明通过java操作hadoop中的hdfs分布式文件系统,首先我们要建新一个maven的java工程,然后在pom.xml导入hadoop的如果的依赖java包。再编写一个java的测试类去连接hadoop的集群环境。注意hadoop集群版本与导入hadoop-client的版本要一致,避免产生其它的问题。工程目录导入Maven的依赖包 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.0.0</version> </dependency> </dependencies>编写Java处理hadoop集群的测试类package net.togogo.hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.net.URI; /** * 构建HdfsClient来操作hadoop集群 */ public class HdfsClient { private FileSystem fs = null; /** * 构建分布式文件系统的操作对象FileSystem */ @Before public void init() { System.out.println(" init methon start ...."); try { Configuration conf = new Configuration(); //连接集群的地址 URI uri = new URI("hdfs://192.168.20.32:9000"); fs = FileSystem.get(uri, conf, "hd"); System.out.println("FileSystem---->" + fs); } catch (Exception e) { e.printStackTrace(); } System.out.println(" init methon end ...."); } /** * 命令 hadoop fs -ls / */ @Test public void listRoot() { try { System.out.println("listRoot method ...."); //访问 hadoop fs -ls / RemoteIterator it = fs.listFiles(new Path("/"), true); //循环 while (it.hasNext()) { LocatedFileStatus lf = it.next(); System.out.println(lf.getPath().getName()); } fs.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 命令 hadoop fs -mkdir /test0831 */ @Test public void mkdir() { try { Path path = new Path("/test0831"); fs.mkdirs(path); fs.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 命令 hadoop fs -put F:/hello.log / */ @Test public void upload() { try { Path src = new Path("F:/hello.log"); Path dst = new Path("/"); fs.copyFromLocalFile(src, dst); } catch (IOException e) { e.printStackTrace(); } } /** * 命令 hadoop fs -get /hello.log F:/dsthello.log */ @Test public void download() { try { Path src = new Path("/hello.log"); Path dst = new Path("F:/dsthello.log"); fs.copyToLocalFile(src, dst); } catch (IOException e) { e.printStackTrace(); } } }腾科IT教育
-
TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议、TCP协议和UDP协议。现在TCP/IP协议族中的主要socket类型为流套接字(使用TCP协议)和数据报套接字(使用UDP协议)。 TCP协议提供面向连接的服务,通过它建立的是可靠地连接。Java为TCP协议提供了两个类:Socket类和ServerSocket类。一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的ServerSocket实例则**来自客户端的TCP连接请求,并为每个请求创建新的Socket实例,由于服务端在调用accept()等待客户端的连接请求时会阻塞,直到收到客户端发送的连接请求才会继续往下执行代码,因此要为每个Socket连接开启一个线程。服务器端要同时处理ServerSocket实例和Socket实例,而客户端只需要使用Socket实例。另外,每个Socket实例会关联一个InputStream和OutputStream对象,我们通过将字节写入套接字的OutputStream来发送数据,并通过从InputStream来接收数据。 TCP连接的建立步骤 客户端向服务器端发送连接请求后,就被动地等待服务器的响应。典型的TCP客户端要经过下面三步操作: 1、创建一个Socket实例:构造函数向指定的远程主机和端口建立一个TCP连接; 2.通过套接字的I/O流与服务端通信; 3、使用Socket类的close方法关闭连接。 服务端的工作是建立一个通信终端,并被动地等待客户端的连接。典型的TCP服务端执行如下两步操作: 1、创建一个ServerSocket实例并指定本地端口,用来**客户端在该端口发送的TCP连接请求; 2、重复执行: 1)调用ServerSocket的accept()方法以获取客户端连接,并通过其返回值创建一个Socket实例; 2)为返回的Socket实例开启新的线程,并使用返回的Socket实例的I/O流与客户端通信; 3)通信完成后,使用Socket类的close()方法关闭该客户端的套接字连接。 TCP Socket Demo 下面给出一个客户端服务端TCP通信的Demo,该客户端在20006端口请求与服务端建立TCP连接,客户端不断接收键盘输入,并将其发送到服务端,服务端在接收到的数据前面加上“echo”字符串,并将组合后的字符串发回给客户端,如此循环,直到客户端接收到键盘输入“bye”为止。 客户端代码如下: package zyb.org.client; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.SocketTimeoutException; public class Client1 { public static void main(String[] args) throws IOException { //客户端请求与本机在20006端口建立TCP连接 Socket client = new Socket("127.0.0.1", 20006); client.setSoTimeout(10000); //获取键盘输入 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //获取Socket的输出流,用来发送数据到服务端 PrintStream out = new PrintStream(client.getOutputStream()); //获取Socket的输入流,用来接收从服务端发送过来的数据 BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())); boolean flag = true; while(flag){ System.out.print("输入信息:"); String str = input.readLine(); //发送数据到服务端 out.println(str); if("bye".equals(str)){ flag = false; }else{ try{ //从服务器端接收数据有个时间限制(系统自设,也可以自己设置),超过了这个时间,便会抛出该异常 String echo = buf.readLine(); System.out.println(echo); }catch(SocketTimeoutException e){ System.out.println("Time out, No response"); } } } input.close(); if(client != null){ //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭 client.close(); //只关闭socket,其关联的输入输出流也会被关闭 } }} 服务端需要用到多线程,这里单独写了一个多线程类,代码如下: package zyb.org.server; import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket; /** * 该类为多线程类,用于服务端 */public class ServerThread implements Runnable { private Socket client = null; public ServerThread(Socket client){ this.client = client; } @Override public void run() { try{ //获取Socket的输出流,用来向客户端发送数据 PrintStream out = new PrintStream(client.getOutputStream()); //获取Socket的输入流,用来接收从客户端发送过来的数据 BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())); boolean flag =true; while(flag){ //接收从客户端发送过来的数据 String str = buf.readLine(); if(str == null || "".equals(str)){ flag = false; }else{ if("bye".equals(str)){ flag = false; }else{ //将接收到的字符串前面加上echo,发送到对应的客户端 out.println("echo:" + str); } } } out.close(); client.close(); }catch(Exception e){ e.printStackTrace(); } } } 服务端处理TCP连接请求的代码如下:package zyb.org.server; import java.net.ServerSocket;import java.net.Socket; public class Server1 { public static void main(String[] args) throws Exception{ //服务端在20006端口**客户端请求的TCP连接 ServerSocket server = new ServerSocket(20006); Socket client = null; boolean f = true; while(f){ //等待客户端的连接,如果没有获取连接 client = server.accept(); System.out.println("与客户端连接成功!"); //为每个客户端连接开启一个线程 new Thread(new ServerThread(client)).start(); } server.close(); }} 执行结果截图如下:(转载自http://3ms.huawei.com/km/blogs/details/6038177)
-
关于JAVA 北向这块打算分两个帖子来说明一下最近遇到的问题:1、Demo工程无法对接电信平台(证书问题)2、JAVA SDK无法在android中使用。这个帖子我们先只讨论第一个问题:将Demo工程中平台IP改成电信平台的IP,运行出错,问题现象: executeHttpRequest failed.Exception in thread "main" java.lang.NullPointerExceptionat com.huawei.utils.StreamClosedHttpResponse.<init>(StreamClosedHttpResponse.java:36)at com.huawei.utils.HttpsUtil.executeHttpRequest(HttpsUtil.java:361)at com.huawei.utils.HttpsUtil.doPostFormUrlEncodedGetStatusLine(HttpsUtil.java:223)at com.huawei.service.appAccessSecurity.Authentication.main(Authentication.java:31)原因: 电信在2019-3月之后,将平台的证书做了更换,所以在SSL校验的时候,证书校验不通过,导致了如上问题:解决方法有两种: 1、将ca.jks文件替换成电信平台的,可以从电信平台的java sdk中获取。 2、取消证书校验。方法如下: 打开HttpsUtil.java文件,在HttpsUtil 类中添加如下代码: private TrustManager truseAllManager = new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } };将 sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);替换为:sc.init(kmf.getKeyManagers(), new TrustManager[] { truseAllManager }, null);如此,便可取消对服务器证书的校验,我们在调试阶段,避免频繁更换证书而影响后续的工作。
-
1、从官网下载的JAVA SDK,使用调测证书的方式,把demo跑通了。SDK的jar包反编译后可以看到根下有调试证书文件。2、android studio新建app工程,把SDK加入工程,参照demo的用法,使用默认的ssl配置,实现了鉴权接口,但是调试的时候,app一直报错:NorthApiException [error_code=1006, error_desc=Ssl config error, please check the certificate path, httpStatusCode=-1, httpReasonPhase=, httpMessage=sunx509 KeyManagerFactory not available]从日志上看好像是证书路径不对,但是证书明明在jar包里面呀。而且这个jar包在电脑上可以运行,请问这是什么原因呢?3、后来我又尝试把证书文件放到assets目录下,显式地指定了证书路径,但还是不行,报告找不到文件
-
[技术干货] 求解答: java.lang.NoClassDefFoundError: Could not initialize class com.obs.services.internal.Constants为什么上传文件再Linux服务器总是报这个异常,在开发环境Windows环境又不会。求解答。java.lang.NoClassDefFoundError: Could not initialize class com.obs.services.internal.Constants
-
测评报告上传到附件中,欢迎小伙伴们指导奥!
-
Maven构建java工程操作hdfs实例腾科教育以为理论+实操为主的教学,带你进入大数据开发基础。每一步都带着你,让你一步一步实现自已的大数据开发梦想。构建maven工程 导入maven类包 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.8.1</version> </dependency> </dependencies>编写Junit单元测试类package net.togogo.hdfsproject; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.junit.Before; import org.junit.Test; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; public class HdfsClientTest { FileSystem fs = null; @Before public void init() throws Exception { // 构造一个配置参数对象,设置一个参数:我们要访问的hdfs的URI // 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址 // new Configuration();的时候,它就会去加载jar包中的hdfs-default.xml // 然后再加载classpath下的hdfs-site.xml Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.75.129:9000"); /** * 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置 */ conf.set("dfs.replication", "3"); // 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例 // fs = FileSystem.get(conf); // 如果这样去获取,那conf里面就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户 fs = FileSystem.get(new URI("hdfs://192.168.75.129:9000"), conf, "hadoop"); } @Test public void testAddFileToHdfs(){ // 要上传的文件所在的本地路径 Path src = new Path("D:\\stone\\HCNA-AI\\images\\idcard.jpg"); // 要上传到hdfs的目标路径 Path dst = new Path("/togogo/idcard.jpg"); try { fs.copyFromLocalFile(src,dst); System.out.println("文件上传成功..."); } catch (IOException e) { e.printStackTrace(); } } @Test public void testDelFileFromHdfs(){ // 要上传到hdfs的目标路径 Path dst = new Path("/togogo/work"); try { fs.delete(dst,true); System.out.println("文件删除成功..."); } catch (IOException e) { e.printStackTrace(); } } /** * 查看目录信息,只显示文件 * * @throws IOException * @throws IllegalArgumentException * @throws FileNotFoundException */ @Test public void testListFiles() throws FileNotFoundException, IllegalArgumentException, IOException { // 思考:为什么返回迭代器,而不是List之类的容器 RemoteIterator while (listFiles.hasNext()) { LocatedFileStatus fileStatus = listFiles.next(); System.out.println(fileStatus.getPath().getName()); System.out.println(fileStatus.getBlockSize()); System.out.println(fileStatus.getPermission()); System.out.println(fileStatus.getLen()); BlockLocation[] blockLocations = fileStatus.getBlockLocations(); for (BlockLocation bl : blockLocations) { System.out.println("block-length:" + bl.getLength() + "--" + "block-offset:" + bl.getOffset()); String[] hosts = bl.getHosts(); for (String host : hosts) { System.out.println(host); } } System.out.println("--------------为angelababy打印的分割线--------------"); } } /** * 查看文件及文件夹信息 * * @throws IOException * @throws IllegalArgumentException * @throws FileNotFoundException */ @Test public void testListAll() throws FileNotFoundException, IllegalArgumentException, IOException { FileStatus[] listStatus = fs.listStatus(new Path("/")); String flag = "d-- "; for (FileStatus fstatus : listStatus) { if (fstatus.isFile()) flag = "f-- "; System.out.println(flag + fstatus.getPath().getName()); } } }
-
1、简介 Logstash是一个开源的日志收集管理工具,是一个具有实时管道功能的开源数据收集引擎,Logstash可以动态地将来自不同数据源的数据统一起来,并将数据规范化为自己选择的目的地,清理和大众化所有数据,用于各种高级下游分析和可视化用例。 官方链接:http://www.elastic.co/cn/products/logstash 类别:数据采集2、基础环境类别子项版本获取地址(方法)华为云虚拟机RC3(916)--OSCentOS7.5 Kernel4.14 软件包Java1.8.0 Logstash7.2.0 3、依赖安装要使用Logstash,需要Java7以后的环境,所以首先需要下载对应的JDK环境。查看java版本,运行下面的命令:java -version如果环境已经正常安装java,会出现如下的输出结果:openjdk version "1.8.0_212"OpenJDK Runtime Environment (build 1.8.0_212-b04)OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode) 4、组件编译安装 下载并安装公钥rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 在/etc/yum.repos.d/目录下创建文件logstash.repo,添加下面配置[logstash-7.x]name=Elastic repository for 7.x packagesbaseurl=https://artifacts.elastic.co/packages/7.x/yumgpgcheck=1gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1autorefresh=1type=rpm-md 接下来安装使用,使用下面的命令来进行安装sudo yum install logstash 版本检查。如果编译成功,会正确显示版本。rpm -qa|grep logstash5、系统配置无6、测试使用如下命令启动服务并查看服务状态。如果为active状态,则表示服务启动成功。systemctl start logstash.servicesystemctl status logstash.service 7、参考信息官方文档指导:https://www.elastic.co/guide/en/logstash/current/installing-logstash.html#package-repositories 8、FAQ无
-
1、简介 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是9.0。 Tomcat服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。。 官方链接:http://tomcat.apache.org/ 类别:Web服务2、基础环境类别子项版本获取地址(方法)华为云虚拟机RC3(916)--OSCentOS7.5 Kernel4.14 软件包Jdk1.8.0 Tomcat9.0.21 3、依赖安装参考《华为云鲲鹏云服务最佳实践-JDK-1.8.0 安装配置指南》4、组件编译安装下载tomcatwget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.21/bin/apache-tomcat-9.0.21.tar.gz解压tar -xvzf apache-tomcat-9.0.21.tar.gz5、系统配置无6、测试 测试内容:tomcat服务是否正常启动 测试结果:服务正常启动7、参考信息官方文档:http://tomcat.apache.org/tomcat-9.0-doc/index.html8、FAQA:tomcat的默认端口号为8080,如果有其他软件占用了此端口,则会导致tomcat不能启动Q:用FPort等软件查看端口使用情况,然后结束占用端口的进程或配置其改用其它端口
-
1、简介 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 类别:工具包2、基础环境类别子项版本获取地址(方法)华为云虚拟机RC3(916)--OSCentOS7.5 Kernel4.14 软件包Jdk11.0.3 3、依赖安装无4、组件编译安装 在yum源中查找jdk列表yum list | grep jdk查出结果:在yum源中进行安装yum install java-11-openjdk.aarch645、系统配置无6、测试测试内容:JDK安装是否成功java -version测试结果:7、参考信息无8、FAQLinux在同时拥有两个jdk的情况下,可以进行两个jdk之间的切换alternatives --config java 输入所需要的jdk版本所属号,即可进行切换
-
测评文件为PDF版,详情查看附件奥!欢迎小伙伴们点评
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签