想用 CDH 大禮包,於是先在 Mac 上和 Centos7.4 上分別搞個了單機的測試用。其實操作的流和使用到的命令差不多就一並說了:
首先前往官方下載包:
https://www.cloudera.com/downloads/quickstart_vms/5-13.html
如果使用 mac 並且安裝 docker。 我們可以很輕松的使用 kitematic 來獲取最新版本的 cloudera docker 鏡像。只需要搜 cloudera/quickstar 即可這是地址:
https://hub.docker.com/r/cloudera/quickstart/
當我們下載好鏡像之后就可以愉快的將進行加載起來。macos 基本是全程無腦,linux 稍微麻煩一點使用
docker import cloudera-quickstart-vm-5.13.0-0-beta-docker.tar
將鏡像 import 進來。
然后使用命令啟動就可以了。
Cloudera 的 docker 版本分成兩部分啟動。一方面是大禮包的啟動 /usr/bin/docker-quickstart,一方面是 Cloudera manager 本身的啟動 /home/cloudera/cloudera-manager
這里我們使用命令
docker run --name cdh --hostname=quickstart.cloudera --privileged=true -t -i -p 8020:8020 -p 8022:8022 -p 7180:7180 -p 21050:21050 -p 50070:50070 -p 50075:50075 -p 50010:50010 -p 50020:50020 -p 8890:8890 -p 60010:60010 -p 10002:10002 -p 25010:25010 -p 25020:25020 -p 18088:18088 -p 8088:8088 -p 19888:19888 -p 7187:7187 -p 11000:11000 cloudera/quickstart /bin/bash -c '/usr/bin/docker-quickstart && /home/cloudera/cloudera-manager --express && service ntpd start'
直接啟動兩個程序。這里注意參數都可以從下面 refrence 查詢到大概是什么意思,合理之所以要寫這么多端口映射也是為了方便我們外面的機器可以方面的訪問 docker 內部的這些端口,訪問這些服務。 Cloudera 本身的 manager 是 7180 端口。當這些啟動起來之后就可以訪問目標機器 ip 的 7180 端口訪問 Cloudera manager 了。
上圖就是一個 dashbord 的樣子。另外在 linux 機器有一個地方需要注意的是,可能你的 docker 用上面命令起起來之后,docker 內的實例沒有辦法訪問外網,這里我們配置一下 docker 創建容器時候的參數增加 -net host 即可。也可以在宿主機器上在 /etc/default/docker 文件。並且配置上 DOCKER_OPTS="--dns host_ip" 即可。
從上圖我們還可以注意到另外一個問題,除了主機和 manager 都沒有啟動。在 Cloudera 大禮包中,只有 hue 和 manager 本身是什么服務都不依賴的可以在任何時候選擇啟動和關閉。其他的應用多多少少存在着一些啟動順序上的依賴這個要注意。
現在我們來啟動幾個我們關心的服務,我們先來啟動 HDFS。
這里我已經把它啟動起來了當沒有啟動的時候點擊 start cm(Cloudera manager) 就會把這個給啟動起來。
點一下已經啟動起來的 HDFS 就會到這個應用的 dashborad cm 給我們提供了非常多的圖表以及面板可以關注目前機器和集群的情況如下圖:
目前看到的都是單節點的情況。讓我意外的是啟動的時候竟然還會有 Canary 模式。在這個界面點擊右上角的 NameNode Web UI 就可以看到老板我們熟悉的
社區版的 HDFS 界面了。比較方便的是當我們點擊 Configuration 就可以進到 HDFS 的一些配置包括塊大小之類的配置這里都可以方便設置。
可以看到這一套東西真的是把能包好的東西都已經給我們列出來了。
我暫時在單機上面啟了兩個 app 一個 HDFS 一個 Spark ,內存基本被打到了 5個G. 可以看出來其實 CDH 大禮包其實還是非常吃內存的。當我們在進行線上環境配置的
時候占用的資源肯定是只增不減。這里拋磚引玉了一個 app 接下來大家可以按照這個方法繼續探索。
既然 HDFS 已經啟動讓我們來嘗試使用 python 來操作一下 HDFS
pip install hdfs 安裝 hdfscli 包
from hdfs.client import Client client = Client("http://127.0.0.1:50070", root="/", timeout=100) print(client.list("/")) client.upload("/", "/Users/piperck/Desktop/About_me/dragen.wma")
可以看到我們可以直接創建連接,client.list 是列出 HDFS 目前根目錄的情況。 下面我們調用 client.upload 上傳文件。
上傳文件的時候可能遇到很多問題,因為我們這里使用的是 docker 搭建的 CDH ,所以一般會報這個錯誤:
('<requests.packages.urllib3.connection.HTTPConnection object at 0x00000000043A3FD0>: Failed to establish a new connection: [Errno 11004] getaddrinfo failed',))
這個時候我們需要去 docker 里面 hostname 一下會得到 quickstart.cloudera。我用的 macos 所以把這個直接配置進我電腦的 /etc/hosts 里。
127.0.0.1 quickstart.cloudera
否則,永遠報錯。。這里搞了非常久需要注意一下。
之后繼續嘗試連接,應該還會報另外一個錯誤:
Permission denied: user=root, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x
很明顯權限問題,因為我們並沒有登陸而且在本地使用的權限也不明。755 的權限導致我們無法上傳文件,這里的 root 權限是 hdfs 用戶,所以會失敗
這里有兩個辦法可以解決這個問題:
1. 調整 hdfs 的權限檢查將
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
設置為 False 關閉權限檢查。
2. 增加一個由這個用戶創建的文件夾在根目錄,然后將文件往那里面傳就可以了。
現在我們再將傳上去的文件下載回來:
from hdfs.client import Client client = Client("http://127.0.0.1:50070", root="/", timeout=100) print(client.list("/")) client.download("/dragen.wma", "/Users/piperck/Desktop")
很輕松成功了,沒有再出什么幺蛾子。
Reference:
https://www.cloudera.com/documentation/enterprise/5-15-x/topics/quickstart_docker_container.html ---docker 安裝啟動文檔
https://www.cloudera.com/documentation/enterprise/5-15-x/topics/cm_mc_start_stop_service.html#cmug_topic_5_6 ---啟動 hdfs 服務教程
https://blog.csdn.net/g11d111/article/details/72902112
https://dxysun.com/2018/07/19/hadoopForPythonHdfs/ PYTHONHDFS 使用教程
https://blog.csdn.net/Gamer_gyt/article/details/52446757 使用python的hdfs包操作分布式文件系統(HDFS)
https://segmentfault.com/a/1190000002672666 hadoop 常用文件的操作命令