1.Alluxio 客户端源码分析
2.javaå¹è®ä¸»è¦å¦ä»ä¹ï¼
3.要成为一名专业的源码程序员,从零开始需要怎么一步步来比较好,源码要把最底层的源码先学精通吗?(个人认为)求学长
4.大数据技术之Datax
5.å¦ä½åå¸å¼è¿è¡mapreduceç¨åº
6.如何更改 datax 以支持hive 的 DECIMAL 数据类型?
Alluxio 客户端源码分析
Alluxio是一个用于云分析和人工智能的开源数据编排技术,作为分布式文件系统,源码采用与HDFS相似的源码主从架构。系统中包含一个或多个Master节点存储集群元数据信息,源码公众号租车系统源码以及Worker节点管理缓存的源码数据块。本文将深入分析Alluxio客户端的源码实现。
创建客户端逻辑在类alluxio.client.file.FileSystem中,源码简单示例代码如下。源码
客户端初始化包括调用FileSystem.Context.create创建客户端对象的源码上下文,在此过程中需要初始化客户端以创建与Master和Worker连接的源码连接池。若启用了配置alluxio.user.metrics.collection.enabled,源码将启动后台守护线程定时与Master节点进行心跳传输监控指标信息。源码同时,源码客户端初始化时还会创建负责重新初始化的后台线程,定期从Master拉取配置文件的哈希值,若Master节点配置发生变化,则重新初始化客户端,期间阻塞所有请求直到重新初始化完成。
创建具有缓存功能的客户端在客户端初始化后,调用FileSystem.Factory.create进行客户端创建。客户端实现分为BaseFileSystem、MetadataCachingBaseFileSystem和LocalCacheFileSystem三种,其中MetadataCachingBaseFileSystem和LocalCacheFileSystem对BaseFileSystem进行封装,提供元数据和数据缓存功能。BaseFileSystem的spark随机森林源码调用主要分为三大类:纯元数据操作、读取文件操作和写入文件操作。针对元数据操作,直接调用对应GRPC接口(例如listStatus)。接下来,将介绍客户端如何与Master节点进行通信以及读取和写入的流程。
客户端需要先通过MasterInquireClient接口获取主节点地址,当前有三种实现:PollingMasterInquireClient、SingleMasterInquireClient和ZkMasterInquireClient。其中,PollingMasterInquireClient是针对嵌入式日志模式下选择主节点的实现类,SingleMasterInquireClient用于选择单节点Master节点,ZkMasterInquireClient用于Zookeeper模式下的主节点选择。因为Alluxio中只有主节点启动GRPC服务,其他节点连接客户端会断开,PollingMasterInquireClient会依次轮询所有主节点,直到找到可以连接的节点。之后,客户端记录该主节点,如果无法连接主节点,则重新调用PollingMasterInquireClient过程以连接新的主节点。
数据读取流程始于BaseFileSystem.openFile函数,首先通过getStatus向Master节点获取文件元数据,然后检查文件是否为目录或未写入完成等条件,若出现异常则抛出异常。寻找合适的Worker节点根据getStatus获取的文件信息中包含所有块的信息,通过偏移量计算当前所需读取的c 项目源码 github块编号,并寻找最接近客户端并持有该块的Worker节点,从该节点读取数据。判断最接近客户端的Worker逻辑位于BlockLocationUtils.nearest,考虑使用domain socket进行短路读取时的Worker节点地址一致性。根据配置项alluxio.worker.data.server.domain.socket.address,判断每个Worker使用的domain socket路径是否一致。如果没有使用域名socket信息寻找到最近的Worker节点,则根据配置项alluxio.user.ufs.block.read.location.policy选择一个Worker节点进行读取。若客户端和数据块在同一节点上,则通过短路读取直接从本地文件系统读取数据,否则通过与Worker节点建立GRPC通信读取文件。
如果无法通过短路读取数据,客户端会回退到使用GRPC连接与选中的Worker节点通信。首先判断是否可以通过domain socket连接Worker节点,优先选择使用domain socket方式。创建基于GRPC的块输入流代码位于BlockInStream.createGrpcBlockInStream。通过GRPC进行连接时,每次读取一个chunk大小并缓存chunk,减少RPC调用次数提高性能,chunk大小由配置alluxio.user.network.reader.chunk.size.bytes决定。
读取数据块完成后或出现异常终止,Worker节点会自动释放针对该块的写入锁。读取异常处理策略是记录失败的Worker节点,尝试从其他Worker节点读取,直到达到重试次数上限或没有可用的Worker节点。
若无法通过本地Worker节点读取数据,持仓对比指标源码则客户端尝试发起异步缓存请求。若启用了配置alluxio.user.file.passive.cache.enabled且存在本地Worker节点,则向本地Worker节点发起异步缓存请求,否则向负责读取该块数据的Worker节点发起请求。
数据写入流程首先向Master节点发送CreateFile请求,Master验证请求合法性并返回新文件的基本信息。根据不同的写入类型,进行不同操作。如果是THROUGH或CACHE_THROUGH等需要直接写入底层文件系统的写入类型,则选择一个Worker节点处理写入到UFS的数据。对于MUST_CACHE、CACHE_THROUGH、ASYNC_THROUGH等需要缓存数据到Worker节点上的写入类型,则打开另一个流负责将每个写入的块缓存到不同的Worker上。写入worker缓存块流程类似于读取流程,若写入的Worker与客户端在同一个主机上,则使用短路写直接将块数据写入Worker本地,无需通过网络发送到Worker上。数据完成写入后,客户端向Master节点发送completeFile请求,表示文件已写入完成。
写入失败时,取消当前流以及所有使用过的输出流,删除所有缓存的块和底层存储中的数据,与读取流程不同,写入失败后不进行重试。软件加验证源码
零拷贝实现用于优化写入和读取流程中WriteRequest和ReadResponse消息体积大的问题,通过配置alluxio.user.streaming.zerocopy.enabled开启零拷贝特性。Alluxio通过实现了GRPC的MethodDescriptor.Marshaller和Drainable接口来实现GRPC零拷贝特性。MethodDescriptor.Marshaller负责对消息序列化和反序列化的抽象,用于自定义消息序列化和反序列化行为。Drainable扩展java.io.InputStream,提供将所有内容转移到OutputStream的方法,避免数据拷贝,优化内容直接写入OutputStream的过程。
总结,阅读客户端代码有助于了解Alluxio体系结构,明白读取和写入数据时的数据流向。深入理解Alluxio客户端实现对于后续阅读其他Alluxio代码非常有帮助。
javaå¹è®ä¸»è¦å¦ä»ä¹ï¼
åè¿æ ·çé®é¢ï¼æå·²ç»åçäºå¾å¤æ¬¡ï¼ç°å¨å¾å¤æ°æï¼ç¹å«æ¯ååå ¥è¡æ³å¦javaçåå¦ï¼ä¸ç¥é该ä»åªéå ¥æï¼ææ¯å¨æé½è¯¾å·¥åºå¦javaå ¥çè¡ï¼ç°å¨å·²åæèå¸æºï¼ææ´çäºä¸äºjavaçç¥è¯ç¹ï¼ä¸å ±å为å 个é¶æ®µï¼ä¸ªæè½ç¹ï¼ç¬¬ä¸é¶æ®µã第äºé¶æ®µã第ä¸é¶æ®µã第åé¶æ®µæ¯å¿ é¡»è¦ææ¡çï¼å¾å¤æºæ忽æ 人ï¼å°±åªå¦å°ç¬¬åé¶æ®µï¼ç¬¬äºé¶æ®µå第å é¶æ®µå°±æ¯é«èªãé«èçä¿éï¼å°±è¯´è¯´æ³é«èªå¿ é¡»å¾æåé¢ä¸¤ä¸ªé¶æ®µçç»ææ¡äºï¼èéï¼è§å¾åéé纳ä¸åã第ä¸é¶æ®µï¼javaåºæ¬åä¿®ç¼
1. 认è¯è®¡ç®æºç¡¬ä»¶
2. 计ç®æºç»æåç
3. 计ç®æºè½¯ä»¶ç¥è¯
4. 计ç®æºç½ç»ç¥è¯
5. 常ç¨ç½ç»åºç¨æä½
6. 认è¯è®¡ç®æºç æ¯
7. é»è¾è®ç»
8. åè¯Java
9. åéåæ°æ®ç±»å
. éæ©ç»æ
. 循ç¯ç»æfor
. 循ç¯ç»ædo-while
. 循ç¯ç»æwhile
. å¤é循ç¯åç¨åºè°è¯
. 循ç¯è¿é¶
. ä¸ç»´æ°ç»åç»å ¸åºç¨
. äºç»´æ°ç»
. 认è¯ç±»ä¸å¯¹è±¡
. æ¹æ³åæ¹æ³éè½½
. å°è£ ä¸ç»§æ¿
. æ¹æ³éåä¸å¤æ
. 项ç®å®æ-汽车ç§èµç³»ç»
. æ½è±¡ç±»åæ¥å£
. å¼å¸¸
. 项ç®å®æ-QuickHit
. Java ä¸çéåç±»å
. List éå
. Set éå
. HashMap éå
. Iterator
. Collections ç®æ³ç±»å常ç¨æ¹æ³
. enum
. å è£ ç±»åè£ ç®±æç®±
. StringãStringBuffer 类常ç¨æ¹æ³æä½å符串
. DateãCalendar
. Math 类常ç¨æ¹æ³
. IO/NIO
. åèè¾å ¥æµ(InputStreamãFileInputStreamãBufferedInputStream)
. åèè¾åºæµ(OutputStreamãFileOutputStreamãBufferedOutputStream)
. å符è¾å ¥æµ(ReaderãInputStreamReaderãFileReader BufferedReader)
. åèè¾åºæµ(WriterãOutputStreamWriterãFileWriterãBufferedWriter)
. æ件å¤å¶
. SerializeãDeserialize
. èåºæååï¼å象éæ¶é´ç®¡çä¸ç²¾å管ç
. å¤çº¿ç¨(ThreadãRunnable)
. Thread LifeCycle
. 线ç¨çè°åº¦
. 线ç¨çåæ¥åæ»é
. Thread Pool
. èåºæååï¼å¢éåä½
. Socket(TCPãUDP)
. XML æ¦å¿µãä¼å¿ãè§è
. XML ä¸ç¹æ®å符çå¤ç
. 使ç¨DOM 读åãæ·»å ãå é¤ã解æ XML æ°æ®
第äºé¶æ®µï¼javawebå¼å
. æ建åé ç½®MySQL æ°æ®åº
. æ°æ®åºå¢ãå ãæ¥ãæ¹è¯å¥
. äºå¡
. è§å¾
. æ°æ®åºå¤ä»½ä¸æ¢å¤
. æ°æ®åºç¨æ·ç®¡ç
. æ°æ®åºè®¾è®¡
. 项ç®å®æ-é¶è¡ATM åå款æºç³»ç»
. èµ°è¿ HTML åCSS
. åè¡¨è¡¨æ ¼å表åç¾å
. CSS é«çº§æä½
. Bootstrap
. CSS ç»ä»¶
. JavaScript é¢å对象
. JavaScript å¤æã循ç¯
. JavaScript éå
. JavaScript è¯æ³
. Bootstrap 综åæ¡ä¾
. HTML5ãCSS3
. jQuery åºç¡
. jQuery åºæ¬æä½
. jQuery äºä»¶ä¸ç¹æ
. jQuery Ajax
. jQuery æ件
. æ建Web ç¯å¢åè¯JSP
. JSP ä¹å¤§å 置对象
. JSP å®ç°æ°æ®ä¼ éåä¿å
. JDBC
. åä¾æ¨¡å¼ãå·¥å模å¼
. MVCãä¸å±æ¨¡å¼
. Commons-fileuploadãCKEditor
. å页æ¥è¯¢
. EL ä¸ JSTL
. Servlet ä¸Filter
. Listener ä¸MVC
. Ajax ä¸ jQuery
. jQuery çAjax 交äºæ©å±
. 项ç®å®æâ使ç¨Ajax ææ¯æ¹è¿æ°é»åå¸ç³»ç»
. åå°
. Linux ç³»ç»çå®è£
. å¨Linux ä¸ç®¡çç®å½åæ件
. å¨Linux ä¸ç®¡çç¨æ·åæé
. å¨Linux æå¡å¨ç¯å¢ä¸å®è£ 软件åé¨ç½²é¡¹ç®
. èåºæååï¼èåºæ²é
第ä¸é¶æ®µï¼ ä¼ä¸çº§æ¡æ¶å¼å
. MyBatis ç¯å¢æ建
. SQL æ å°æ件
. å¨æSQL
. MyBatis æ¡æ¶åç
. Spring IOC
. æé æ³¨å ¥ãä¾èµæ³¨å ¥ã注解
. Spring æ´åMyBatis(SqlSessionTemplateãMapperFactoryBeanãäºå¡
å¤ç)
. Spring æ°æ®æº(å±æ§æ件ãJNDI)ãBean ä½ç¨å
. Spring æ¡æ¶çè¿è¡åç
. SpringMVC ä½ç³»æ¦å¿µ
. SpringMVC ä¹æ°æ®ç»å®ãæ°æ®æéªã
. SpringMVC ä¹è§å¾åè§å¾è§£æ
. SpringMVC ä¹æ件ä¸ä¼ ãæ¬å°å解æ
. SpringMVC ä¹éæèµæºå¤çã请æ±æ¦æªå¨ãå¼å¸¸å¤ç
. Oracle æ°æ®åºç¯å¢æ建ãå®è£
. Oracle æ°æ®åº SQLãå页ãå¤ä»½ãè¿å
. Hibernate æ¦å¿µãä¾èµ
. HQL æ¥è¯¢è¯è¨
. Hibernate ä¸é ç½®å ³èæ å°
. HQL è¿æ¥æ¥è¯¢ä¸ Hibernate 注解
. Struts 2 æ¦å¿µãä¾èµ
. Struts 2 é ç½®
. OGNL 表达å¼
. Struts 2 æ¦æªå¨
. SSH æ¡æ¶æ´å
. 使ç¨Maven æ建项ç®
. 使ç¨Struts 2 å®ç°Ajax
. Jsoup ç½ç»ç¬è«
. å¤çº¿ç¨ç½ç»ç¬è«
. åç¬åååç¬çç¥
. éç¨ç¬è«è®¾è®¡
. Echart å¾è¡¨åæ
. IKAnalyzer åè¯
. ä¼ä¸æ¡æ¶é¡¹ç®å®æ-代çå管çç³»ç»
. ä¼ä¸æ¡æ¶é¡¹ç®å®æ-SL ä¼ååå
. ä¼ä¸æ¡æ¶é¡¹ç®å®æ-ä¼å管çç³»ç»
.ä¼ä¸æ¡æ¶é¡¹ç®å®æ-äºèç½æèä¿¡æ¯ééåæå¹³å°
第åé¶æ®µï¼ åå端å离å¼å
. GitHub
. Git åºç¡(checkoutãpullãcommitãpushãmerge ç)
. Git è¿é¶(å¤åæ¯åä½)
. GitLab
. IDEA ç使ç¨
. Maven ä»ç»(æ¦å¿µãä»åºãæ建ãå½ä»¤)
. 使ç¨Maven æ建WEB 项ç®
. 使ç¨Maven æ建å¤æ¨¡å项ç®
. 使ç¨Maven æ建ç§æä»åº
. Scrum æ¡æ¶ä»ç»(ä¸ä¸ªè§è²ãä¸ä¸ªå·¥ä»¶ãå个ä¼è®®)
. Scrum Team ç»å»ºå¢é
. 产åéæ±åç¨æ·æ äº
. æ¯æ¥ç«ä¼
. 使ç¨ææ·-Scrum æ¹å¼å¼å管çå®æ
. åå端å离ãåå¸å¼é群æ¶æãåç´æ¶æ
. SSMï¼SpringMVC+Spring+MyBatisï¼æ´åå®æ
. GitãMaven ç§æNexus
. 第ä¸æ¹æ¥å ¥ææ¯ï¼å¾®ä¿¡ãé¿éï¼
. MySQL çµåå®æ
. Redisï¼ç¼åæå¡ï¼
. æç´¢å¼æ-Solr
. éæAPI Doc å·¥å ·-Swagger
. å¾çèªå¨åå¤çï¼Tengine+LUA+GraphicsMagic
. ææºãé®ç®±æ³¨å
. åç¹ç»å½ Token
. OAuth2.0 认è¯
. Jsoup ç½ç»ç¬è«(å¤çº¿ç¨ç¬è«/代ç IP ç¬è«)
. ExecutorService 线ç¨æ±
. IK ä¸æåè¯
. Postman
. ReactJS
. webpack
. èåºæååï¼ç®åæ°å
. ç¨åºç¿é¢è¯å®å ¸ä¹é¡¹ç®é¢è¯
.大åäºèç½æ 游çµå项ç®å®æ-ç±æ è¡
第äºé¶æ®µï¼ åå¸å¼å¾®ææ¶æå¼å
. Spring Boot ç¯å¢æ建
. Spring Boot 常ç¨æè½
. Spring Boot æ´åRedis
. Spring Boot æ´åMybatis
. å¾®æå¡æ¶æåæ¶æ设计
. æ¶æ¯éå
ActiveMQ\RabbitMQ
. åå¸å¼äºå¡
. åå¸å¼é Redis-setnx
. Zookeeper 注åä¸å¿
. åºäº ActiveMQ å®ç°é«å¹¶å
. Docker ç¯å¢æ建
. Docker éåå é
. Docker 容å¨ç®¡ç
. Docker éå管ç
. Docker 容å¨æ件å¤ä»½
. Dockerfile
. Docker ç§æä»åº
. çå®äºèç½é«å¹¶åçµå项ç®å®æ-ååä¸æ¢è´
. å¯è§åçæ§ Portainer
. Docker Compose 容å¨ç¼æ
. Docker Compose æ©å®¹ã缩容
. Docker Swarm é群ç¼æ
. Jenkins å®è£ ãæ件é ç½®
. Jenkins é ç½®æ®éä»»å¡
. Jenkins é 置管éä»»å¡
. Jenkins èªå¨åå¸æå¡
. Spring Cloud Eureka
. Spring Cloud Feign
. Spring Cloud Ribbon
. Spring Cloud Zuul
. Spring Cloud Config
. Spring Cloud Hystrix
. Spring Cloud Sleuth
. Spring Boot Admin
.Eureka 注ååçæ¢ç§
. Spring Cloud 大å解读
. Zipkin
. Zipkin æ´åRabbitMQ
. Zipkin æ´åMySQL
. ELK æ¥å¿æ¶é
.Kafka
. Elasticsearch æ å°ç®¡ç
. Elasticsearch æ¥è¯¢/å¤åæ¥è¯¢
. Elasticsearch é群/é群è§å
. Elasticsearch èå
. Elasticsearch é群çæ§
. Elasticsearch æ件
(Head/BigDesk)
. Mycat 读åå离
. Mycat ä¸ä¸»å¤ä»
. Mycat å¤ä¸»å¤ä»
. Mycat æ°æ®åç
. Redis
. Redis-Redlock
. Elasticsearch ç¯å¢æ建
. Elasticsearch 客æ·ç«¯
. Elasticsearch ç´¢å¼ç®¡ç
. Elasticsearch æ档管ç
. Mycat é群
. Jmeter 并åæµè¯
. Jmeter çææµè¯æ¥å
. 微信ç»å½
. 微信æ¯ä»
. æ¯ä»å®æ¯ä»
. ç¾åº¦å°å¾
. Sonar æ¬å°æ£æµ
. Sonar +Jenkins 线ä¸æ£æµ
. CI/CD
. Spring Boot æ¹é ç±æ è¡é¡¹ç®å®æ
. 大åäºèç½ç¥¨å¡ç±»çµå项ç®å®æ-å¤§è§ ç½
. ES6 æ¦å¿µ(lesãconst)
. ES6 对象åæ°ç»
. ES6 å½æ°æ©å±
. VUE ç¯å¢æ建
. VUE.JS æ令
.VUE 交äº
. VUE å®ä¾çå½å¨æ
. VUE ç»ä»¶
. VUE 项ç®ç¯å¢é ç½®ååæ件ç»ä»¶
.VUE è·¯ç±
第å é¶æ®µï¼ccæå¡
. Spring Cloud Gateway
. Consul
. Nacos
. EurekaãConsuãlNacosãZookeeper 对æ¯åæ
. Prometheus + Grafana
. ES åå¸å¼åå¨åç
. NoSQL æ°æ®åºè§£å³æ¹æ¡(RedisãMongoDB)
. OAuth2.0 认è¯( authorization code 模å¼)
. OAuth2.0 认è¯( implicit 模å¼)
. OAuth2.0 认è¯( resource owner password credentials 模å¼)
. OAuth2.0 认è¯( client credentials 模å¼)
. NAS/FastDFS åå¸å¼æ件åå¨
. Python åºç¡
. Python ç¬è«
. 大æ°æ®å Hadoop æ¦è¿°
. åå¸å¼æä»¶ç³»ç» HDFS
. åå¸å¼è®¡ç®æ¡æ¶MapReduce
. åå¸å¼åå¼æ°æ®åº HBase
. Hadoop 综ååºç¨
. é¢è¯å¤§å±è§
. èä¸è§å
. 项ç®é¢è¯
. å ·ä½ä¸å¡åºæ¯å解å³æ¹æ¡
. æ´å¤ææ¯ä¸é¢æç»å¢å ä¸
æ估计è½æä½ çæï¼æä¸æ¸ æ¥çå¯ä»¥ç§ä¿¡æ
要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层的先学精通吗?(个人认为)求学长
前言
你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)
建议:
不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少年通用。
回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。
一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。
一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。
注:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:
现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。
越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。
微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《Windows编程革命史》
所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。
启蒙入门
1、 学习一门脚本语言,例如Python/Ruby
可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:
处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)
遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量
学会用各种print之类简单粗暴的方式进行调试
学会用Google (phrase, domain, use reader to follow tech blogs)
为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。
2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
Source Insight (或 ctag)
使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。
3、 熟悉Unix/Linux Shell和常见的命令行
如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧
一定要少用少用图形界面。
学会使用man来查看帮助
文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
学会使用一些文本操作命令 sed/awk/grep/tail/less/more …
学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd…
了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
了解正则表达式,使用正则表达式来查找文件。
对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。
4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)
未来必然是Web的世界,学习WEB基础的最佳网站是W3School。
学习HTML基本语法
学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)
学会用 Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。
学习使用Javascript操纵HTML元件。理解DOM和动态网页(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 网上有免费的章节,足够用了。或参看 DOM 。
学会用 Firefox + Firebug 或 chrome 调试Javascript代码(设置断点,查看变量,性能,控制台等)
在一台机器上配置Apache 或 Nginx
学习PHP,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。
把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)
跟完一个名校的网络编程课程(例如:.etrans.anaSpeed.AnaActionMr.run(AnaActionMr.java:)
ããat org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:)
ããat com.etrans.anaSpeed.AnaActionMr.main(AnaActionMr.java:)
ããat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
ããat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
ããat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
ããat java.lang.reflect.Method.invoke(Method.java:)
ããat org.apache.hadoop.util.RunJar.main(RunJar.java:)
ãã第äºç¹ç»è®ºå°±æ¯ï¼ Linuxä¸ï¼åªéæ·è´jaræ件å°é群masterä¸,æ§è¡å½ä»¤hadoop jarPackage.jar MainClassNameå³å¯åå¸å¼è¿è¡mapreduceç¨åºã
如何更改 datax 以支持hive 的 DECIMAL 数据类型?
在处理数据时,我们经常需要将数据从一种数据类型转换为另一种数据类型。在数据迁移任务中,如果涉及到使用datax进行数据迁移,且源数据或目标数据中出现了Hive的DECIMAL数据类型,那么如何确保数据迁移的准确性和完整性就成为了一个关键问题。本文将详细介绍如何更改datax以支持Hive的DECIMAL数据类型。
在JAVA中,主要使用float/double和BigDecimal来存储小数。其中,float和double在不需要完全精确的计算结果的场景下,可以提供较高的运算效率,但当涉及到金融等场景需要精确计算时,必须使用BigDecimal。
Hive支持多种数字类型数据,如FLOAT、DOUBLE、DECIMAL和NUMERIC。DECIMAL数据类型是后加入的,允许设置精度和标度,适用于需要高度精确计算的场景。
若要使datax支持Hive的DECIMAL数据类型,关键在于修改datax源码,增强其对DECIMAL数据的读取和写入能力。主要通过以下几个步骤:
1. **修改HDFS Reader**:在处理Hive ORC文件时,需要修改HDFS Reader插件中的相关类和方法,如DFSUtil#transportOneRecord。通过该步骤,确保能正确读取到ORC文件中的DECIMAL字段。datax的Double类型可以通过其内部的rawData字段存储数据的原始内容,支持Java.math.BigDecimal和Java.lang.Double,因此可以实现不修改HDFS Reader代码,直接读取并处理DECIMAL数据的目标。配置作业时,将Hive的DECIMAL字段指定为datax的Double类型,HDFS Reader在底层调用Hive相关API读取ORC文件中的DECIMAL字段,将其隐式转换为Double类型。datax的Double类型支持Java.math.BigDecimal和Java.lang.Double,确保后续写入操作的精度。
2. **修改HDFS Writer**:为了支持写入数据到Hive ORC文件中的DECIMAL字段,同样需要在HDFS Writer插件中进行相应的代码修改。修改后的代码确保能够将datax的Double字段正确写入到Hive ORC文件中的DECIMAL字段。使用方法com.alibaba.datax.common.element.DoubleColumn#asBigDecimal,基于DoubleColumn底层rawData存储的原始数据内容,将字段值转换为合适的外部数据类型。这一过程不会损失数据精度。
综上所述,通过修改datax的HDFS Reader和Writer插件,实现对Hive DECIMAL数据类型的读取和写入支持,确保数据迁移过程的准确性和完整性,从而满足复杂数据迁移场景的需求。