在您自己的數據科學項目上工作是學習一些新技能和磨練現有技能的絕好機會,但是如果您想使用行業中使用的技術,例如Hadoop,分佈式集群上的Spark,Hive等,以及 他們都融合了嗎? 我相信這是建立自己的基礎架構時價值的來源。
您會熟悉這些技術,瞭解它是如何工作的來龍去脈,調試並體驗不同類型的錯誤消息,並真正瞭解該技術在整個系統中的工作方式,而不僅僅是與之交互。 如果通常還使用自己的私有數據或機密數據,則出於隱私或安全原因,您可能不希望將其上載到外部服務以進行大數據處理。 因此,在本教程中,我將逐步介紹如何在自己的計算機,家庭實驗室等上設置自己的大數據基礎架構。我們將設置一個單節點Hadoop&Hive實例和一個"分佈式" spark實例。 與Jupyter集成。
本教程不適用於工業生產安裝!
先決條件
· 基於Debian的發行版-Ubuntu,Pop-os等
· 基本的命令行知識有幫助,但對安裝不是必不可少的
步驟1 —下載Hadoop和Hive
Hadoop無疑是當今行業中最常用的大數據倉庫平臺,並且對於任何大數據工作都是必不可少的。 簡而言之,Hadoop是一個開放源代碼軟件框架,用於在大型(或廉價的水平擴展)硬件集群上以分佈式方式存儲和處理大數據。 您可以從此處下載最新版本。
通常將Hive添加到hadoop之上,以類似SQL的方式查詢Hadoop中的數據。 蜂巢使工作容易執行
· 數據封裝
· 臨時查詢
· 龐大的數據集分析
Hive相當慢,通常僅用於批處理作業。 較快的Hive版本將類似於Impala,但對於家庭使用來說,它可以完成工作。 您可以在此處下載最新版本的Hive。
確保您下載的是二進制(bin)版本而不是源(src)版本!
將文件解壓縮到/ opt
cd ~/Downloads
tar -C /opt -xzvf apache-hive-3.1.2-bin.tar.gz
tar -C /opt -xzvf hadoop-3.1.3-src.tar.gz
將它們重命名為蜂巢和Hadoop。
cd /opt
mv hadoop-3.1.3-src hadoop
mv apache-hive-3.1.2-bin hive
步驟2 —設置授權(或無密碼)SSH。
為什麼我們需要這樣做? Hadoop核心使用Shell(SSH)在從屬節點上啟動服務器進程。 它要求主機與所有從機和輔助計算機之間的無密碼SSH連接。 如果您沒有此資源,而我們處於完全分佈式的環境中,則必須手動轉到每個節點並啟動每個過程。
由於我們僅運行Hadoop的單個實例,因此我們可以省去設置主機名,ssh密鑰,將它們添加到每個框等的麻煩。如果是分佈式環境,最好創建一個hadoop用戶, 但是因此可以為個人使用而設置單個節點的好處。
真正簡單易用,僅適合家庭使用,不應在其他任何地方使用或完成:
cat 〜/ .ssh / id_rsa.pub >>〜/ .ssh / authorized_keys
現在運行ssh localhost,您應該可以不用密碼登錄。
要了解在分佈式環境中設置網絡和SSH配置所需的知識,可以閱讀以下內容。
第3步-安裝Java 8
可以說,本教程是最重要的步驟之一。
如果做錯了,將導致花費大量時間調試模糊的錯誤消息,只是為了意識到問題所在,解決方案是如此簡單。
Hadoop有一個主要要求,這是Java版本8。有趣的是,這也是Spark的Java要求,也非常重要。
sudo apt-get updatesudo apt-get install openjdk-8-jdk
驗證Java版本。
如果由於某種原因在上方看不到輸出,則需要更新默認的Java版本。
sudo update-alternatives –config Java
選擇與Java 8相關的編號。
再次檢查版本。
Java版本
步驟4 —配置Hadoop + Yarn
Apache Hadoop YARN(另一個資源協商者)是一種集群管理技術。 從根本上講,它可以幫助Hadoop管理和監視其工作負載。
初始Hadoop設置
首先,讓我們設置環境變量。 這些將告訴其他組件每個組件的配置位於何處。
nano 〜/ .bashrc
將此添加到您的.bashrc文件的底部。
export HADOOP_HOME=/opt/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
export HIVE_HOME=/opt/hive
export PATH=$PATH:$HIVE_HOME/bin
保存並退出nano CTRL + o,CTRL + x。
然後,我們需要通過運行源〜/ .bashrc激活這些更改。 您也可以關閉並重新打開終端以達到相同的結果。
接下來,我們需要建立一些目錄並編輯權限。 製作以下目錄:
sudo mkdir -p /app/hadoop/tmp
mkdir -p ~/hdfs/namenode
mkdir ~/hdfs/datanode
編輯/ app / hadoop / tmp的權限,授予其讀取和寫入訪問權限。
sudo chown -R $USER:$USER /app
chmod a+rw -R /app
配置文件
所有Hadoop配置文件都位於/ opt / hadoop / etc / hadoop /中。
cd / opt / hadoop / etc / hadoop
- core-site.xml- hadoop-env.sh- hdfs-site.xml- mapred-site.xml- yarn-site.xml
core-site.xml
<configuration> <property> <name>hadoop.tmp.dir/<name> <value>/app/hadoop/tmp/<value> <description>Parent directory for other temporary directories./<description> /<property> <property> <name>fs.defaultFS /<name> <value>hdfs://YOUR_IP:9000/<value> <description>The name of the default file system. /<description> /<property>/<configuration>
hadoop.tmp.dir:可以自我解釋,只是hadoop用來存儲其他臨時目錄的目錄fs.defaultFS:文件系統的IP和端口,可以通過網絡進行訪問。 它應該是您的IP,以便其他節點可以連接到它(如果這是分佈式系統)。
要找到您的IP,請在命令行上輸入ip addr或ifconfig:
· 確定Java 8 JDK的位置,它應該與/ usr / lib / jvm / java-8-openjdk-amd64 /類似或相同。
· 將以下行添加到hadoop-env.sh:
export JAVA_HOME = / usr / lib / jvm / java-8-openjdk-amd64 /
hdfs-site.xml
<configuration> <property> <name>dfs.replication/<name> <value>1/<value> <description>Default block replication./<description> /<property> <property> <name>dfs.name.dir/<name> <value>file:///home/YOUR_USER/hdfs/namenode/<value> /<property> <property> <name>dfs.data.dir/<name> <value>file:///home/YOUR_USER/hdfs/datanode/<value> /<property>/<configuration>
dfs.replication:要在其上覆制數據的節點數。
dfs.name.dir:namenode塊的目錄
dfs.data.dir:數據節點塊的目錄
mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name/<name> <value>yarn/<value> /<property> <property> <name>mapreduce.jobtracker.address/<name> <value>localhost:54311/<value> /<property> <property> <name>yarn.app.mapreduce.am.env/<name> <value>HADOOP_MAPRED_HOME=$HADOOP_MAPRED_HOME/<value> /<property> <property> <name>mapreduce.map.env/<name> <value>HADOOP_MAPRED_HOME=$HADOOP_MAPRED_HOME/<value> /<property> <property> <name>mapreduce.reduce.env/<name> <value>HADOOP_MAPRED_HOME=$HADOOP_MAPRED_HOME/<value> /<property> <property> <name>mapreduce.map.memory.mb/<name> <value>4096/<value> /<property> <property> <name>mapreduce.reduce.memory.mb/<name> <value>4096/<value> /<property>/<configuration>
mapreduce.framework.name:用於執行MapReduce作業的運行時框架。 可以是本地,經典或毛線之一。
mapreduce.jobtracker.address:MapReduce作業跟蹤程序運行的主機和端口。 如果是"本地",則作業將作為單個映射在流程中運行,並減少任務。
yarn.app.mapreduce.am.env:紗線圖減少env變量。
mapreduce.map.env:Map reduce map env變量。
mapreduce.reduce.env:映射減少reduce env變量。
mapreduce.map.memory.mb:Hadoop允許分配給映射器的內存上限,以兆字節為單位。 默認值為512。
mapreduce.reduce.memory.mb:Hadoop允許分配給減速器的內存上限,以兆字節為單位。 默認值為512。
yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname/<name> <value>localhost/<value> /<property> <property> <name>yarn.nodemanager.aux-services/<name> <value>mapreduce_shuffle/<value> /<property> <property> <name>yarn.nodemanager.resource.memory-mb/<name> <value>16256/<value> /<property> <property> <name>yarn.app.mapreduce.am.resource.mb/<name> <value>4096/<value> /<property> <property> <name>yarn.scheduler.minimum-allocation-mb/<name> <value>4096/<value> /<property>/<configuration>
yarn.resourcemanager.hostname:RM的主機名。 也可以是遠程yarn實例的ip地址。
yarn.nodemanager.aux-services:選擇需要設置的隨機播放服務以運行MapReduce。
yarn.nodemanager.resource.memory-mb:可以分配給容器的物理內存量(以MB為單位)。 供參考,我的計算機上有64GB的RAM。 如果此值太低,您將無法處理大文件,並出現FileSegmentManagedBuffer錯誤。
yarn.app.mapreduce.am.resource.mb:此屬性指定為特定作業選擇資源的條件。 任何具有相等或更多可用內存的節點管理器都將被選擇執行作業。
yarn.scheduler.minimum-allocation-mb:RM上每個容器請求的最小分配,以MB為單位。 低於此數量的內存請求將不會生效,並且指定的值將被分配到最少。
啟動Hadoop
在開始Hadoop之前,我們必須格式化namenode:
hdfs namenode-格式
現在,我們很好地開始了Hadoop! 運行以下命令:
start-dfs.shstart-yarn.sh
為確保一切已開始,請運行以下命令:
ss -ln | grep 9000
運行jps
現在,您還可以通過http:// localhost:9870訪問Hadoop Web UI。
您還可以通過localhost:8088訪問Yarn Web UI。
第5步-設置配置單元
現在我們已經建立並運行了Hadoop,讓我們在其之上安裝Hive。
首先,讓我們在Hadoop中創建一個目錄,將其存儲在我們的Hive表中。
hdfs dfs -mkdir -p /用戶/配置單元/倉庫
配置權限。
hdfs dfs -chmod -R a + rw / user / hive
設置一個元存儲
Hive Metastore是Hive元數據的中央存儲庫。 它存儲Hive表和關係(方案和位置等)的元數據。 它通過使用metastore服務API提供客戶端對此信息的訪問。 有3種不同類型的元存儲庫:
· 嵌入式Metastore:一次只能打開一個Hive會話。
· 本地Metastore:多個Hive會話,必須連接到外部數據庫。
· 遠程Metastore:多個Hive會話,使用Thrift API與Metastore進行交互,具有更好的安全性和可伸縮性。
要詳細瞭解每種類型的元存儲之間的區別,這是一個很好的鏈接。
在本指南中,我們將使用MySQL數據庫設置遠程元存儲。
sudo apt updatesudo apt install mysql-server
sudo mysql_secure_installation
運行以下命令:
sudo mysql
CREATE DATABASE metastore;
CREATE USER 'hive'@'%' IDENTIFIED BY 'PW_FOR_HIVE';
GRANT ALL ON metastore.* TO 'hive'@'%' WITH GRANT OPTION;
將PW_FOR_HIVE替換為您要在MySQL中為配置單元用戶使用的密碼。
下載MySQL Java連接器:
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.tar.gz
tar -xzvf mysql-connector-java-8.0.19.tar.gz
cd mysql-connect-java-8.0.19
cp mysql-connector-java-8.0.19.jar /opt/hive/lib/
現在編輯/opt/hive/conf/hive-site.xml:
<configuration> <property> <name>javax.jdo.option.ConnectionURL/<name> <value>jdbc:mysql://YOUR_IP:3306/metastore?createDatabaseIfNotExist=true&useLegacyDatetimeCode=false&serverTimezone=UTC/<value> <description>metadata is stored in a MySQL server/<description> /<property> <property> <name>javax.jdo.option.ConnectionDriverName/<name> <value>com.mysql.jdbc.Driver/<value> <description>MySQL JDBC driver class/<description> /<property> <property> <name>javax.jdo.option.ConnectionUserName/<name> <value>hive/<value> <description>user name for connecting to mysql server/<description> /<property> <property> <name>javax.jdo.option.ConnectionPassword/<name> <value>PW_FOR_HIVE/<value> <description>password for connecting to mysql server/<description> /<property>/<configuration>
用本地IP地址替換YOUR_IP。 將PW_FOR_HIVE替換為您先前為hive用戶啟動的密碼。
初始化架構
現在,讓您可以從網絡上的任何地方訪問MySQL。
nano /etc/mysql/mysql.conf.d/mysqld.cnf
將綁定地址更改為0.0.0.0。
重新啟動服務以使更改生效:sudo systemctl restart mysql.service
最後,運行schematool -dbType mysql -initSchema來初始化metastore數據庫中的模式。
啟動Hive Metastore
Hive-服務元存儲
測試配置單元
首先通過調用hive從命令行啟動Hive。
讓我們創建一個測試表:
CREATE TABLE IF NOT EXISTS test_table (col1 int COMMENT 'Integer Column', col2 string COMMENT 'String Column') COMMENT 'This is test table' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
然後插入一些測試數據。
INSERT INTO test_table VALUES(1,'testing');
然後,我們可以從表中查看數據。
SELECT * FROM test_table;
第6步-設置Spark
Spark是通用分佈式數據處理引擎,適用於多種情況。 在Spark核心數據處理引擎之上,還有用於SQL,機器學習,圖形計算和流處理的庫,它們可以在應用程序中一起使用。 在本教程中,我們將使用Docker設置一個獨立的Spark集群,並使其能夠增加任意數量的工作人員。 這背後的原因是我們要模擬一個遠程集群及其所需的一些配置。
在生產環境中,通常將Spark配置為使用Yarn和已分配給Hadoop的資源。
首先,我們需要創建Docker文件。 在本教程中,我們將使用Spark版本2.4.4,但如果您想要最新版本,則可以將其更改為2.4.5,它也隨Hadoop 2.7一起提供,以管理節點之間的持久性和簿記。 在生產環境中,Spark通常配置有Yarn以使用現有的Hadoop環境和資源,因為我們只有一個節點上有Hadoop,所以我們將運行一個獨立的Spark集群。 要將Spark配置為與Yarn一起運行,需要進行最小的更改,您可以在此處看到設置的差異。
設置獨立群集
納米Dockerfile
# DockerfileFROM python:3.7-alpineARG SPARK_VERSION=2.4.4ARG HADOOP_VERSION=2.7RUN wget -q https://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \\ && tar xzf spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz -C / \\ && rm spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \\ && ln -s /spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION} /sparkRUN apk add shell coreutils procpsRUN apk fetch openjdk8RUN apk add openjdk8RUN pip3 install ipythonENV PYSPARK_DRIVER_PYTHON ipython
現在,我們想啟動一個Spark主機和N個Spark工作者。 為此,我們將使用docker-compose。nano docker-compose.yml
version: "3.3"networks: spark-network:services: spark-master: build: . container_name: spark-master hostname: spark-master command: > /bin/sh -c ' /spark/sbin/start-master.sh && tail -f /spark/logs/*' ports: - 8080:8080 - 7077:7077 networks: - spark-network spark-worker: build: . depends_on: - spark-master command: > /bin/sh -c ' /spark/sbin/start-slave.sh $$SPARK_MASTER && tail -f /spark/logs/*' env_file: - spark-worker.env environment: - SPARK_MASTER=spark://spark-master:7077 - SPARK_WORKER_WEBUI_PORT=8080 ports: - 8080 networks: - spark-network
對於主容器,我們為應用程序公開端口7077,為Spark作業UI公開端口8080。 對於工人,我們正在通過環境變量連接到我們的Spark master。
有關配置spark worker的更多選項,我們將它們添加到spark-worker.env文件中。
nano spark_worker
SPARK_WORKER_CORES=3SPARK_WORKER_MEMORY=8G
在此配置中,每個工作人員將使用3個內核並具有8GB的內存。 由於我的計算機具有6個核心,因此我們將啟動2個工作線程。 我建議將其更改為與您的計算機相關的值。有關完整的環境變量列表以及獨立模式下的信息,您可以在此處閱讀完整的文檔。 如果您想知道執行程序的存儲空間,可以為每個應用程序設置,並在提交或啟動應用程序時完成。
docker-compose build
docker-compose up -d --scale spark-worker=2
現在spark已啟動並正在運行,您可以在localhost:8080上查看Web UI!
在本地安裝Spark
在您的本地計算機或將要創建或使用Spark的任何計算機上,都需要安裝Spark,並且由於我們要將其配置為基於Hadoop / Hive構建,因此我們必須從源代碼下載它。 在本教程中,我們將使用PySpark,而我的家庭項目中則主要使用Python。
您可以從此處下載Spark。
確保下載與主服務器上安裝的版本相同的版本。 在本教程中,其版本為2.4.4
wget https://archive.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgztar -C /opt -xzvf spark-2.4.4-bin-hadoop2.7.tgz
設置Spark環境變量nano〜/ .bashrc
export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
export PYSPARK_PYTHON=python3
如果您喜歡Jupyter Lab,請將PYSPARK_DRIVER_PYTHON_OPTS的"筆記本"更改為"實驗室"。
配置文件
要配置Spark以使用我們的Hadoop和Hive,我們需要在Spark config文件夾中同時擁有兩個配置文件。
cp $HADOOP_HOME/etc/hadoop/core-site.xml /opt/spark/conf/cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml /opt/spark/conf/
nano /opt/spark/conf/hive-site.xml
<configuration> <property> <name>hive.metastore.uris/<name> <value>thrift://YOUR_IP:9083/<value> /<property> <property> <name>spark.sql.warehouse.dir/<name> <value>hdfs://YOUR_IP:9000/user/hive/warehouse/<value> /<property>/<configuration>
hive.metastore.uris:告訴Spark使用Thrift API與Hive Metastore進行交互。 spark.sql.warehouse.dir:告訴Spark我們的Hive表在HDFS中的位置。
安裝PySpark
pip3 install pyspark == 2.4.4或將2.4.4替換為您在spark master上安裝的任何版本。
要運行PySpark連接到我們的分佈式集群,請運行:
pyspark –master spark:// localhost:7077,您也可以將localhost替換為您的IP或遠程IP。
這將啟動預定義了Spark上下文的Jupyter Notebook。 現在,您有一個環境可以運行Spark應用程序和分析以及正常的非分佈式應用程序和分析。
默認情況下,執行程序內存僅為〜1GB(1024mb),要增加內存,請使用以下命令啟動pyspark:
pyspark –master spark:// localhost:7077 –executor-memory 7g
Spark中每個執行器的開銷為10%,因此我們最多可以分配7200mb,但是為了安全起見,我們將舍入數取為7。
測試整合
默認情況下,會自動創建一個SparkContext,變量為sc。
從以前創建的配置單元表中讀取。
from pyspark.sql import Hive
Contexthc = HiveContext(sc)
hc.sql("show tables").show()
hc.sql("select * from test_table").show()
要從Hadoop讀取文件,命令為:
sparksession = SparkSession.builder.appName("example-pyspark-read-and-write").getOrCreate()
df = (sparksession .read .format("csv") .option("header", "true") .load("hdfs://YOUR_IP:9000/PATH_TO_FILE"))
反饋
我鼓勵所有有關此職位的反饋。 您可以給我發電子郵件[email protected]或在帖子上發表評論,如果您有任何疑問或需要任何幫助。
您也可以通過@ashtonasidhu與我聯繫並在Twitter上關注我。
(本文翻譯自Ashton Sidhu的文章《Tutorial: Building your Own Big Data Infrastructure for Data Science》,參考:https://towardsdatascience.com/tutorial-building-your-own-big-data-infrastructure-for-data-science-579ae46880d8)
閱讀更多 聞數起舞 的文章