当前位置:首页 > 数据库 > 正文

scala为什么用的很少(公司spark一般用java写吗)

scala为什么用的很少(公司spark一般用java写吗)

Java 9终于来了,新功能按得住程序员苦等一年的火气吗Java的发展真的越来越快了,在Java9正式发布之前,我们可以使用它的SNAPSHOT版本,先来体验一下Jav...

Java 9终于来了,新功能按得住程序员苦等一年的火气吗

Java的发展真的越来越快了,在Java9正式发布之前,我们可以使用它的SNAPSHOT版本,先来体验一下Java9有哪些新的特性,下面的清单来自于官方文档,看着似乎很多,但是真正具有颠覆意义的其实就是ModuleSystem,其余很多主要是一些新的feature增加,还有一些功能的加强,在本篇文章中,我们将介绍一下主要的几个,不会一一去说,资料也不多,所以我想说也没的说,另外Java8是我认为迄今为止Java最大的一次变化,不光是特性的增加,更多的是编程风格的转变,

102:ProcessAPIUpdates

110:HTTP2Client

143:ImproveContendedLocking

158:UnifiedJVMLogging

165:CompilerControl

193:VariableHandles

197:SegmentedCodeCache

199:SmartJavaCompilation,PhaseTwo

200:TheModularJDK

201:ModularSourceCode

211:ElideDeprecationWarningsonImportStatements

212:ResolveLintandDoclintWarnings

213:MillingProjectCoin

214:RemoveGCCombinationsDeprecatedinJDK

8215:TieredAttributionforjavac

216:ProcessImportStatementsCorrectly

217:AnnotationsPipeline2.0

219:DatagramTransportLayerSecurity(DTLS)

220:ModularRun-TimeImages

221:SimplifiedDocletAPI

222:jshell:TheJavaShell(Read-Eval-PrintLoop)

223:NewVersion-StringScheme

224:HTML5Javadoc

225:JavadocSearch

226:UTF-8PropertyFiles

227:Unicode7.0

228:AddMoreDiagnosticCommands

229:CreatePKCS12KeystoresbyDefault

231:RemoveLaunch-TimeJREVersionSelection

232:ImproveSecureApplicationPerformance

233:GenerateRun-TimeCompilerTestsAutomatically

235:TestClass-FileAttributesGeneratedbyjavac

236:ParserAPIforNashorn

237:Linux/AArch64Port

238:Multi-ReleaseJARFiles

240:RemovetheJVMTIhprofAgent

241:RemovethejhatTool

243:Java-LevelJVMCompilerInterface

244:TLSApplication-LayerProtocolNegotiationExtension

245:ValidateJVMCommand-LineFlagArguments

246:LeverageCPUInstructionsforGHASHandRSA

247:CompileforOlderPlatformVersions2

48:MakeG1theDefaultGarbageCollector

249:OCSPStaplingforTLS250:StoreInternedStringsinCDSArchives

251:Multi-ResolutionImages

252:UseCLDRLocaleDatabyDefault

253:PrepareJavaFXUIControls&CSSAPIsforModularization

254:CompactStrings

255:MergeSelectedXerces2.11.0UpdatesintoJAXP

256:BeanInfoAnnotations

257:UpdateJavaFX/MediatoNewerVersionofGStreamer

258:HarfBuzzFont-LayoutEngine

259:Stack-WalkingAPI260:EncapsulateMostInternalAPIs

261:ModuleSystem

262:TIFFImageI/O

263:HiDPIGraphicsonWindowsandLinux

264:PlatformLoggingAPIandService

265:MarlinGraphicsRenderer

266:MoreConcurrencyUpdates

267:Unicode8.0268:XMLCatalogs

269:ConvenienceFactoryMethodsforCollections

270:ReservedStackAreasforCriticalSections

271:UnifiedGCLogging

272:Platform-SpecificDesktopFeatures

273:DRBG-BasedSecureRandomImplementations

274:EnhancedMethodHandles

275:ModularJavaApplicationPackaging

276:DynamicLinkingofLanguage-DefinedObjectModels

277:EnhancedDeprecation

278:AdditionalTestsforHumongousObjectsinG

1279:ImproveTest-FailureTroubleshooting

280:IndifyStringConcatenation

281:HotSpotC++Unit-TestFramework

282:jlink:TheJavaLinker

283:EnableGTK3onLinux

284:NewHotSpotBuildSystem

285:Spin-WaitHints287:SHA-3HashAlgorithms

288:DisableSHA-1Certificates

289:DeprecatetheAppletAPI

290:FilterIncomingSerializationData

292:ImplementSelectedECMAScript6FeaturesinNashorn

294:Linux/s

390xPort295:Ahead-of-TimeCompilation

1.ModularSystem–JigsawProject

该特性是Java9最大的一个特性,Java9起初的代号就叫Jigsaw,最近被更改为Modularity,Modularity提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节,Java提供该功能的主要的动机在于,减少内存的开销,我们大家都知道,在JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class,那么JVM是如何知道需要加载那些class的呢?这就是在Java9中引入的一个新的文件module.java我们大致来看一下一个例子(module-info.java)

[java]viewplaincopyprint?modulecom.baeldung.java9.modules.car{requirescom.baeldung.java9.modules.engines;exportscom.baeldung.java9.modules.car.handling;}

关于更多Java9模块编程的内容请参考一本书:《Java9Modularity》里面讲的比较详细,介绍了当前Java对jar之间以来的管理是多么的混乱,引入modularity之后的改变会是很明显的差别。

2.ANewHttpClient

就目前而言,JDK提供的Http访问功能,几乎都需要依赖于HttpURLConnection,但是这个类大家在写代码的时候很少使用,我们一般都会选择Apache的HttpClient,此次在Java9的版本中引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2,以及WebSocket,据说性能可以超过ApacheHttpClient,Netty,Jetty,简单的来看一个代码片段

[java]viewplaincopyprint?URIhttpURI=newURI("http://www.94jiankang.com");HttpRequestrequest=HttpRequest.create(httpURI).GET();HttpResponseresponse=request.response();StringresponseBody=response.body(HttpResponse.asString());

3.ProcessAPIEnhance

在Java很早的版本中,提供了Process这样的API可以获得进程的一些信息,包括runtime,甚至是用它来执行当前主机的一些命令,但是请大家思考一个问题,你如何获得你当前Java运行程序的PID?很显然通过Process是无法获得的,需要借助于JMX才能得到,但是在这一次的增强中,你将会很轻松的得到这样的信息,我们来看一个简单的例子

[java]viewplaincopyprint?ProcessHandleself=ProcessHandle.current();longPID=self.getPid();ProcessHandle.InfoprocInfo=self.info();Optional<String[]>args=procInfo.arguments();Optional<String>cmd=procInfo.commandLine();Optional<Instant>startTime=procInfo.startInstant();Optional<Duration>cpuUsage=procInfo.totalCpuDuration();

上面有大量的Optional,这是Java8中的API,同样在Java9中对其进行了增强,本人在Java8实战视频中对OptionalAPI进行了源码级别的剖析,感兴趣的一定要去看看。

已经获取到了JVM的进程,我们该如何将该进程优雅的停掉呢?下面的代码给出了答案

[java]viewplaincopyprint?childProc=ProcessHandle.current().children();childProc.forEach(procHandle->{assertTrue("Couldnotkillprocess"+procHandle.getPid(),procHandle.destroy());});

通过上面的一小段代码,我们也发现了Java9对断言机制同样增加了一些增强,多说一些题外话,我们目前的系统中运行一个严重依赖于HivebeelineServer的程序,beelineserver不是很稳定,经常出现卡顿,甚至假死,假死后也不回复的问题,这样就导致我们的程序也会出现卡顿,如果运维人员不对其进行清理,系统运行几个月之后会发现很多僵尸进程,于是增加一个获取当前JVMPID的功能,然后判断到超过给定的时间对其进行主动杀死,完全是程序内部的行为,但是获取PID就必须借助于JMX的动作,另外杀死它也必须借助于操作系统的命令,诸如kill这样的命令,显得非常的麻烦,但是Java9的方式明显要优雅方便许多。

4.Try-With-Resources的改变

我们都知道,Try-With-Resources是从JDK7中引入的一项重要特征,只要接口继承了Closable就可以使用Try-With-Resources,减少finally语句块的编写,在Java9中会更加的方便这一特征

[java]viewplaincopyprint?MyAutoCloseablemac=newMyAutoCloseable();try(mac){//dosomestuffwithmac}try(newMyAutoCloseable(){}.finalWrapper.finalCloseable){//dosomestuffwithfinalCloseable}catch(Exceptionex){}

我们的Closeable完全不用写在try()中。

5.DiamondOperatorExtension

[java]viewplaincopyprint?FooClass<Integer>fc=newFooClass<>(1){//anonymousinnerclass};FooClass<?extendsInteger>fc0=newFooClass<>(1){//anonymousinnerclass};FooClass<?>fc1=newFooClass<>(1){//anonymousinnerclass};

6.InterfacePrivateMethod

[java]viewplaincopyprint?interfaceInterfaceWithPrivateMethods{privatestaticStringstaticPrivate(){return"staticprivate";}privateStringinstancePrivate(){return"instanceprivate";}defaultvoidcheck(){Stringresult=staticPrivate();InterfaceWithPrivateMethodspvt=newInterfaceWithPrivateMethods(){//anonymousclass};result=pvt.instancePrivate();}}}

该特性完全是为了Java8中default方法和static方法服务的。

7.JShellCommandLineTool

在Java8出来的时候,很多人都喊着,这是要抢夺Scala等基于JVM动态语言的市场啊,其中有人给出了一个Java做不到的方向,那就是Scala可以当作脚本语言,Java可以么?很明显在此之前Java不行,ta也不具备动态性,但是此次Java9却让Java也可以像脚本语言一样来运行了,主要得益于JShell,我们来看一下这个演示

[java]viewplaincopyprint?jdk-9\bin>jshell.exe|WelcometoJShell--Version9|Foranintroductiontype:/helpintrojshell>"Thisismylongstring.Iwantapartofit".substring(8,19);$5==>"mylongstring"

这是我们在Jshell这个控制台下运行,我们如何运行脚本文件呢?

[java]viewplaincopyprint?jshell>/savec:\develop\JShell_hello_world.txtjshell>/openc:\develop\JShell_hello_world.txtHelloJShell!

8.JCMDSub-Commands

记得在Java8中,放弃了Jhat这个命令,但是很快在Java9中增加了一些新的命令,比如我们要介绍到的jcmd,借助它你可以很好的看到类之间的依赖关系

[java]viewplaincopyprint?jdk-9\bin>jcmd14056VM.class_hierarchy-i-sjava.net.Socket14056:java.lang.Object/null|--java.net.Socket/null|implementsjava.io.Closeable/null(declaredintf)|implementsjava.lang.AutoCloseable/null(inheritedintf)||--org.eclipse.ecf.internal.provider.filetransfer.httpclient4.CloseMonitoringSocket||implementsjava.lang.AutoCloseable/null(inheritedintf)||implementsjava.io.Closeable/null(inheritedintf)||--javax.net.ssl.SSLSocket/null||implementsjava.lang.AutoCloseable/null(inheritedintf)||implementsjava.io.Closeable/null(inheritedintf)

9.Мulti-ResolutionImageAPI

接口java.awt.image.MultiResolutionImage封装了一系列的不同分辨率图像到一个单独对象的API,我么可以根据给定的DPI矩阵获取resolution-specific,看一下下面的代码片段

[java]viewplaincopyprint?BufferedImage[]resolutionVariants=....MultiResolutionImagebmrImage=newBaseMultiResolutionImage(baseIndex,resolutionVariants);ImagetestRVImage=bmrImage.getResolutionVariant(16,16);assertSame("Imagesshouldbethesame",testRVImage,resolutionVariants[3]);

关于AWT的东西,本人几乎不怎么接触,如果有用到的朋友,等JDK9出来之后,自己体会使用一下吧。

10.VariableHandles

很早之前就传言Java会将unsafe这一个类屏蔽掉,不给大家使用,这次看他的官方文档,貌似所有已sun开头的包都将不能在application中使用,但是java9提供了新的API供大家使用。

在JDK9中提供了一个新的包,叫做java.lang.invoke里面有一系列很重要的类比如VarHandler和MethodHandles,提供了类似于原子操作以及Unsafe操作的功能。

11.Publish-SubscribeFramework

在新版的JDK9中提供了消息发布订阅的框架,该框架主要是由Flow这个类提供的,他同样会在java.util.concurrent中出现,并且提供了Reactive编程模式。

12.UnifiedJVMLogging

该特性为JVM的所有组件引入了一个通用的日志系统,提供了JVM日志的基础设施,你可以不用专门为了打印某些日志而添加一些专门的标签,只需要使用统一的log指令即可,比如:

[java]viewplaincopyprint?java-Xlog:gc=debug:file=gc.txt:none...jcmd9615VM.logoutput=gc_logswhat=gc

13.ImmutableSet

其实在Java的早期版本中就已经有这样的功能了,比如Collections.xxx就可以将某个collection封装成不可变,但是此次的Java9版本将其加到了对应的Set和List中,并且有一个专门的新包用来存放这些具体的实现java.util.ImmutableCollections,这一个特性和Scala真的如出一辙。

[java]viewplaincopyprint?Set<String>strKeySet=Set.of("key1","key2","key3");

14.OptionalToStream

对Option提供了stream功能,关于Optional的用法,我在我的教程中讲的非常详细,如果你还没有掌握,抓紧啊

[java]viewplaincopyprint?List<String>filteredList=listOfOptionals.stream().flatMap(Optional::stream).collect(Collectors.toList());

做大数据必须要用Java吗

你好,我是Lake,专注大数据技术、程序员经验、互联网科技见解分享。

学习大数据是否一定要学Java?我个人认为主要还是要看你所选择的工作方向。如果你选择大数据运维,那不一定要学习Java。大数据运维平时比较多的是对各种机器进行配置修改、安装部署集群、服务安装、对机器运维等等,所涉及到的Java开发方面会很少。同样,如果你选择ETL(数据处理)开发工程师,也不一定要学习Java语言,你需要更多关注的是数据仓库方面的理论知识以及业务数据模型构建。但是如果你选择大数据应用或平台开发工程师,那么Java语言你是一定要学的,很多日常需求开发你都会使用到Java。

目前很多大数据开源项目底层都是使用Java进行开发,比如Hadoop、HBase、Flink等等。当你选择从事大数据开发工程师时,那么平时你在和这些大数据技术组件打交道时,或多或少都会使用到Java。学习他们的原理和源码,你需要对Java有所了解才能看懂,有时候大数据组件的一个BUG,需要你看源码才能够解决,如果你对Java不懂的话,还能看懂吗?同样,比如日常业务开发需求,需要你结合公司某些特定业务场景,对大数据组件进行定制化开发和优化时,如果你不会Java,那个你还怎么满足这样的业务需求呢。大数据开发工程师,不仅仅要懂Java,更要对自己所维护的大数据组件原理要非常精通才行,这样你在公司内才会更有影响力。

ETL开发同学和大数据运维同学就不一定要学习Java语言。ETL同学更多的是关注怎么样对数据进行加工处理,一般会使用SQL来进行日常任务开发,不会用到太多Java。ETL同学关注的是如何通过数据仓库理论和业务模型构建,使得自己开发的任务更具有通用性,以便于自己以后的任务维护和数据指标的统一等等。大数据运维同学主要侧重机器运维、集群、任务运行稳定方面,一般它们不会去开发具体的代码,更多的使用使用脚本、Linux命令等进行运维。当然,如果它们能够对Java很熟练的话,那么他们在运维和开发方面,也会更加方便快捷。

总结

大数据是否要学习Java,其主要还是要看你所选择从事的大数据方向。不同的大数据岗位,对Java的需求是不同的,当然,我个人建议你有时间还是可以好好学习Java,毕竟很多大数据技术组件都是Java开发的,你以后再对这些大数据技术组件进行优化和源码阅读时,就能够快速的完成。

如果我的回答对你有帮助的话,希望你能点赞或者关注我,你的鼓励,就是我持续分享的动力,感谢。

C#这么优秀的语言为什么不流行

C#为什么不流行?

说到底这个锅该鲍尔默来背,他差点都把比尔盖茨一手打下的微软江山给败光了,更别说一个C#了。C#能做的JAVA基本都能做,JAVA不能做的有其他语言比C#做得更好,然后你的开源和跨平台还姗姗来迟,C#拿什么跟JAVA斗?

行业有个笑话,.NET最厉害的地方是跨平台,但是.NET最大的笑话也是跨平台。除了C++之外,能在.NET上运行的编程语言,是唯一一个能做到在所有平台上都能运行的编程语言,能把桌面MacOS、Linux、Windows,移动Android、iOS、WP(假设这玩意儿还在)全部跨完。不过遗憾的是,理想与现实总是残酷的,理论上是可以跨平台的,不过遗憾的是这么多年了微软一直都没跨出去。

这些年C#过得其实还挺憋屈的,前面的C/C++、JAVA交替做老大,两个老前辈C、C++时而来个青春走一回、容光焕发的,PHP、Python也是时常爆发,Go语言这个年轻人也是越来越强大,都实现自举了,可是C#呢打不过老年人,也打不过年轻人,其实还蛮惨的。

C#也不是一无是处

Windows应用程序,现在很多都是C#开发的,MSDN、SQLServerManagementStudio、Bing的很多服务,也都是用C#开发的,现在office365、Windows、VisualStudio也用了一些C#开发,C#现在还是Unity开发游戏的主要脚本语言。

微软自己的产品用C#自然是无可厚非,还有很多非微软网站也是用C#开发的。程序员问答网站StackOverflow、国内著名的技术博客网站博客园、国内程序员社区CSDN、开源中国,都是用C#开发的。以前当当、京东的核心技术栈也都是C#,不过后来才转向了JAVA技术栈。

C#其实能做的事情还蛮多的,Windows桌面应用开发,Web应用,也可以用来做移动开发,不过做得都比较差强人意。做桌面开发弄不过C++、现在甚至连Electron都弄不过了,除了一些B端应用,大家基本都不会选C#,Web应用方面弄不过JAVA和PHP,移动方面弄不过JAVA和swift,然后大企业也都有自己的技术栈,可是这些技术栈都跟C#无关。

C#、.NET,以及ASP.NET的关系,C#错过第一波红利

.NET是一个平台,本身实现的方式当然也是各种各样的库,理论上各种各样的编程语言都可以编译成其IL,然后在这个平台上运行,当然这个平台上面的编程语言很多,C#毫无疑问是这里面最重要的一个。ASP.NET是.NET主要用来做web开发的技术方案,当然这里面主要也是C#作为核心。

JAVA在96年面世,C#则是在2000年面世,JAVA的先发优势并没有那么明显,可是JAVA开源、免费的特点,让JAVA迅速攻城拔寨。C#有个好父亲、还是含着金钥匙长大的,C#的创造者安德斯·海尔斯伯格是TurboPascal编译器、Delphi的作者,在设计C#之前,已经是计算机工业界最伟大的科学家之一,后来又设计了TypeScript,打早了整个.NET体系。

C#语言设计本身在很多方面都是要超过JAVA的,可是吧微软早期的策略一直比较保守,不愿意跨平台,也不愿意开源,尽管安德斯·海尔斯伯格一直在努力推动这件事情,保守的鲍尔默领导下的微软错过了C#最好的几年,可是在这期间JAVA等编程语言不断攻城拔寨,C#终于还是输掉了未来。

C#输掉了移动互联网,大数据、云计算、AI也全都错过了

编程语言总得要抓住几个机会才能发展得更好,C#除了抓住了Windows,其余全都没有抓住,也许这就是命,当然跟微软自己作也有很大的关系。

你看Android爆发的时候选择了开源的JAVA,尽管现在Google因为这事儿天天被Oracle恶心;iOS自然不用说,人家先是objective-C、接着是swift,这个微软没办法;到了大数据时代,JAVA和Python又大发威风;云计算来了吧,你看Go语言又逐渐爆发了,越来越多的移动互联网企业比如字节跳动、B站也都转向了Go语言,就连Google、百度、腾讯也都在用Go语言;人工智能时代,C/C++做底层,Python用来做上层应用和算法。

你看几乎每一个重要的技术变革都跟C#无关。在大企业里面微软自己的核心技术栈都是C++,Google也是C/C++,Facebook是C和PHP,百度是C/PHP/Go,字节跳动是Python/Go,阿里巴巴是JAVA,B站是Go语言。你同样可以发现,这里面没有一家企业将C#作为核心技术栈。

C#本来可以有个很好的发展的,可惜微软自己作死,浪费了C#发展最好的几年,等到纳德拉上台之后,试图通过开源来发展C#的时候,已经来不及了。未来看微软的决心有多大,比如微软是否愿意将全功能的VisualStudio移植到MacOS平台,假设微软带着VisualStudio威力还是有点大的,不过这也可能反过来威胁到Windows的地位。

大数据处理为何选择spark

spark是大数据时代的产物,可以基于hdfs存储的海量数据,分布式的处理各个数据节点上的任务。spark将大型计算任务分解为有向无环图,按照拓扑顺序执行图中的task,配合yarn的调度能充分有效的利用分布式系统的计算资源(主要是cpu和内存)。spark相对于mapreduce的改进是可以基于内存计算(内存不够的再存磁盘),而mapreduce是基于磁盘的计算,因此spark计算速度是相当快的,可以将普通mapreduce的耗时压缩数10倍,我们日常工作中可以早点处理完数据提前下班。

大数据的场景下如果用传统的mysql数据库通过sql查询需要费很大精力去分库分表,维护数据,还得经常面临数据库查询慢的问题,还是得有基于hdfs的数据仓库,使用spark来做数据处理,快使用spark吧!

大数据时代,大数据培训都学些什么呢

大数据培训不是你想学什么就学什么,那是按照培训的课程来安排所学的内容,我没有去培训过,我认为培训的内容肯定多!

为什么感觉Java越来越倾向于函数式编程是由实际问题驱动的吗

一切都是为了简洁!

长期以来JAVA作为面向对象的代表语言占据着开发语言的榜首,面向对象的三大特性是继承,多态,封装,这就意味着面向对象的开发先从定义对象开始,即便是一个很简单的功能也有着相对冗长繁杂的代码!

JAVA语言凭借着成熟的技术社区和丰富的类库,还有模范化的开发模式一直都是企业级应用的宠儿,但正是因为此,冗余代码,复杂开发饱受诟病!为了改变这一现象,oracle在收购JAVA之后,一直致力于JAVA的简洁化开发,最近几年很流行的编程语言scala等,因为其不仅融入了面向对象的思想,还有函数式编程的特点,非常符合现如今简洁开发的理念!

JAVA开始瞄准scala,因为scala本就在jvm中运行,其脚本化,函数式的特性正是JAVA所需要的,JAVA8中加入了lambda表达式与函数式接口,能方便的进行函数式的开发工作,虽然相比koltlin,scala还略显啰嗦,但总算是撬开了函数式的大门!

总之,以后的JAVA新版本会提供更多的函数式开发的兼容开发,不是说函数式比面向对象语言好,而是能各取所需,走向更美好的明天,以后的编程语言是不是就没有特性之分了,值得期待。。

最新文章