---
# System prepended metadata

title: Data Engineer
tags: [Data Engineer]

---

# Data Engineer

主要的工作內容是對資料的處理，如何取得資料、如何存放資料、如何整理資料．如果在資料量不多的情況下，可以寫程式看是從什麼地方取得，處理過後存成檔案、或個熟悉的 DB 存，效能跟硬體上都會是太大的問題．但在當數據非常大的情況下，所有的情況都必須考量了．

如何取得資料 ?
資料來源又有分為 batch 以及 streaming 兩種方式．batch 的方式例如每小時會送 1T 的檔案進來，那寫的程式就必須保證能在一小時以內把這 1T 的資料消化完．否則下一個小時又有 1T 進來，最後就會導致後面的檔案一直排隊永遠處理不完．streaming 的話例如 sensor 會一直不斷發送訊號出來，直到該 sensor 也許哪天壞掉才會停止．這種會一直源源不絕的送進來的資料就可以稱為 streaming data．那程式就必須保證能消化每次送來的資料．否則也會造成永遠處理不完的情況． batch data 就像跑 for 迴圈，會知道 max 的值(1T)，知道何時會停止．而 streaming data 就像是無窮迴圈，會不斷的一直執行．

如何存放資料 ?
從上面的例子來看假設每一小時 1T 的檔案，很順利的能夠在一小時處理完，但一天下來就會有 24T 的檔案要存，硬碟很快的就會容量不夠．streaming data 也是一樣，假設每秒來個 100M，一分鐘就 6G，一小時也就 360G 一直執行下來硬碟也是很快就不夠了．

如何整理資料 ?
前兩項的問題如果都解決，資料都存好了．那接下來就要來思考如何使用這些資料，不然存在那邊沒有使用也是無法產生資料的價值．但日積月累存下來的這些資料會變得非常龐大，查詢時一定會變得非常緩慢．而且又會根據分析的內容，也許要跑些複雜的演算法．能夠整理出有價值的資料，提供給人或系統使用，當然是越快越好．才能夠提早分析或運用．所以處理的效能又是一個問題．

所以想當一位 Data Engineer 必須要不斷思考如何解決上面的三項問題．

那資料整理好資後，Data Scientist 就可以運用整理好的資料來做分析或著 train model．所以 Data Engineer 也會很常要與 Data Scientist 合作．

當要處理 Data 的流程如果再分細一點可以分為

1. 生-資料源(影片、照片、Log、DB...)
2. 流-網路協定(syslog、FTP...)
3. 蒐-前處理(Fluentd、Sqoop...)
4. 存-儲存方式(HDFS、HBase、Cassandra...)
5. 取-取得方式(File Input/Otput、DB Input/Output、Thrift...)
6. 算-資料處理(Map Reduce、Spark、Pig...)
7. 析-資料分析(Hive、Spark、Impala...)
8. 用-視覺化(kibana、grafana、tableau...)
9. 看-解讀(Web、Mobile、App...)
11. 變-行動

如果是 streaming data 的話 4、5 項會變成

4. 佇-串流佇列
5. 濾-串流過濾

Data Engineer 的工作主要會是 1 ~ 6 項，7 ~ 10 則偏向 Data Scientist 的工作．所以當 Big Data 以及 AI 時代的來臨，如何建立好這一串完善的流程與架構是非常重要的一件事．


Job Description 
---
接著來挑一些有關要找 Data Engineer 的公司需要的工作內容
- 負責 Big Data 處理，開發和維護客制化的搜尋引擎，確保毎天 1+ Billion 的文件在自然語言、電腦視覺及 AI 模組分析的過程中，能即時且精確的供前端搜尋使用 ! 
- 深入理解主流數據挖掘演算法及原理，能夠根據業務場景建立挖掘模型，選擇最高效的演算法實現。
- Develop, operate, and monitor ETL for data collection, cleansing, processing, storage, and analytics
- Develop data visualization to track data usage, server status, and represent data insights 
- 設定並實作 Data Pipeline，將不同來源及不同特性的資料，自動化統一整理和歸納
- 協助開發資料分析介面 Data Visualization 
- 規劃大數據資料倉儲與應用平台(如：機器學習平台、商業智慧工具)架構



Required Skills & Experience 
---
Data Engineer 需要的技術，看了許多公司其實非常廣，這裡列出一些，但對於這些技術主要也是圍繞在處理資料(spark、kafka、Flink...)、儲存資料(NoSQL、HDFS...)、運算資料(spark、MapReduce...)．
- Good programming skills in Python, Java, or Scala,GO or C
- Experience in NoSQL, e.g. Cassandra, HBase, and cloud computing
- Experience in message queue, e.g. Kafka, RabbitMQ.
- Experience in Apache Spark or Apache Flink.
- Familiar with Hadoop ecosystem, Spark, Kafka, Hive 


Preferred Qualifications
---
偏好的一些資格
- Strong algorithmic background
- Good understanding of fundamentals of SQL / NoSQL; Experience working with large datasets is a plus
- Familiar with parallel computing
- Machine Learning / Text mining / Hadoop ecosystem / ELK / Big Data 相關開發經驗尤佳

Prepare
---
面試時可以多準備的一些東西
- LeetCode
- codingame
- Data structure
- Algorithmic
- English

技術非常多，可以先看看想去公司的職缺都需要哪些技術，再從那些技術做準備．了解技術時可以從下面幾點去學習 : 
1. 特色
2. 核心概念
3. 優點(適合用在哪裡)
4. 缺點(不適合用在哪裡)
5. 遇過問題以及解決方式

others
---
這邊列出一些聽到的技術
- apache Airflow
- apache Superset
- apache predictionio
- apache nifi
- AWS EMR
- Amazon DynamoDB

My Learn
---
- hadoop(HDFS、Yarn)
- spark
- kafka
- redis
- cassandra
- scala、go
- docker
- grafana、prometheus
- zeepline

###### tags: `Data Engineer`